К предыдущему посту было написано достаточно много полезных комментариев и один из них представляет собой очень достойный чек-лист от Андрея по разбору инцидентов.
Что делать если все сломалось? 👇
https://blog.bashdays.ru/сhto_delat_esli_vse_slomalos/
Что делать если все сломалось? 👇
https://blog.bashdays.ru/сhto_delat_esli_vse_slomalos/
Когда в Bash ты сравниваешь две переменные, важно не проебаться с кавычками.
В этом примере если переменная
Логично вылезет ошибка, потому что «=» ожидает два значения. Чтобы избежать этой ситуации, на помощь приходят — кавычки.
Теперь всё в поряде. Ошибки никакой нет.
Но Bash не пальцем деланный, поэтом сравнить две переменные можно иначе.
Теперь кавычки нахуй не нужны. Но опять же если в переменной будут спецсимволы, то тебя ожидают грабли.
Есть еще легаси способ:
В современном мире ты вряд ли с ним столкнешься, но в каких-то допотопных скриптах вполне можешь найти.
Если
А с
А если сделать так:
Получишь ошибку:
Все это справедливо для Bash. Если пишешь под sh, то твой путь это одинарные скобки
ㅤ
А еще в двойных скобках можно использовать шаблоны:
Вернёт
Либо написать сложное условие:
В одинарных кавычках это выглядело бы так:
Выводы:
Всё что тебе нужно знать это первые два способа:
Это трувей, бестпрактика и мастхев.
Изучай.
tags: #bash #badpractices #bestpractices
—
🔔 @bashdays➡️ @gitgate
[ $foo = "bar" ]
В этом примере если переменная
$foo будет пустой, то по итогу ты попадешь в просак:[ = "bar" ]
bash: [: =: unary operator expected
Логично вылезет ошибка, потому что «=» ожидает два значения. Чтобы избежать этой ситуации, на помощь приходят — кавычки.
[ "$foo" = "bar" ]
Теперь всё в поряде. Ошибки никакой нет.
Но Bash не пальцем деланный, поэтом сравнить две переменные можно иначе.
[[ $foo == bar ]]
Теперь кавычки нахуй не нужны. Но опять же если в переменной будут спецсимволы, то тебя ожидают грабли.
Есть еще легаси способ:
[ x"$foo" = x"bar" ]
В современном мире ты вряд ли с ним столкнешься, но в каких-то допотопных скриптах вполне можешь найти.
Если
$foo пустая, то без x получится:[ = bar ]
А с
x будет:[ x = xbar ]
В [[ ... ]] переменные не разделяются на слова, даже если содержат пробелы.
foo="hello bashdays"
[[ $foo = "hello bashdays" ]]
А если сделать так:
foo="hello bashdays"
[ $foo = "hello bashdays" ]
Получишь ошибку:
bash: [: too many argumentsВсе это справедливо для Bash. Если пишешь под sh, то твой путь это одинарные скобки
[...].ㅤ
А еще в двойных скобках можно использовать шаблоны:
foo="hello bashdays"
[[ $foo == h* ]]
Вернёт
true, потому что foo начинается с «h».Либо написать сложное условие:
[[ $foo = "bar" || $bar = "baz" ]]
В одинарных кавычках это выглядело бы так:
[ "$foo" = "bar" -o "$bar" = "baz" ]
Выводы:
Всё что тебе нужно знать это первые два способа:
[ "$foo" = "bar" ]
[[ $foo == bar ]]
Это трувей, бестпрактика и мастхев.
Изучай.
tags: #bash #badpractices #bestpractices
—
Please open Telegram to view this post
VIEW IN TELEGRAM
Представь что у тебя есть переменная:
И в скрипте мы делаем так:
Это ошибочный вариант, бэд мать его практика.
Команда
ㅤ
НО! Результат этой команды разбивается на части, если в нём есть пробелы.
Например:
Выдаст:
А если так:
Логично, получаем ошибку:
Bash думает что это два отдельных слова, а не один путь.
➡️ Бест-практика
1. Кавычки защищают результат команды от разбиения.
2. И
Как работают кавычки
- Когда Bash видит
- Кавычки внутри
- Кавычки снаружи не объединяются с внутренними.
Наглядно, можно представить так:
Внутренние кавычки
Внешние кавычки
Теперь даже если переменная будет содержать пробелы команда не разобьётся на части.
tags: #bash #badpractices #bestpractices
—
🔔 @bashdays➡️ @gitgate
f="My Documents/file.txt"
И в скрипте мы делаем так:
cd $(dirname "$f")
Это ошибочный вариант, бэд мать его практика.
Команда
cd $(dirname "$f") должна вернуть путь к папке, где лежит файл.ㅤ
НО! Результат этой команды разбивается на части, если в нём есть пробелы.
Например:
dirname "My Documents/file.txt"
Выдаст:
My DocumentsА если так:
cd My Documents
Логично, получаем ошибку:
cd: No such file or directory: MyBash думает что это два отдельных слова, а не один путь.
cd -P -- "$(dirname -- "$f")"
1. Кавычки защищают результат команды от разбиения.
2. И
cd получит целый путь, даже если в нём есть пробелы.Как работают кавычки
- Когда Bash видит
$(...), он воспринимает это как отдельную область, некий «уровень».- Кавычки внутри
$(...) работают только внутри.- Кавычки снаружи не объединяются с внутренними.
Наглядно, можно представить так:
cd "$( dirname "$f" )"
Внутренние кавычки
"$f" защищают переменную fВнешние кавычки
"" защищают результат dirname "$f"Теперь даже если переменная будет содержать пробелы команда не разобьётся на части.
tags: #bash #badpractices #bestpractices
—
Please open Telegram to view this post
VIEW IN TELEGRAM
Представь, что у тебя есть две коробки. На одной написано «хуи дрочёны», а на другой «пики точены».
Ты хочешь проверить:
ㅤ
— В первой коробке хуи?
— Во второй коробке пики?
Если оба условия верны, ты говоришь — заебись!.
Бэд практика:
Тут
Бест-практика:
Разделяем на две проверки:
Сначала проверяется первое условие, затем второе.
Если оба верны — команда выполнится.
Либо делаем конкретно под Bash:
Здесь можно использовать
Выводы:
Если используешь
Если
tags: #bash #badpractices #bestpractices
—
🔔 @bashdays➡️ @gitgate
Ты хочешь проверить:
ㅤ
— В первой коробке хуи?
— Во второй коробке пики?
Если оба условия верны, ты говоришь — заебись!.
Бэд практика:
[ "хуи" = "коробка1" -a "пики" = "коробка2" ]
Тут
-a (И) считается устаревшим и в некоторых случаях это работать не будет. Так что если такое видишь или пишешь, сразу сноси, это хуйня!Одна из проблем с [ A = B -a C = D ] (или -o) в том, что POSIX не определяет, как должна работать команда [ ... ], если у неё больше 4 аргументов.
Бест-практика:
Разделяем на две проверки:
[ "коробка1" = "хуи" ] && [ "коробка2" = "пики" ]
Сначала проверяется первое условие, затем второе.
Если оба верны — команда выполнится.
Либо делаем конкретно под Bash:
[[ "коробка1" = "хуи" && "коробка2" = "пики" ]]
Здесь можно использовать
&&, всё будет работать правильно.Выводы:
Если используешь
[ ... ], то делай две отдельные проверки.Если
[[ ... ]], то можно писать всё внутри.tags: #bash #badpractices #bestpractices
—
Please open Telegram to view this post
VIEW IN TELEGRAM
Если написать так
ㅤ
Двойные скобки
➡️ Бест-практика
А если хочется прям строго соответствовать POSIX, делай так:
Теперь давай разберемся почему с
Символ
В
Еще пример:
Если
Код выше проверяет, является ли переменная
Выводы: для работы с числами используем
tags: #bash #badpractices #bestpractices
—
🔔 @bashdays➡️ @gitgate
[[ $foo > 7 ]], то далеко не факт что это правильно отработает.ㅤ
Двойные скобки
[[ ... ]] в Bash предназначен для проверки условий, но не для работы с числами. Для чисел лучше хуячить (( ... )).(( foo > 7 ))
А если хочется прям строго соответствовать POSIX, делай так:
[ "$foo" -gt 7 ]
Теперь давай разберемся почему с
[[ $foo > 7 ]] словишь ошибку.Символ
> в [[ ... ]] сравнивает строки, а не числа. Например, "10" < "7", потому что 1 идёт раньше 7 в алфавите.В
[...] символ > вообще означает «перенаправление вывода», и создаст файл с именем 7 в текущей папке.Еще пример:
case $foo in
("" | *[!0123456789]*) echo "Ошибка: foo не число!" && exit 1 ;;
*) [ "$foo" -gt 7 ] ;;
esac
Если
$foo содержит что-то вроде $(rm -rf /), то при определённых условиях это может привести к пиздецу. Поэтому перед проверкой лучше убедиться, что $foo — это число.Код выше проверяет, является ли переменная
$foo числом, и если да, сравнивает её с 7.case $foo in — конструкция для проверки значений переменной $foo по шаблонам.
"" — пустая строка (если $foo пустое).
("" | *[!0123456789]*) — строка, содержащая хотя бы один символ, который не цифра (например, abc, 12a3).
Если условие выполняется, выводится сообщение "Ошибка: foo не число!", и скрипт завершает работу с кодом 1 (exit 1).
* — означает «всё остальное» (то есть, если $foo не попал под первый шаблон).
[ "$foo" -gt 7 ] — проверяет, больше ли $foo чем 7.
Выводы: для работы с числами используем
(( ... )) или [ "$foo" -gt 7 ], а переменные перед проверкой лучше очищать от лишних символов.tags: #bash #badpractices #bestpractices
—
Please open Telegram to view this post
VIEW IN TELEGRAM
Продолжаем делать правильно.
ㅤ
Этот код выглядит вполне нормально:
Он считает, сколько строк в файле
Здесь главная проблема — переменная
Если простым языком: Каждая часть, разделённая
Этот код вернет 0, несмотря на
Как быть?
Первый вариант:
Эта штука говорит интерпретатору — что последний элемент конвейера будет выполнен в окружении текущей оболочки.
Второй вариант:
Вообще избавиться от
Можно еще наколхозить и передавать значения через временный файл, но это прям пиздец шляпа и костыль.
Выводы
Нужно просто посчитать строки:
Нужно обрабатывать строки:
Хочешь использовать pipe:
Вот и вся наука.
tags: #bash #badpractices #bestpractices
—
🔔 @bashdays➡️ @gitgate
ㅤ
Этот код выглядит вполне нормально:
grep foo bar.txt | while read -r; do ((count++)); done
Он считает, сколько строк в файле
bar.txt содержат слово foo.Здесь главная проблема — переменная
count не изменится вне цикла while, потому что в Bash каждая команда в пайплайне (|) запускается в отдельной оболочке (subshell). То есть count++ происходит «внутри», и снаружи этого не видно.Если простым языком: Каждая часть, разделённая
|, запускается в отдельной «коробке» (subshell). То есть while работает внутри своей коробки. B всё что там происходит, не видно снаружи.Некоторые оболочки ksh93 или Bash с включённой настройкой shopt -s lastpipe работают по-другому — цикл выполняется в той же оболочке, и тогда count изменится.
count=0
echo -e "one\ntwo\nthree" | while read line; do ((count++)); done
echo $count
Этот код вернет 0, несмотря на
count++, а вот например в zsh вернется 3.Как быть?
Первый вариант:
shopt -s lastpipe
Эта штука говорит интерпретатору — что последний элемент конвейера будет выполнен в окружении текущей оболочки.
Второй вариант:
Вообще избавиться от
while и всё сделать через grep:count=$(grep -c foo bar)
echo $count
Можно еще наколхозить и передавать значения через временный файл, но это прям пиздец шляпа и костыль.
Выводы
Нужно просто посчитать строки:
count=$(grep -c foo bar)
Нужно обрабатывать строки:
while read line; do ...; done < bar
Хочешь использовать pipe:
shopt -s lastpipe
Вот и вся наука.
tags: #bash #badpractices #bestpractices
—
Please open Telegram to view this post
VIEW IN TELEGRAM
Вот те на!
Большинство думает, что
ㅤ
В Bash
Скобка
Команда выше напечатает
Теперь о главном
Если хочешь использовать
Плохая практика:
Внутри
Хорошая практика:
Если
И Всё работает как надо, без лишних скобок!
Выводы
Никогда не пиши
Пиши просто
tags: #bash #badpractices #bestpractices
—
🔔 @bashdays➡️ @gitgate
if [ false ]; then echo "HELP"; fi
Большинство думает, что
[ — это часть команды if как скобки в других языках программирования. Но нихуя!ㅤ
В Bash
if просто запускает команду. Команда [ ... ] — это обычный бинарник, аналогично команде test, а не специальный синтаксис. Скобка
] нужна только для красоты и завершения команды [.Команда выше напечатает
HELP, потому что строка "false" — непустая, а значит, условие считается истинным.Теперь о главном
Если хочешь использовать
grep в if, не надо писать скобки!Плохая практика:
if [ grep -q "foo" myfile ]; then
echo "Найдено!"
fi
[... ] — ожидает условие, а не командуgrep — это команда, а не логическое выражениеВнутри
[ запускать команды нельзя — это приведёт к ошибкеХорошая практика:
if grep -q "foo" myfile; then
echo "Найдено!"
fi
if просто запускает grepЕсли
grep нашёл совпадение, он вернёт 0 (успех), и выполнится thenИ Всё работает как надо, без лишних скобок!
[ — это как калькулятор, а grep — это поиск. В калькуляторе искать бесполезно!Выводы
Никогда не пиши
if [ grep ... ] — это ошибка!Пиши просто
if grep ..., чтобы проверить результат команды.if работает с командами. [ — это тоже команда, но не синтаксис.tags: #bash #badpractices #bestpractices
—
Please open Telegram to view this post
VIEW IN TELEGRAM
2 83
С пятницей ребят. Бест-практики по башу уже знатно подзаебали, держись осталось немного, там за дебаг затрем, подкопилось у меня знатной дичи.
ㅤ
Сегодня поделюсь с тобой почему я стал использовать блокировку экрана перед тем как отойти от экрана.
Дело было так. Лет 10 назад я открыл
Кота тревожить не стал, уважительная причина не ходить на работу. Взял ноут и получил в аську 100500 алертов в nagios.
Да, в те времена в тренде были nagios и заббиск. Но заббикс всем казался пиздец сложным, поэтому халявили и втыкали нагиос.
Ну дак вот. Суть.
Когда кот устраивался, он первой лапой нажал на стрелочку вверх, потом еще раз нажал пузаном и на фаталити ёбнул яйцами по Enter.
А в хистори с профилактических выходных оставалась команда
Но опыт был получен.
Вот после этого, я всегда жму
Даже если кот и сын спят, все равно прожимаю эту комбинацию.
Но опять же если открыта консолька с продом, то заранее её еще и сворачиваю, впизду.
Видимо детская травма.
А ты прожимаешь WIN + L / CMD + Q если отходишь от своей рабочей лошадки?
Камон в комменты делиться своими факапами.
tags: #рабочиебудни
—
🔔 @bashdays➡️ @gitgate
ㅤ
Сегодня поделюсь с тобой почему я стал использовать блокировку экрана перед тем как отойти от экрана.
Нет, не от злых черно-шляпных, смысла в этом мало, блокировка тут не решает. Собаку съели.
Дело было так. Лет 10 назад я открыл
putty, подключился к проду и пошел навалить себе кофеёв с печенькой. Навалил. Вернулся. На клавиатуре мило устроился кот.Кота тревожить не стал, уважительная причина не ходить на работу. Взял ноут и получил в аську 100500 алертов в nagios.
Да, в те времена в тренде были nagios и заббиск. Но заббикс всем казался пиздец сложным, поэтому халявили и втыкали нагиос.
Ну дак вот. Суть.
Когда кот устраивался, он первой лапой нажал на стрелочку вверх, потом еще раз нажал пузаном и на фаталити ёбнул яйцами по Enter.
Ему то чё, он хуй за мясо не считает.
А в хистори с профилактических выходных оставалась команда
shutdown -h now, до которой добрался кот и успешно её исполнил.В те времена мелкий бизнес особо за аптайм не переживал и ретроспективы только зарождались, в жопы не ебали.
Но опыт был получен.
Звучит как сказка, но такие сказки со мной постоянно приключаются, коллеги соврать не дадут.
Вот после этого, я всегда жму
WIN + L или CMD + Q.Даже если кот и сын спят, все равно прожимаю эту комбинацию.
Но опять же если открыта консолька с продом, то заранее её еще и сворачиваю, впизду.
Видимо детская травма.
А ты прожимаешь WIN + L / CMD + Q если отходишь от своей рабочей лошадки?
Камон в комменты делиться своими факапами.
tags: #рабочиебудни
—
Please open Telegram to view this post
VIEW IN TELEGRAM
Привет, один из наших подписчиков попросил анонсировать его пепяку. Она уже пролетала в gitgate, но ничего страшного, пусть и тут полежит. Тем более штука маст-хэвная.
Если кратко,
ㅤ
Ты скажешь — блядь, да есть же например tfenv и asdf, зачем очередной велосипед?
Во-первых, автора
Ну и, во-вторых, все эти утилиты не поддерживают OpenTofu, Terragrunt и т.п. К тому же, требуют много консольных костылей/зависимостей и хуёва работают НЕ на Linux.
Установка:
Сейчас лично потыкал, всё работает как часики. После установки запускаем
НО, так как хашикорпы — письки (
В общем рекомендую потыкать и поддержать проект звездами. Годнота!
➡️ Страница проекта и документация
tags: #utilites #devops
—
🔔 @bashdays➡️ @gitgate
TENV Ёпта!Если кратко,
TENV это консольный менеджер для управления версиями Terraform, Terragrunt, OpenTofu, Atmos.ㅤ
TENV написан на гошке, не требует дополнительных зависимостей и может быть запущен под любой операционкой. Удобно чё.Ты скажешь — блядь, да есть же например tfenv и asdf, зачем очередной велосипед?
Во-первых, автора
TENV зовут Александр, а не «Аннадурай Сатьямурти Чидамбарампиллаи». А это уже о чем-то говорит!Ну и, во-вторых, все эти утилиты не поддерживают OpenTofu, Terragrunt и т.п. К тому же, требуют много консольных костылей/зависимостей и хуёва работают НЕ на Linux.
asdf не поддерживает автоматическое переключение версий на базе спецификации версии Terraform / OpenTofu внутри проекта с помощью HCL файлов. В целом, asdf скорее переключалка по запросу, а tenv более заточен под OpenTofu/Terraform проекты.
Установка:
LATEST_VERSION=$(curl --silent https://api.github.com/repos/tofuutils/tenv/releases/latest | jq -r .tag_name)
curl -O -L "https://github.com/tofuutils/tenv/releases/latest/download/tenv_${LATEST_VERSION}_amd64.deb"
sudo dpkg -i "tenv_${LATEST_VERSION}_amd64.deb"
Сейчас лично потыкал, всё работает как часики. После установки запускаем
tenv, выбираем из списка (стрелочками и на пробел) что установить и жмем ENTER.НО, так как хашикорпы — письки (
This content is not currently available in your region), в РФ надо трафик прогнать через одно место, чтобы вытащить бинари терраформа.Вот тут я бы пожелал автору добавить киллер-фичу, сделать чтобы tenv обращался к таким заблокированным серверам не самостоятельно, а например через какую-то прокладку. Тогда сука цены бы не было!
Александр, добавь для нас такую возможность, буду прям лично твоей штукой пользоваться, достаточно удобно!
В общем рекомендую потыкать и поддержать проект звездами. Годнота!
tags: #utilites #devops
—
Please open Telegram to view this post
VIEW IN TELEGRAM
Позволил себе пару дней ничего не делать, кроме конечно проверки LF домашек. Лежал, исследовал дырки в axiom verge, гулял. Мне понравилось!
ㅤ
Буду почаще практиковать. Но есть и жирный минус, сегодня пришлось себя прям заставлять что-то сделать по работе. К хорошему привыкаешь быстро.
Ладно, лирика. Давай дальше бест-практики тыкать.
Команда
Тут самое важно это — пробелы, про кавычки повторять не буду, ты это уже и так знаешь. Все уши тебе прожужал.
Неправильно:
1. Нельзя слеплять всё вместе. Это хуёва даже в плане кодстайла.
2. Нет пробела вокруг знака «=».
3. Аналогично, всё слеплено.
Правильный синтаксис:
или
Почему?
Потому что
Главное правило — всегда ставь пробелы между каждым элементом в условии.
tags: #bash #badpractices #bestpractices
—
🔔 @bashdays➡️ @gitgate
ㅤ
Буду почаще практиковать. Но есть и жирный минус, сегодня пришлось себя прям заставлять что-то сделать по работе. К хорошему привыкаешь быстро.
Ладно, лирика. Давай дальше бест-практики тыкать.
Команда
if [ bar = "$foo" ]; проверяет, равны ли два значения.Тут самое важно это — пробелы, про кавычки повторять не буду, ты это уже и так знаешь. Все уши тебе прожужал.
Неправильно:
[bar="$foo"]
[ bar="$foo" ]
[[bar="$foo"]]
1. Нельзя слеплять всё вместе. Это хуёва даже в плане кодстайла.
2. Нет пробела вокруг знака «=».
3. Аналогично, всё слеплено.
Правильный синтаксис:
if [ bar = "$foo" ]; then
или
if [[ bar = "$foo" ]]; then
Почему?
Потому что
[, =, ] это отдельные символы, первая скобка вообще команда test. А если ты все слепляешь, Bash посчитает тебя долбаёбом и отправит в пешее эротическое.Главное правило — всегда ставь пробелы между каждым элементом в условии.
tags: #bash #badpractices #bestpractices
—
Please open Telegram to view this post
VIEW IN TELEGRAM
Кругом грабли!
ㅤ
Потребовалось мне сегодня поднять один серверный линукс дистрибутив на базе debian (чуть позже расскажу какой). Задача не тривиальная. Но по итогу как обычно подкинули граблей.
Раньше всегда был уверен, что если сделать машину с параметрами 1 CPU, 512МБ RAM, 5ГБ диск. То debian залетит только в путь.
До сегодняшнего момента. Грузимся с исошника, нажимаем Install и получаем черный экран с мигающим курсором. Ни ошибок, нихуя!
Попробовал и так и сяк, на виртуалку, на proxmox, в облаке. Взял чистый debian, такая же история. Чёрный экран и курсор.
ХМ!!! И тут я вспомнил, что полгода назад ставил ubuntu и она просто висла на выборе часового пояса.
Попробовал с debian иии… это помогло. То есть в какой-то момент всё пошло по пизде и 512 МБ нам теперь мало.
Пошел, почитал требования к debian bookworm и действительно, требуется 1024 МБ. Ну ёб вашу мать!
Ок, будем знать и брать с запасом. На ровном месте какая-то хуйня вечно лезет. Писало быть хоть — долбаёб, у тебя памяти не хватает!
tags: #рабочиебудни
—
🔔 @bashdays➡️ @gitgate
ㅤ
Потребовалось мне сегодня поднять один серверный линукс дистрибутив на базе debian (чуть позже расскажу какой). Задача не тривиальная. Но по итогу как обычно подкинули граблей.
Раньше всегда был уверен, что если сделать машину с параметрами 1 CPU, 512МБ RAM, 5ГБ диск. То debian залетит только в путь.
До сегодняшнего момента. Грузимся с исошника, нажимаем Install и получаем черный экран с мигающим курсором. Ни ошибок, нихуя!
Попробовал и так и сяк, на виртуалку, на proxmox, в облаке. Взял чистый debian, такая же история. Чёрный экран и курсор.
ХМ!!! И тут я вспомнил, что полгода назад ставил ubuntu и она просто висла на выборе часового пояса.
А решил я эту проблему увеличением памяти до 1024 МБ. Причем методом тыка это натыкал, без дебага.
Попробовал с debian иии… это помогло. То есть в какой-то момент всё пошло по пизде и 512 МБ нам теперь мало.
Пошел, почитал требования к debian bookworm и действительно, требуется 1024 МБ. Ну ёб вашу мать!
Ок, будем знать и брать с запасом. На ровном месте какая-то хуйня вечно лезет. Писало быть хоть — долбаёб, у тебя памяти не хватает!
tags: #рабочиебудни
—
Please open Telegram to view this post
VIEW IN TELEGRAM
И снова здравствуйте!
ㅤ
Давно хотел реализовать функцию на Bash, чтобы красиво выводить какие-то значимые уведомления в терминал по типу как это сделано в npm.
Обычное
Хуяк-хуяк и получился очередной ебальник-убивальник.
Всё просто! Передаем тип алерта и сообщение которое нужно выводить в рамке.
А чё, красиво получилось! Забирай себе, глядишь когда-нибудь пригодится.
➡️ Box-drawing characters
tags: #bash
—
🔔 @bashdays➡️ @gitgate
ㅤ
Давно хотел реализовать функцию на Bash, чтобы красиво выводить какие-то значимые уведомления в терминал по типу как это сделано в npm.
Обычное
echo уже не возбуждает, ничего не поделаешь. Да и всякие Gum тоже ставить не хочется.Хуяк-хуяк и получился очередной ебальник-убивальник.
#!/bin/bash
bashdays_box() {
local headertext="$1"
local message="$2"
local white=$'\e[38;5;007m'
local reset=$'\e[0m'
local color
case "$headertext" in
INFO) color=$'\e[38;5;39m' ;;
OK) color=$'\e[38;5;34m' ;;
DONE) color=$'\e[38;5;34m' ;;
WARN) color=$'\e[38;5;214m' ;;
ERROR) color=$'\e[38;5;196m' ;;
DEBUG) color=$'\e[38;5;244m' ;;
TASK) color=$'\e[38;5;141m' ;;
NOTE) color=$'\e[38;5;45m' ;;
*) color=$'\e[38;5;244m' ;;
esac
local headerpadding=$(( ${#message} - ${#headertext} ))
local header=${message:0:headerpadding}
echo -e "\n${color}╭ ${headertext} ${header//?/─}────╮" \
"\n│ ${message//?/ } │" \
"\n│ ${white}${message}${color} │" \
"\n│ ${message//?/ } │" \
"\n╰──${message//?/─}────╯${reset}"
}
bashdays_box "INFO" "Hello from https://t.iss.one/bashdays"
bashdays_box "ERROR" "Swap is enabled — this may affect performance"
bashdays_box "WARN" "Certificate expires in 5 days"
bashdays_box "DEBUG" "Using config file: /etc/myapp/config.yml"
bashdays_box "DONE" "All services started"
Всё просто! Передаем тип алерта и сообщение которое нужно выводить в рамке.
А чё, красиво получилось! Забирай себе, глядишь когда-нибудь пригодится.
tags: #bash
—
Please open Telegram to view this post
VIEW IN TELEGRAM
Привет, очередная халява. Каждый год я отдаю 3 проходки-билета (скидка 100%) на онлайн-конференцию «Подлодка».
Если есть желание посетить сие онлайн-мероприятие, кликай кнопку ниже. В выходные опубликуются результаты. Ну а дальше с вами свяжусь я или Макс и раздадим ништяки. Такие дела!
Условия розыгрыша: подписаться на канал @bashdays и @gitgate
Если есть желание посетить сие онлайн-мероприятие, кликай кнопку ниже. В выходные опубликуются результаты. Ну а дальше с вами свяжусь я или Макс и раздадим ништяки. Такие дела!
Условия розыгрыша: подписаться на канал @bashdays и @gitgate
Bash Days | Linux | DevOps
Привет, очередная халява. Каждый год я отдаю 3 проходки-билета (скидка 100%) на онлайн-конференцию «Подлодка». Если есть желание посетить сие онлайн-мероприятие, кликай кнопку ниже. В выходные опубликуются результаты. Ну а дальше с вами свяжусь я или Макс…
1. dima (@Vesel4ag)
2. Nikolay (@galek240)
3. Cagami (@cagami)
Please open Telegram to view this post
VIEW IN TELEGRAM
Proxmox post install in 2025 (часть 1)
ㅤ
Давай разберемся, что нужно сделать после установки proxmox.
Наш путь — это всё сделать ручками, чтобы было понимание и контроль над процессом.
Для начала пиздуем сюда:
И добавляем дополнительные репозитории:
Затем отключаем интерпрайзный репозиторий в файле:
В нем комментируем одну строчку:
Следом отключаем платный
Комментируем и добавляем халявную репу:
После этого выполняем:
Всё раздуплится и обновится из бесплатных репозиториев. После этого перезагружаем сервер, потому что прилетело достаточно много важного и серьезного.
Дальше выполняем в терминале proxmox:
Эта команда отключит
На этом можно и закончить, но есть еще момент с прокидываем физических устройств в виртуальные машины.
Этот момент рассмотрим во второй части (завтра в 14:13 МСК залетит, пост в отложке), там похитрее всё.
🛠 #proxmox #devops
—
✅ @bashdays / @linuxfactory / @blog
ㅤ
Давай разберемся, что нужно сделать после установки proxmox.
Как вариант сразу накатить эту штуку Proxmox VE Post Install, но процесс не прозрачный.
Наш путь — это всё сделать ручками, чтобы было понимание и контроль над процессом.
Для начала пиздуем сюда:
/etc/apt/sources.list
И добавляем дополнительные репозитории:
deb https://download.proxmox.com/debian/pve bookworm pve-no-subscription
deb https://security.debian.org/debian-security bookworm-security main contrib
Затем отключаем интерпрайзный репозиторий в файле:
/etc/apt/sources.list.d/pve-enterprise.list
В нем комментируем одну строчку:
# deb https://enterprise.proxmox.com/debian/pve bookworm pve-enterprise
Следом отключаем платный
ceph, идем в файл:/etc/apt/sources.list.d/ceph.list
Комментируем и добавляем халявную репу:
# deb https://enterprise.proxmox.com/debian/ceph-quincy bookworm enterprise
deb https://download.proxmox.com/debian/ceph-quincy bookworm no-subscription
После этого выполняем:
apt update && apt upgrade
reboot
Всё раздуплится и обновится из бесплатных репозиториев. После этого перезагружаем сервер, потому что прилетело достаточно много важного и серьезного.
Дальше выполняем в терминале proxmox:
sed -Ezi.bak "s/(Ext.Msg.show\(\{\s+title: gettext\('No valid sub)/void\(\{ \/\/\1/g" /usr/share/javascript/proxmox-widget-toolkit/proxmoxlib.jsЭта команда отключит
No valid subsciption, сообщение о том, что у нас отсутствует подписка на интерпрайз. Довольно нозящая и заёбистая тема. Чтобы изменения вступили в силу, скинь кэш в браузере. Всё, больше это информационное окошко тебя не побеспокоит.
На этом можно и закончить, но есть еще момент с прокидываем физических устройств в виртуальные машины.
Этот момент рассмотрим во второй части (завтра в 14:13 МСК залетит, пост в отложке), там похитрее всё.
—
Please open Telegram to view this post
VIEW IN TELEGRAM
Proxmox post install in 2025 (часть 2)
Такс, следующим этапом после установки proxmox необходимо настроить проброс реальных устройств в виртуальные машины.
ㅤ
Если устройство проброшено в виртуальную машину, то ни хостовая машина ни другие виртуальные машины использовать это устройство не смогут. Короче устройство будет изолировано.
Открываем на редактирование файл:
И правим
Если у тебя Intel:
Если у тебя AMD
Сохраняем изменения и обновляем загрузчик:
По-хорошему proxmox нужно отправить в перезагрузку, но это не точно. В любом случае для чистоты эксперимента я все же ребучу.
Загружаем модули:
Открываем на редактирование:
И прописываем:
С версии ядра 6.2 модуль vfio_virqfd больше нахуй не нужен.
Сохраняем и запускаем:
Здесь обязательно нужен ребут, без ребута нихуя НЕ заработает!
Проверяем:
И ищем строчку:
Если нашел, то поздравляю, у тебя всё получилось! Если же нет, то еще раз внимательно выполни все шаги и не забудь про ребут.
На закуску
Чтобы изолировать GPU карточку от хостовой системы, нужно еще с бубном побегать.
Узнаём ID карточки, а дальше подставляем этот ID в эту команду:
И пиздярим блеклисты:
Ну и само собой отправляем proxmox в ребут.
Проброс HDD
Узнаём ID диска и выполняем команду:
Вот и вся наука. Всё лично протестировано и работает как часы, включая проброс видюхи.
Если есть чего добавить, велком в комменты.
🛠 #proxmox #devops
—
✅ @bashdays / @linuxfactory / @blog
Такс, следующим этапом после установки proxmox необходимо настроить проброс реальных устройств в виртуальные машины.
ㅤ
Проброс устройств подразумевает — устройства которые подключены к материнской плате на хостовой машине. Например, видюха, модемы и т.п. То есть виртуальные машины смогут их использовать.
Если устройство проброшено в виртуальную машину, то ни хостовая машина ни другие виртуальные машины использовать это устройство не смогут. Короче устройство будет изолировано.
У меня таким боком прокинут рутокен в виндовую виртуалку, чтобы в ЭДО доки подписывать с любого устройства и из любой жопы мира.
Открываем на редактирование файл:
/etc/default/grubИ правим
GRUB_CMDLINE_LINUX_DEFAULT, должно получиться так:Если у тебя Intel:
GRUB_CMDLINE_LINUX_DEFAULT="quiet intel_iommu=on pt=on"
Если у тебя AMD
GRUB_CMDLINE_LINUX_DEFAULT="quiet amd_iommu=on pt=on"
iommu=on — включает IOMMU (Input-Output Memory Management Unit) для процессоров. Этот механизм позволяет изолировать устройства ввода-вывода, повышая безопасность и управление памятью.
pt=on — включает поддержку PCI passthrough для виртуализации, позволяя передавать устройства (например, видеокарты или другие PCI-устройства) непосредственно в виртуальные машины.
Сохраняем изменения и обновляем загрузчик:
update-grub
reboot
По-хорошему proxmox нужно отправить в перезагрузку, но это не точно. В любом случае для чистоты эксперимента я все же ребучу.
Загружаем модули:
Открываем на редактирование:
/etc/modulesИ прописываем:
vfio
vfio_iommu_type1
vfio_pci
С версии ядра 6.2 модуль vfio_virqfd больше нахуй не нужен.
Сохраняем и запускаем:
update-initramfs -u -k all
reboot
Здесь обязательно нужен ребут, без ребута нихуя НЕ заработает!
Проверяем:
dmesg | grep -e DMAR -e IOMMU or dmesg | grep -e DMAR -e IOMMU
И ищем строчку:
Interrupt remapping enable Если нашел, то поздравляю, у тебя всё получилось! Если же нет, то еще раз внимательно выполни все шаги и не забудь про ребут.
На закуску
Чтобы изолировать GPU карточку от хостовой системы, нужно еще с бубном побегать.
lspci -nn
Узнаём ID карточки, а дальше подставляем этот ID в эту команду:
echo "options vfio-pci ids=10de:____,10de:____ disable_vga=1" > /etc/modprobe.d/vfio.conf
И пиздярим блеклисты:
echo "blacklist radeon" >> /etc/modprobe.d/blacklist.conf
echo "blacklist nouveau" >> /etc/modprobe.d/blacklist.conf
echo "blacklist nvidia" >> /etc/modprobe.d/blacklist.conf
echo "blacklist nvidiafb" >> /etc/modprobe.d/blacklist.conf
echo "blacklist nvidia_drm" >> /etc/modprobe.d/blacklist.conf
echo "blacklist i915" >> /etc/modprobe.d/blacklist.conf
Ну и само собой отправляем proxmox в ребут.
Проброс HDD
ls -n /dev/disk/by-id/
Узнаём ID диска и выполняем команду:
/sbin/qm set [VM-ID] -virtio2 /dev/disk/by-id/[DISK-ID]
Вот и вся наука. Всё лично протестировано и работает как часы, включая проброс видюхи.
Если есть чего добавить, велком в комменты.
—
Please open Telegram to view this post
VIEW IN TELEGRAM
Продолжу делиться всякими плюшками и фэйлами.
🔤 🔤 🔥 🔤 🔤 🔤 🔤
Пару дней назад начал писать скрипт на bash для того, чтобы 1с-ники в случае чего могли перезапустить службы 1c, postgres. И меня при этом не трогали.
В общем, написал. Но хотелось бы, чтобы перезапуск служб производится без
запроса пароля.
Есть файл в системе
Добавляем строчку:
И все. Пользователь
Делается это так:
или
Но пароль при этом не запрашивается. Еще один плюс в том, что
😞 В процессе отладки на виртуалке словил жесткий fail.
В
У меня debian. Пароль
Пришлось на хосте монтировать файл виртуалки
👆 Поэтому прежде чем править файл, убедитесь, что пароль
В случае проблем — сэкономите кучу времени и нервов.
🛠 #рабочиебудни #linux
—
✅ @bashdays / @linuxfactory / @blog
Пару дней назад начал писать скрипт на bash для того, чтобы 1с-ники в случае чего могли перезапустить службы 1c, postgres. И меня при этом не трогали.
В общем, написал. Но хотелось бы, чтобы перезапуск служб производится без
запроса пароля.
Есть файл в системе
/etc/sudoers. В котором можно все это сделать.Добавляем строчку:
username ALL=NOPASSWD:/usr/sbin/service postgresql*,/usr/sbin/service srv1cv83*,/usr/sbin/reboot
И все. Пользователь
username может управлять указанными службами и даже перезапустить сервак.Делается это так:
sudo service postgresql restart
или
sudo service srv1cv83_1541 status
Но пароль при этом не запрашивается. Еще один плюс в том, что
sudo -i система выполнить не даст.srv1cv83* Указана так, потому что на сервере может быть несколько служб 1c. Если указать /usr/sbin/service postgresql st*, то можно будет запустить, остановить и посмотреть статус. И всё!😞 В процессе отладки на виртуалке словил жесткий fail.
В
sudoers прописал service без пути. После этого команда sudo начала ругаться на ошибки в sudoers и перестала работать.У меня debian. Пароль
root заблокирован, sudo не работает. Я даже в recovery загрузиться не смог.Пришлось на хосте монтировать файл виртуалки
qcow2 и восстанавливать, все, как было.👆 Поэтому прежде чем править файл, убедитесь, что пароль
root установлен.В случае проблем — сэкономите кучу времени и нервов.
su root и будет счастье.—
Please open Telegram to view this post
VIEW IN TELEGRAM
Не долго музыка играла.
Недавно писал про мини-пк и что у меня на proxmox крутится.
Ну дак вот, вчера с утра смотрю, proxmox и все lxc выпали из сети, ну бывает, выключил с кнопки, включил. Хуй там плавал.
ㅤ
Подключил эту пепяку к монитору, НИХУЯ, подсветка горит, лампочка горит, но на экран ничего не выводится. Разобрал. При старте вентилятор делает несколько оборотов и останавливается. Прекрасное начало утра. Мне блядь уроки писать надо, а тут такое.
Разобрал еще больше, откинул батарейку, обнулил биос — НИЧЕГО!
Поперетыкал монитор в разные дырки, тишина.
Отпиздил (как советский телевизор), тишина.
Хм… походу мини пиздюк пал смертью храбрых.
Дата включения: 27.02
Дата смерти: 08.04
Работал 24/7, при температуре 45-50 градусов.
Вот такие дела. В общем не рекомендую. По крайней мере для режима 24/7 эта хуйня явно не подходит, ну либо мне так повезло.
По итогу достал свою старую добрую (пятую) малину, быстренько все на ней поднял и выдохнул. Четвертая малина у меня лет 8 отработала нонстопом без такой вот хуйни.
Как придет блок питания, напишу по результатам.
🛠 #hardware #fails
—
✅ @bashdays / @linuxfactory / @blog
Недавно писал про мини-пк и что у меня на proxmox крутится.
Ну дак вот, вчера с утра смотрю, proxmox и все lxc выпали из сети, ну бывает, выключил с кнопки, включил. Хуй там плавал.
ㅤ
Подключил эту пепяку к монитору, НИХУЯ, подсветка горит, лампочка горит, но на экран ничего не выводится. Разобрал. При старте вентилятор делает несколько оборотов и останавливается. Прекрасное начало утра. Мне блядь уроки писать надо, а тут такое.
Разобрал еще больше, откинул батарейку, обнулил биос — НИЧЕГО!
Поперетыкал монитор в разные дырки, тишина.
Отпиздил (как советский телевизор), тишина.
Хм… походу мини пиздюк пал смертью храбрых.
Дата включения: 27.02
Дата смерти: 08.04
Работал 24/7, при температуре 45-50 градусов.
Осталось проверить блок питания, но подходящего не нашел. Заказал, чтобы исключить этот момент. Но очень сомневаюсь что это поможет. Надеюсь хоть винт на террабайт из строя не вышел, куданить потом его прикручу.
Вот такие дела. В общем не рекомендую. По крайней мере для режима 24/7 эта хуйня явно не подходит, ну либо мне так повезло.
По итогу достал свою старую добрую (пятую) малину, быстренько все на ней поднял и выдохнул. Четвертая малина у меня лет 8 отработала нонстопом без такой вот хуйни.
Как придет блок питания, напишу по результатам.
—
Please open Telegram to view this post
VIEW IN TELEGRAM
Привет, ну вот и состоялось моё знакомство с серверным дистрибутивом SelectOS, дошли так сказать руки до прекрасного.
Все мои ухаживания в пост не влезли, да и с форматированием тут беда, поэтому наливаем кофе/пиво и читаем тут 👇
🦖 Пробуем SelectOS
Ну и по классике жанра, камон в комменты, будем активно обсуждать!
🛠 #linux #review
—
✅ @bashdays / @linuxfactory / @blog
Все мои ухаживания в пост не влезли, да и с форматированием тут беда, поэтому наливаем кофе/пиво и читаем тут 👇
Ну и по классике жанра, камон в комменты, будем активно обсуждать!
—
Please open Telegram to view this post
VIEW IN TELEGRAM
Хули нет, в пятницу вечером, а дня за три предупредить нельзя было? клиентоориентированность... долбаёбы блядь
🛠 #рабочиебудни
—
✅ @bashdays / @linuxfactory / @blog
—
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM