Bash Days | Linux | DevOps
23.2K subscribers
126 photos
22 videos
598 links
Авторский канал от действующего девопса

Самобытно про разработку, devops, linux, скрипты, тестирование, сисадминство, техдирство, пиэмство и за айтишную жизу.

Автор: Роман Шубин
Реклама: @maxgrue

Курс: @tormozilla_bot

РКН: https://two.su/bashdays
Download Telegram
🚜 Синий трактор едет к нам

Этот пост изобилует грубыми выражениями и, в силу своего содержания, вообще не предназначен для просмотра лицам с хрупким душевным миром.


Про Gitlab!

Заебали блядь, мне чо каждый день это гавно обновлять? Ладно бы там нажал кнопку как в wordpress и забыл. А нет, надо хуеву гору телодвижений сделать.

И в 100% эта залупа с первого раза никогда не заводится, то миграции ручками надо запускать, то еще 10 версий предыдущих накатить и молиться.

В прошлый раз вообще пришлось пайплайны переписывать, поломали совместимость.

Либо хуй пополам, либо пизда в дребезги, другого не дано.


А еще соль, что при обновлении мне приходится параллельно поднимать клон сервера, на случай если обновка сделает мозги, можно будет на старую версию переключиться. Удобство через край…

И на закуску фаталити — обновку накатывать нужно поздно ночью, либо в выходные, когда разработчики в режиме AFK. Хуита какая-то!

Можно и в будни, но заебут вопросами — а когда заработает?

Короче я такие апдейты на хую Лунтика вертел.


Хоть отдельного человека нанимай, чтобы каждый день обновки катил в три часа ночи.

Что я буду с этим делать? НИЧЕГО! Пусть нахуй всё взламываеют и пиздят, заебали!

Пардон. Накипело!

ps: так, мне еще вам конкурс придумывать сегодня, так что чуть позже увидимся, пойду успокоительное пить да Зельду на свиче задрачивать.


tags: #рабочиебудни

🔔 @bashdays
Please open Telegram to view this post
VIEW IN TELEGRAM
137
Так, пора закончить с этими картами.

Короче, представляем ситуацию, что тебя нахуй уволили или не заплатили, а ты еще тот злой гений.

Задача — нужно применить все свои навыки заподлостроения в инфраструктуре и знатно усложнить жизнь этим гадам. У тебя есть root доступ ко всему и ты отрабатываешь две недели.

Условия — на тебя не должны подумать и взять за жопу.

Пиши в комментарии свой гениальный план. Чей коммент наберет больше реакций, тому и карты в руки.

Писать нужно не в чатик! А нажав кнопку под постом, это важно. Ну и условия розыгрыша я кидал ранее.

Итоги подведем в следующую пятницу. Доставка по РФ и Беларусь.

Пару колод отдадим вторым и третьим местам, но нужно будет подождать, на руках у меня их щас нет. Там ченить придумаем.

Но если прям чешется, можешь заказать у Кати через Авито.

Погнали сочинять! Может в будущем кто-то и воспользуется твоим гениальным планом 🥳
Please open Telegram to view this post
VIEW IN TELEGRAM
39
Выходные заебись!

Сумма значений со стандартного ввода, или из файла.

➡️ Datamash

seq 1000 | datamash sum 1  
datamash sum 1 < <(seq 1000)


➡️ Awk

seq 1000 | awk '{sum += $1}END{print sum}'  
awk '{sum += $1}END{print sum}' <(seq 1000)


➡️ Dc

seq 1000 | dc -e '0d[?+2z>a]salaxp'  
dc -e '0d[?+2z>a]salaxp' < <(seq 1000)


Последнее решение самое занимательное. И самое небезопасное, потому что данные управляют программой.

Вообще во всех трёх случаях очень желательно очищать входные данные.

Почитать:

man datamash  
man seq
man awk
man dc


Да будет так!

tags: #bash

🔔 @bashdays
Please open Telegram to view this post
VIEW IN TELEGRAM
48
Здрасти. Существуют самописные скрипты, которые при запуске устанавливают необходимый набор программ. Этакая автоматизация на коленке, быстро, удобно, никаких ансиблов и паппетов.

Но встает вопрос, а как автоматизировать перезагрузку машины например при обновлении ядра, патчей или какого-то хитровыебанного софта?

Добавить в скрипт reboot на каждую команду? Да не, хуйня какая-то. Тут на помощь приходит reboot-required.

Ща покажу. Есть однострочник:

apt update && apt -fy upgrade && [ -f /var/run/reboot-required ] && shutdown -r now


Первая часть понятна, обновили, апгрейднули, а дальше идет магия.

В квадратных скобках конструкция, которая проверяет наличие файла /var/run/reboot-required и если он есть, то выполняется перезагрузка.

Файл reboot-required создается, если система считает, что после обновления требуется перезагрузка. Если файл существует, возвращается true. А если true, то запускается -r = reboot.

Вот и вся наука. Изучай…

tags: #bash #linux

🔔 @bashdays
Please open Telegram to view this post
VIEW IN TELEGRAM
204
Такс. Вопрос из зала — как через bash скрипт запросить у пользователя пароль, но чтобы при вводе пароля отображались звездочки?

На этот счет у меня есть 2 кишки. Выбирай любую понравившуюся. Либо пиши свой вариант в комментариях, будет интересно посмотреть.

Кишка первая.

a=''; while read -n 1 -s c; do [ "$c" = '' ] && break; echo -n '*'; a="$a$c"; done


Согласен, выглядит хуёва, но вторая на визуал еще хуёвие.

В этой кишке есть нюанс, она НЕ работает с кнопкой Backspace, то есть ты не сможешь отредактировать, то что уже ввел.

Кишка вторая.

a=''; while read -n 1 -s c; do [ "$c" = '' ] && break; if [ "$c" = $'\x7f' ]; then [ "$a" != "" ] && { a=${a:0:-1}; printf "\b \b"; }; else echo -n '*'; a="$a$c"; fi; done;


А тут уже более совершенный вариант, с рабочей кнопкой Backspace.

Чо делать дальше? Ну логично же, в переменную «a» записывается введенный пароль, а дальше делай с ним все что захочешь.

Вот такие пироги!

tags: #bash

🔔 @bashdays
Please open Telegram to view this post
VIEW IN TELEGRAM
94
Про интересный факап и траблшутинг.

Обратился клиент — у нас mysql реплика не работает. Вернее работает, но отстала всего лишь на 3 месяца.

На вопрос — а хули вы 3 месяца сидели, у вас же мониторинг есть?

Очевидный ответ — да, есть, но оно молчит.

Ладно, полез разбираться. SHOW SLAVE STATUS\G;

А там ошибки брынчат, как хуи в бидоне.

Error 'Cannot delete or update a parent row: a foreign key constraint fails'


Ну это ладно, ошибка и ошибка, тут понятно что делать — НИЧЕГО.

Так как реплика используется чисто аналитиками на потыкать, игнорим эту ошибку через my.cfg. Быстрофикс.

Для продуктовой реплики такое делать - НЕЛЬЗЯ!

Самый важный вопрос — какого хера мониторинг 3 месяца молчал?

Тут уже интереснее. Реплика заведена в prometheus, экспортеры есть, все дела.

Но из графаны сервер пропал, хотя год назад я ее точно там видел.

Думаем… Думаем… Смотрю графану, мониторится поле: replica_seconds_behind

Хм, лезу обратно на реплику, а там сроду нет mysql_exporter. Что же это тогда такое?

Копаем вглубь и видим, что node_exporter мониторит папку /tmp на наличие файликов .prom.

Ага… То есть метрики с mysql реплики собирает какой-то bash скрипт по крону, генерит текстовичок и отдает в prometheus.

Типа такого:

replica_slave_io_running{host="replica"} 1
replica_seconds_behind{host="replica"} 1234567


Да, оно прекрасно работало, до момента пока не вылезла ошибка: Cannot delete or update a parent row

Соответственно текстовый файл replica.prom получился в таком формате:

replica_slave_io_running{host="replica"} 1
replica_seconds_behind{host="replica"} Null


Ну а дальше prometheus такое распарсить не смог (он хочет циферки, а не буковки) и тихонечко вывел эту ноду из графаны и вообще отовсюду. Ну и аллерты в придачу. На что им тригериться если ноды нет нигде?

Прикол в том, что во время возникновения ошибки, поле Seconds_Behind_Master в mysql принимает значение Null, а не продолжает дальше считать на сколько отстала реплика.

А вот и bash скрипт, который собирал метрики:

#!/bin/bash

MAINDIR=/tmp
METRICS=rstatus.prom
HOST="replica"

SLAVE_IO_RUNNING=$(mysql -e 'SHOW SLAVE STATUS \G' | grep 'Slave_IO_Running'| awk '{print $2}')
SLAVE_SECONDS_BEHIND=$(mysql -e 'SHOW SLAVE STATUS \G' | grep 'Seconds_Behind_Master'| awk '{print $2}')

if [[ "$SLAVE_IO_RUNNING" == "Yes" ]]; then
J=1
echo 'replica_slave_io_running{host="'$HOST'"}' $J > $MAINDIR/$METRICS
else
J=0
echo 'replica_slave_io_running{host="'$HOST'"}' $J > $MAINDIR/$METRICS
fi

echo 'replica_seconds_behind{host="'$HOST'"}' $SLAVE_SECONDS_BEHIND >> $MAINDIR/$METRICS


Работа над ошибками проведена, инцидент разобран. Ни одна жопа на ретроспективе пока не пострадала, но возможно дело времени.

Как писать подобные экспортеры я накидывал в этом посте.


И всегда помни — если изобретаешь велосипед, всегда обрабатывай эксепшены!

tags: #devops #debug #bash #monitoring

🔔 @bashdays
Please open Telegram to view this post
VIEW IN TELEGRAM
78
Тут персонаж один пристал, говорит что у него в Java есть какой-то «мусожор», а вот в Bash такого нет и поэтому от наших скриптов одни проблемы.

Термин «Мусожор» видимо профессиональный и является пресловутым «Garbage Collector».

К Java я отношусь ровно, оно меня не трогает и я его тоже.

Как говорится — Одно гавно другому не равно. Поэтому хуисосить не буду.

Давай проведем эксперимент:

1. ps -o rss -p $$
2. var=$(printf "%s\n" {1..100000})
3. ps -o rss -p $$
4. var="bashdays"
5. ps -o rss -p $$


В первой строчке выводится количество физической памяти в килобайтах, используемой текущим процессом оболочки. У меня выдало 4348.

Во второй строчке записываем в переменную var содержимое от 1-100000 с переносом на новую строку.

В третьей строчке снова выводим количество физической памяти, у меня 5276.

Ага, оно стало больше. Было 4348 стало 5276.

В четвертой строчке, перезаписываем var на строку «bashdays» и снова проверяем память.

На этот раз пятая строчка вновь показывает: 4348.

Что и требовалось доказать. Использование памяти увеличивается, а затем снова уменьшается.

Все манипуляции с памятью выполняются на уровне Linux ядра. И нет никакой необходимости рвать жопу и греть голову.

Bash не работает с памятью и объектами, так же как обычные языки программирования.

tags: #bash

🔔 @bashdays
Please open Telegram to view this post
VIEW IN TELEGRAM
119
Ёхохо. Не пить алкашку по выходным конечно круто, по итогу все это время компенсируешь работой. Продуктивность зашкаливает. НО, скучно пиздец!

Поэтому приходится отвлекаться игрульками. Гоняя Зельду, невольно задумался, а квесты то очень похожи на алгоритмы в программировании. Порой что аж жопа горит. И их можно давать на собеседованиях. Без знания паттернов хер чо пройдешь.

Ладно, теперь по теме: Реврайтим CTRL+C.

Как прерывать запущенные программы и скрипты тут каждый знает. А как работает изнутри CTRL+C я напишу в следующих постах.

Сегодня что-то вроде на изи потыкать. Понедельник как-никак.

Где применяется реврайт CTRL+C? Да практически нигде, но то, что его можно зареврайтить это факт.

А вообще причины для реврайта разные:

- Избежание конфликтов с программным обеспечением
- Удобство и предпочтения пользователя
- Специальные рабочие процессы
- Случайные нажатия
- Ограниченные возможности клавиатуры
- и т.п.

Давай теперь на практике.

Смотрим дефолтное сочетание

stty -a


stty - утилита, которая настраивает параметры терминала.


Получаем портянку вида:

speed 38400 baud; rows 57; columns 237; line = 0;
intr = ^C; quit = ^\; erase = ^?; kill = ^U; eof = ^D; eol = <undef>; eol2 = <undef>; swtch = <undef>; start = ^Q; stop = ^S; susp = ^Z; rprnt = ^R; werase = ^W; lnext = ^V; discard = ^O; min = 1; time = 0; -parenb -parodd -cmspar cs8 -hupcl -cstopb cread -clocal -crtscts -ignbrk -brkint -ignpar -parmrk -inpck -istrip -inlcr -igncr icrnl ixon -ixoff -iuclc -ixany -imaxbel -iutf8 opost -olcuc -ocrnl onlcr -onocr -onlret -ofill -ofdel nl0 cr0 tab0 bs0 vt0 ff0 isig icanon iexten echo echoe echok -echonl -noflsh -xcase -tostop -echoprt echoctl echoke -flusho -extproc


Смотрим параметр intr, он и указывает на сочетание, которое будет слать SIGINT. По умолчанию как видим оно = CTRL+C.

Давай теперь поменяем эту штуку:

stty intr ^K


Теперь запускаем для теста sleep 1000 и пробуем нажать CTRL+C. Опа и нихуя не происходит.

Поздравляю, реврайт прошел успешно. А теперь нажми CTRL+K и sleep завершится. Клёва? Клёва!

Можешь теперь издеваться над коллегами и ломать им рабочие процессы.

Чтобы сохранить эти настройки, выполняем:

echo 'stty intr ^K' >> ~/.bashrc


Ну либо в .zshrc, тут уже сам смотри где у тебя первоначальные настройки валяются.

А можно сделать CTRL+ALT+K ?

Через stty увы такое провернуть не получится.

Но используя xbindkeys такое возможно.

vim ~/.xbindkeysrc

и добавить туда:

"pkill -SIGINT -f ."
Control+Alt + k


Но xbindkeys со своими подводными камнями, оно для Иксов. А если у тебя Wayland то смотри в сторону sway или gnome-keybinding.

Такие дела. Ладно, пошли дальше мир спасать. Хорошего понедельника!

tags: #linux

🔔 @bashdays
Please open Telegram to view this post
VIEW IN TELEGRAM
83
Так, самое время подвести итоги с картами «Релиз».

Больше всего реакций набрал комментарий Алексея Агафонова (supmea), по итогу 39 огоньков.

Привести в порядок всё, чтоб не стыдно перед последователями было. А доступы и так оставят и почту. Ещё и докучают что-либо сделать. А мы идём на большие деньги смотреть как у других всё сделано не так как нужно


На втором месте Александр Смирнов (wddingo) с 38 лайками за комментарий:

Самое гадкое, что можно было им сделать - я сделал, я ушел с этой работы. Пусть теперь сами с этим говном разбираются. А пакостить - это считаю слишком мелочным


Ну и третье место занял Максим (Rosssich), набрав 30 респектов за комментарий:

а вообще - ключевое слово "не заплатили". поэтому заявление в трудовую инспекцию, суд и т.д. там можно урона нанести больше чем от всяких там chaosmonkey )


На этой неделе к вам придет Макс и узнает куда засылать призы. Ждите.

Нюансы. На руках у меня всего одна колода, она отправится в приоритете Алексею, остальные две вышлем в ближайшее время, как получим их от организатора. Ну либо закинем рублей на карту, чтобы вы самостоятельно заказали их через Авито и не парились на почте.

Всем спасибо за участие, вы все лучшие!
34
И снова здравствуйте. Давай сегодня немного в кишках покопаемся.

Запускаем бессмысленную команду:

dd if=/dev/zero of=/dev/null status=progress


И наблюдаем как строка статистики постоянно меняется.

В простонародье — рефрешится.

4254480896 bytes (4.3 GB, 4.0 GiB) copied, 4.77966 s, 890 MB/s


Бесполезная? Ну не скажи, с её помощью можно протестировать скорость чтения и записи.

Эта команда копирует блоками нули из спец-файла в другой. Записывая статистику на стандартный вывод ошибок stderr.

Строка статистики постоянно меняется. Но как dd это делает? Давай разберемся ниже.

Запускаем страшную кишку и немного ждем

dd if=/dev/zero of=/dev/null status=progress |& { read -t 4; echo "${REPLY@Q}"; }


По итогу получаем, что-то подобное:

$'\r927888896 bytes (928 MB, 885 MiB) copied, 1 s, 928 MB/s\r1851585024 bytes (1.9 GB, 1.7 GiB) copied, 2 s, 926 MB/s\r2749514752 bytes (2.7 GB, 2.6 GiB) copied, 3 s, 917 MB/s'


Портянка с read означает — ждем 4 секунды, считываем первую строчку ввода и сохраняем ее в переменную REPLY, а далее выводим содержимое переменной на экран.

Не так уж и страшно, правда?

Ааа, херовина |& нужна, чтобы объединить stdout и stderr и затем направить его в read.

Ну дак вот.

Получается утилита dd, пишет статистику за секунду в стандартный поток ошибок и затем суёт символ «\r».

Который означает - возврат каретки.

Вот и вся магия.

Делаем хак, чтобы избавиться от возврата каретки:

dd if=/dev/zero of=/dev/null status=progress |& tr '\r' '\n'


Теперь статистика выводится в столбик:

1836032000 copied, 2 s, 918 MB/s
2793336832 copied, 3 s, 931 MB/s
3726170624 copied, 4 s, 932 MB/s
4655933440 copied, 5 s, 931 MB/s


Нагляднее? Конечно!

Что с этим можно сделать? Ну например протестировать скорость чтения и записи, используя разный размер буферов.

Херачим Bash скрипт:


#!/bin/bash

for i in {9..20}
do
bs=$((2**i))
dd bs="$bs" if=/dev/zero of=/dev/null status=progress |& {
mapfile -d$'\r' -n 2; printf '%-8s : %s\n' "$bs" "${MAPFILE[1]}"; }
done

exit


Запускаем и получаем:

512 : 878647296 copied, 1 s, 879 MB/s
1024 : 1618295808 copied, 1 s, 1.6 GB/s
2048 : 3096260608 copied, 1 s, 3.1 GB/s
4096 : 5056294912 copied, 1 s, 5.1 GB/s
8192 : 8047247360 copied, 1 s, 8.0 GB/s


Круто? Да охуеть!

Ну а если нужна статистика за пять секунд. Делаем 5+1 к количеству записей и индексу массива. Массив начинается с нуля. Но можешь это изменить с помощью опции -O.

#!/bin/bash

for i in {9..20}
do
bs=$((2**i))
dd bs="$bs" if=/dev/zero of=/dev/null status=progress |& {
mapfile -d$'\r' -n 6; printf '%-8s : %s\n' "$bs" "${MAPFILE[5]}"; }
done

exit


По итогу имеем статистику за 5 секунд:

512 : 4667945472 copied, 5 s, 934 MB/s
1024 : 8693190656 copied, 5 s, 1.7 GB/s
2048 : 15988561920 copied, 5 s, 3.2 GB/s
4096 : 27510878208 copied, 5 s, 5.5 GB/s
8192 : 39937343488 copied, 5 s, 8.0 GB/s


Вот такие пироги. Теперь можешь тестировать VPSки и писать статью на хабру с бенчмарками.

Давай, увидимся завтра!

tags: #linux #bash

🔔 @bashdays
Please open Telegram to view this post
VIEW IN TELEGRAM
138
С утра успешно победил всех антагонистов и теперь самое время сделать что-то полезное.

Сегодня разбираем проблемный Bash скрипт.

#!/bin/bash  

i=0
for name in `ls *.txt`
do
i=$[i+1]
mv $name `printf "%02d" $i`.txt
done


А проблема заключается в том, что скрипт удаляет файлы, которые содержат в именах цифры.

За качество скрипта тереть не будем. Нам нужно задебажить проблему, ведь явных команд на удаление в этом скрипте — нет.

Для начала, давай создадим вводные, чтобы было с чем работать.

mkdir /tmp/test
cd /tmp/test
touch {001..003}.txt {01..03}.txt


Так, создали 6 файлов с разными именами:

01.txt
02.txt
03.txt
001.txt
002.txt
003.txt


Модифицируем проблемный скрипт, чтобы он выводил строку с командой mv перед её выполнением:

#!/bin/bash  
i=0
for name in `ls *.txt`
do
i=$[i+1]
echo 'DEBUG: mv' $name `printf "%02d" $i`.txt
mv $name `printf "%02d" $i`.txt
done

exit 0


Запускаем и получаем красивое:

DEBUG: mv 001.txt 01.txt
DEBUG: mv 002.txt 02.txt
DEBUG: mv 003.txt 03.txt
DEBUG: mv 01.txt 04.txt
DEBUG: mv 02.txt 05.txt
DEBUG: mv 03.txt 06.txt


Смотрим что у нас осталось, хуяк и вместо 6 файлов, у нас осталось всего лишь 3 штук.

ls

04.txt
05.txt
06.txt


Куда блядь делось остальное? Вокруг да около ходить не будем.

Дело в том, что в одном каталоге не может быть двух файлов с одинаковым названием. Очевидно? Да!

Как работает mv:

mv <старое имя> <новое имя>


Если <новое имя> это существующее имя файла, тогда оно будет удалено, а <старое имя> получит имя <новое имя>.

Если взять нашу ситуацию, то произошло следующее:

1. DEBUG: mv 001.txt 01.txt 
2. DEBUG: mv 002.txt 02.txt
3. DEBUG: mv 003.txt 03.txt
4. DEBUG: mv 01.txt 04.txt
5. DEBUG: mv 02.txt 05.txt
6. DEBUG: mv 03.txt 06.txt


1. Удалено 01.txt. и 001.txt -> 01.txt
2. Удалено 02.txt. и 002.txt -> 02.txt
3. Удалено 03.txt. и 003.txt -> 03.txt

Итого потеряли 3 файла, печаль.

Теперь давай более наглядно. Удаляем подопытные файлы и создаем новые. Плюс запишем в каждый файл его имя.

for i in {001..003}.txt {01..03}.txt; do echo $i > $i;done


Получилось 6 файлов, в каждом файле содержится имя самого файла.

Смотрим что получилось:

ls -la

8 Jul 10 08:05 001.txt
8 Jul 10 08:05 002.txt
8 Jul 10 08:05 003.txt
7 Jul 10 08:05 01.txt
7 Jul 10 08:05 02.txt
7 Jul 10 08:05 03.txt


Снова модифицируем скрипт и задаем опцию -b для утилиты mv. Теперь для существующего файла будет создаваться резервная копия. Бекап ёпта!

#!/bin/bash  
i=0
for name in `ls *.txt`
do
i=$[i+1]
echo 'DEBUG: mv' $name `printf "%02d" $i`.txt
mv -b $name `printf "%02d" $i`.txt
done
exit 0


Выполняем скрипт и смотрим что у нас осталось от файлов.

ls -la

7 Jul 10 08:05 01.txt~
7 Jul 10 08:05 02.txt~
7 Jul 10 08:05 03.txt~
8 Jul 10 08:05 04.txt
8 Jul 10 08:05 05.txt
8 Jul 10 08:05 06.txt


Теперь смотрим содержимое самих файлов и преисполняемся.

По итогу, если нужно пронумеровать файлы, позаботься об уникальности имён и заранее протестируй на тестовых данных. Чтобы случайно к херам не снести все ассетсы с продакшена.

Ну и всегда обрабатывай исключения если файл уже существует, чтобы не остаться без штанов.

Изучай, всего тебе самого наилучшего!

tags: #linux #bash

🔔 @bashdays
Please open Telegram to view this post
VIEW IN TELEGRAM
961
ДА или НЕТ? Давай разберемся!

Запускай:

cd /tmp
touch bashdays.txt
rm -i bashdays.txt


Получаем интерактивный запрос:

rm: remove regular empty file 'test.txt'?


Выбор зависит от потребности. Либо да, либо нет. Но что вводить? Очевидно же — y или n.

Справедливо. Но что если… Запускаем:

locale -k noexpr yesexpr


Выхлоп:

noexpr="^[-0nNНн]"  
yesexpr="^[+1yYДд]"


Это все возможные варианты, которыми ты можешь воспользоваться. Если вместо «y» ты введешь знак «+» — файл удалится.

Аналогично можно ввести 0 или 1. Либо «Д» или «Н».

Не везде из коробки прописаны такие регулярки, например на англоязычной убунте хуй с маслом.

noexpr="^[nN]"
yesexpr="^[yY]"


Функция оценивающая ответ пользователя, учитывает локализацию.

Для подтверждения, или отмены может быть использован любой символ в квадратных скобках из вывода вышеприведённой команды.

А любой символ не совпадающий с символами из набора yesexpr будет равносилен отмене, в том числе и пустой ввод.

Как на это можно повлиять?

Всё это забиндино в файлах которые лежат в папке: /usr/share/i18n/locales

Например, в файле ru_RU есть такое:

LC_MESSAGES
yesexpr "^[+1yY<U0414><U0434>]"
noexpr "^[-0nN<U041D><U043D>]"
yesstr "<U0434><U0430>"
nostr "<U043D><U0435><U0442>"
END LC_MESSAGES


Тут присутствует как раз «0» и «1» / «+» и «-».

Если хочется упороться, можешь собрать свою локаль и добавить свои символы в регулярку:

cp /usr/share/i18n/locales/ru_RU ~/my_ru_RU
localedef -f UTF-8 -i ~/my_ru_RU ru_RU.UTF-8


После первой команды, нужно отредактировать файл ~/my_ru_RU и затем запускать вторую команду.

Такие вот перлы и приколы. Изучай.

👉 Многие этого ждали, завтра закину анонс про личное наставничество и обучение в рамках проекта Linux Factory.

tags: #linux

🔔 @bashdays
Please open Telegram to view this post
VIEW IN TELEGRAM
1151
Ну вот и пришло время…

TL;DR если хочешь в девопс, я тебя научу


Привет. В личку регулярно заходят наши подписчики и интересуются наставничеством, обучением и т.п.

Ладно, чо тянуть, закроем вопрос.

Встречаем Linux Factory!

1.08 выпускаю кракена. Но кракен будет для маленьких. Матёрые заскучают, но кто знает…

Курс пилить я ебал, поэтому покажу протоптанные дорожки и основы. И если ты ими правильно воспользуешься — слава тебе и почет + 100500 денег в секунду.

Живописнее и подробнее можешь ознакомиться тут, всё утро красоту наводил 🥳

Чтобы стать частью прекрасного, запускай бота и жми кнопки.

Программа: https://bashdays.ru/intro/
Стать сильнее тут: @tormozilla_bot

👇👇👇
Please open Telegram to view this post
VIEW IN TELEGRAM
1593
Привет. Сегодня нассым в чайник.

А если конкретнее, рассмотрим более подробно команду man

Это с виду она дохуя скучная, на деле там всё по полочкам.

Man содержит разделы от 1 до 9 + дополнительные (n, l, p). В дополнительные разделы входят всё то, что по каким-то причинам не попало в первые 9.

Все это дело сконфигурировано в файле: /etc/manpath.config, в него можно не смотреть, там хуйня какая-то непонятная для не подготовленного человека.

Ну дак вот. В каждом man разделе, есть страница intro. То бишь «вступление», которое описывает что содержит раздел.

Давай тыкать палкой.

Ставим пакет:

apt install manpages-dev


Запускаем:

man 1 intro


Выведется список с содержимым 1го раздела:

- Login
- The shell
- Pathnames and the current directory
- Directories
- Disks and filesystems

и т.п.


Теперь пройдемся по разделам:

1. Справка по стандартным командам (программы и утилиты). Это самый огромный раздел в справочной системе. Глаза разбегутся. Но есть лайкфак, можно воспользоваться поиском.

man -k copy


Выведется ограниченный список команд и утилит, которые содержат слово «copy»

cp (1) - copy files and directories
cpgr (8) - copy with locking the given file
cpio (1) - copy files to and from archives
cppw (8) - copy with locking the given file
dd (1) - convert and copy a file


В скобках выводится цифра раздела, в котором была найдена справка. А дальше можно сделать например так:

man 8 cppw


Херак и ты получил желаемое. С поиском намного удобнее и приятнее работать.

2. Раздел содержит описание системных вызовов. В этом разделе можно найти понимание этих ваших линуксов. Например, смотрим справку по mkdir.

man 2 mkdir


Кончаем и получаем список системных вызовов с которыми работает mkdir.

3. Раздел с библиотечными функциями. Тут больше для программистов.

4. Описание файлов-устройств расположенные в /dev

5. Описание форматов файлов. Конфигурационные файлы приложений и их синтаксис. Например, синтаксис файла теневых паролей.

man 5 login.defs


Чтиво весьма занятное. Именно в этом файле задаются «SYS_UID_MAX», «SYS_UID_MIN». Это диапазон UID, который будет присвоен пользователю, при использовании утилит «useradd» или «newusers» когда, ты добавляешь нового пользователя.

6. Раздел игр.

7. Описание стандартов и соглашений. Например, последовательность загрузки ОС.

man 7 boot


или параметры ядра при загрузке:

man 7 bootparam


или шаблоны имён файлов:

man 7 glob


8. Команды для системного администрирования. Например, информация о портах/сокетах:

man 8 netstat


монтирование устройств:

man 8 mount


отображение информации о дисках и их настройка:

man 8 hdparm


9. Функции ядра. В большинстве случаев этот раздел отсутствует в современных дистрибутивах. Раздел не является стандартом. Если нужно узнать про функции ядра, тут только поиск через man -k <ключевое слово>.

Так же ты можешь встретить разделы n, l, p, но опять-же они не всегда присутствуют, все зависит от того, какой софт ты ставил себе на машину.

Ну и закончим эту простыню вишенкой. Для этой команды нужны Иксы.

apt install man-db groff
man -H bash


Страница со справкой Bash будет отформатирована в «html» формате и открыта в браузере по умолчанию.

Без Иксов просто сформируется «html» файл в папке tmp, у меня он появился тут: /tmp/hmanU3yORv/bash.html

Ладно, изучай. Увидимся завтра!

PS: Все кто подал заявки на вписку в Linux factory, все ок. Как только решу вопросы с эквайрингом Тибанка (бекенд у них отвалился), всем напишу. Терпения вам и мне дорогие подписчики. Всех обнял!


tags: #linux #bash

🔔 @bashdays
Please open Telegram to view this post
VIEW IN TELEGRAM
11383
Tagd Tagd порадовал нас еще одним постом. Спасибо друг! В редакцию тебя что-ли на ставку забрать, складно пишешь 🥳. Пиши еще!

Как я офигел и полюбил AWK.

AWK - сильно недооценен. Мало кто его использует кроме как - вывести вторую колонку.

А между тем - это полноценный язык программирования.

Я решил выучить AWK, когда на хабре увидел конструкцию:

awk '!a[$0]++' ./file


Эта конструкция убирает дубли строк файла, оставляя только уникальные.

Причем делает это за один проход чтения файла!

Работает она очень просто:

Считывается строка файла ($0), Если a[$0] не (!) равен 0, то строка выводится в stdout.

После этого, a[$0] инкрементируется. Если далее встретится такое же значение строки $0, то a[$0] уже будет ненулевым и строка проигнорируется.

У этой конструкции есть и подводные камни. Весь файл фактически считывается в массив и хранится в памяти. Так что если файл больше половины свободной памяти - используйте uniq.

И теперь несколько примеров без объяснений:

awk '++a[$0]==3'


Уникальные строки, c числом вхождений >=3.

awk '++a[$0]>=3'


Все вхождения, начиная с третьего.

Эти конструкции могут быть полезны, когда хочется выявить особо настырных.

Ну, и еще. AWK поддерживает вещественные числа. Поэтому когда нужно что-то посчитать:

awk 'BEGIN{print 1/3}' 


или

echo 1 3|awk '{print $1/$2}'


Не так красиво, как bc. Но bc/dc может и не быть в системе, а awk, есть, практически везде.

В общем, если припрёт awk'ом можно заменить cat, sed, grep, tr, cut, head, tail, wc...

Ну, и ложка дегтя. Есть несколько версий awk: MAWK NAWK GAWK

Базовый функционал у них одинаковый. Так что не заморачивайтесь. Если кто-то заинтересовался - help по GAWK.

👉 Вопросы, комментарии приветствуются.

tags: #linux

🔔 @bashdays
Please open Telegram to view this post
VIEW IN TELEGRAM
123
Раз пошла такая пьянка, эта sed`ушка подсветить вхождения подстроки, сохраняя, весь контекст. Грубо говоря выделит цветом только те строки, которые ты укажешь.

sed 's/string/\x1b[31m&\x1b[m/g' bashdays.txt


String нужно заменить на то слово, которое нужно подсветить.

Это случай когда использование sed оправдано.

Изучай…

tags: #linux #bash

🔔 @bashdays
Please open Telegram to view this post
VIEW IN TELEGRAM
80
Magic SysRq в Linux

Чо эт такое? Ооо брат, это комбинация клавиш которая позволяет выполнять низкоуровневые команды независимо от состояния системы.

Тема достаточно полезная, прочитай, пригодится.

Ядро реагирует на такие команды моментально, независимо от того, что оно делает в данный момент. При условии, что само ядро не заблокировано.

Чтобы послать ядру Magic SysRq, нужно нажать ALT+SysRq+key.

А где взять клавишу SysRq? На современных клавиатурах это клавиша PrintScreen.

А какой key нажимать в конце? Ну например:

+b - немедленная перезагрузка системы
+o - выключение системы
+s - синхронизация всех файловых систем
+u - перемонтирование файловых систем в read only
+r - возвращение управления с клавиатуры X-сервера к консоли
+k - завершение всех процессов на текущей консоли

В моем случае, чтобы послать эту комбинацию клавиш в Virtualbox, мне пришлось нажать — Правый ALT+PrintScreen+h.

После нажатия этой комбинации, в терминале выводится справка по доступным командам SysRq.

После вывода справки, смотрим логи ядра:

dmesg -tk | grep -m1 '^sysrq: HELP :'


и видим, что ядро триггернулось и записало в журнал:

sysrq: HELP : loglevel(0-9) reboot(b) crash(c) terminate-all-tasks(e) memory-full-oom-kill(f) kill-all-tasks(i) thaw-filesystems(j) sak(k) show-backtrace-all-active-cpus(l) show-memory-usage(m) nice-all-RT-tasks(n) poweroff(o) show-registers(p) show-all-timers(q) unraw(r) sync(s) show-task-states(t) unmount(u) force-fb(v) show-blocked-tasks(w) dump-ftrace-buffer(z)


Грубо говоря, если система встала раком и не отвечает, можешь ребутнуть её магическими клавишами: ALT+SysRq+b.

Ну либо поиграться с read only на проде.

В официальной доке, этот функционал шикарно расписан, прям рекомендую почитать, хоть и с переводчиком.

Изучай...

PS: А если у меня нет клавиши PrintScreen? Ну значит, не судьба!


tags: #linux

🔔 @bashdays
Please open Telegram to view this post
VIEW IN TELEGRAM
127
Ёпта! Работа над Linux Factory идет полным ходом, всем кто принес мне свой емейл в бота, все котики и записаны.

Кому я еще не ответил — отвечу, ничо не потерялось. Я тут в одну харю ща всё разгребаю и отбиваюсь от менеджеров тибанка с помощью их же разработки — автоответчика Олега.

В начале следующей неделе буду рассылать инвайты в закрытый канал, ну и инструкции чо каво делать.

✔️ Так, теперь по сегодняшней теме — Awk и пасхальное яйцо.

Если запустить:

awk --nostalgia


Всё нахуй упадет с ошибкой — awk: bailing out near line 1 Aborted

nostalgia это не документированная опция, которая была добавлена в версии 2.11 beta и сопровождалось странным комментарием:

undocumented feature, inspired by nostalgia, and a T-shirt


Чо за херня?

Ранние версии awk аварийно завершались при различных эксепшенах выводя подобную ошибку. Утилиту отладили, но осталась — ностальгия. Но кто знает, возможно это ключ к ответу на главный вопрос жизни.

Еще из интересного. Gawk использует GNUтое расширение предоставляемое функциями разбора аргументов командной строки. При активации этого расширения доступен специальный синтаксис -W long_option.

awk -Wnos
awk -Wcopy


Эти команды аналогичны:

awk --nostalgia
awk --copyright


Странное конечно поведение учитывая содержимое этого поста.

Ну да ладно, хуй с ним. Чо только не придумают…

Хороших тебе предстоящих выходных и береги себя.

Кстати кто сегодня винду обновил и получил синьку, самое быстрое решение опубликовал Дима в полезняшках. Репостить не буду, кому надо сами сходите посмотрите.


Ааа еще забыл, Tagd Tagd написал нам две пиздатых статьи, на днях выложу. Спасибо Tagd Tagd с меня бонусы!

tags: #linux #bash

🔔 @bashdays
Please open Telegram to view this post
VIEW IN TELEGRAM
50
Неделя только началась, а я уже заебался.

Как и обещал, публикую полезнейший пост от нашего коллеги Tagd Tagd 👇

Сегодня мы рассмотрим пару фишек настройки ssh среднего уровня.

БЕЗДУМНАЯ НАСТРОЙКА SSH по SSH МОЖЕТ ПРИВЕСТИ К ПОТЕРЕ КОНТРОЛЯ НАД СЕРВЕРОМ.

Чтобы минимизировать риски, я подключаюсь по ssh двумя сессиями.

В одной правлю sshd_config, другую оставляю для возможного отката при косяках, поскольку при перезапуске sshd с измененным конфигом текущие сессии сохраняются.

Наличие физического доступа к консоли - приветствуется.

sudo cp /etc/ssh/sshd_config /etc/ssh/sshd_config.1


Вы уже знаете, как настроить ключи. Они прописаны и работают!!!

Допустим в файле /etc/ssh/sshd_config

PubkeyAuthentication yes
PasswordAuthentication no
PermitRootLogin prohibit-password


Там же есть опция AuthorizedKeysFile и обычно она закомментирована. Она указывает, где находится файл аuthorized_кeys.

В нём хранятся публичные ключи пользователей, которым разрешено ssh.

Обычно это ~/.ssh/authorized_keys

делаем так:

sudo cp ~/.ssh/authorized_keys /etc/ssh/authorized_keys
sudo chown root:root /etc/ssh/authorized_keys
sudo chmod 644 /etc/ssh/authorized_keys


а в файле /etc/ssh/sshd_config

AuthorizedKeysFile %h/.ssh/authorized_keys /etc/ssh/authorized_keys


перезапускаем sshd:

systemctl restart sshd


Всё. С ключом, прописанным в /etc/ssh/authorized_keys можно заходить под любым пользователем, у которого прописан вменяемый shell, включая root!!!

Наличие ключей в домашней папке пользователя теперь необязательно.

Может быть удобно, если рулить сотней пользователей. Ну, или как дырочка.

Лучше, конечно задать:

PermitRootLogin no


Кстати, при данной опции попытки перебора по root попадают в log, но не отмечаются в lastb. Это так, к сведению.

Продолжение следует...

tags: #linux

🔔 @bashdays
Please open Telegram to view this post
VIEW IN TELEGRAM
74
Такс, всем желающим вводные разослал, проверяйте.

А мы уже начали с ребятами потихоньку преисполняться.

Кто не успел вписаться в движ или проебал сообщение, проверь или напиши в бота @linuxfactorybot, разрулим.

Напомню что с 1 сентября для новеньких, ценник внезапно в пару раз подрастет. Сейчас можно сказать это пилотный запуск и летние скидки.

Хорошей тебе рабочей недели 🫥
Please open Telegram to view this post
VIEW IN TELEGRAM
60