Порой мне кажется, что в выходные я устаю больше, чем за всю рабочую неделю. Но это скорее психологическая усталость, так как выпадаешь из рабочего ритма/потока и потом сложно обратно запрыгивать. Ладно, у нас тут не кружок психологии. 😳
Сегодня на повестке у нас с тобой OOM Killer.
Out of Memory Killer (OOM Killer) – это механизм ядра Linux, который освобождает оперативную память при ее исчерпании за счет принудительного завершения некоторых запущенных процессов.
Погнали разбираться это работает и как его можно обуздать.
Когда оперативная память в ос linux заканчивается, происходят забавные вещи, ядро вызывает «кракена» OOM Killer. В свою очередь «кракен» прогоняет процесс по определенным правилам и убивает его.
Бытует ошибочное мнение, что OOM Killer берет самый жирный процесс и киляет его. Это не так. Создатели этого механизма знатно упоролись.
OOM Killer использует достаточно сложный анализ и присваивает каждому процессу очки негодности (badness). При исчерпании памяти, будет убит именно самый негодный процесс. Некий естественный отбор. Процесс убивается сигналом SIGKILL и не предоставляет приложению корректно завершиться. Вызывается функция out_of_memory, а далее select_bad_process.
После убийства, в системном журнале появится строчка:
пошло по пизде не так и нужно разобраться.
Очки негодности могут принимать значение от -1000 до +1000. Соответственно чем выше это значение, тем вероятнее, что процесс будет убит. А процесс со значением -1000 будет по логике — бессмертным.
Посмотреть репутацию процесса, можно командой:
В результатах ты увидишь число, к примеру: 826, это и есть очки негодности.
Если интересно как начисляются очки негодности, я вынес это в отдельный пост в телеграф, чтобы не валить тебя скучной теорией. Почитать можешь тут:
✅ Как вычисляются очки негодности?
TL;DR Если подытожить, то OOM Killer убьет самый «жирный» процесс, который наименее активен в системе и имеет самое короткое время жизни.
Как обуздать OOM Killer?🔪
Можно вообще его отключить! Но по понятным причинам, это все равно что отключить жизненно важный орган у человека. Какое-то время он еще проживет, но потом обязательно сдохнет в kernel panic.
Отключается командой:
Можно повысить или понизить репутацию для процесса, добавив в файл oom_adj значение от -17 до +15. Для повышения репутации выполняем команду:
Для отключения OOM Killer для определенного процесса, выставляем репутацию -17. Теперь этот процесс в «домике» и его никакая собака не посмеет тронуть.
Также можно динамически определять PID процесса и менять ему репутацию. Закинуть это в крон и прыгать от счастья:
Поздравляю, ты только что прокачался еще на один уровень. Хорошего тебе понедельника, да и лёгкой рабочей недели! Увидимся!🐾
tags: #linux
—
🟢 Подпишись: @bashdays
Сегодня на повестке у нас с тобой OOM Killer.
Out of Memory Killer (OOM Killer) – это механизм ядра Linux, который освобождает оперативную память при ее исчерпании за счет принудительного завершения некоторых запущенных процессов.
Погнали разбираться это работает и как его можно обуздать.
Когда оперативная память в ос linux заканчивается, происходят забавные вещи, ядро вызывает «кракена» OOM Killer. В свою очередь «кракен» прогоняет процесс по определенным правилам и убивает его.
Бытует ошибочное мнение, что OOM Killer берет самый жирный процесс и киляет его. Это не так. Создатели этого механизма знатно упоролись.
OOM Killer использует достаточно сложный анализ и присваивает каждому процессу очки негодности (badness). При исчерпании памяти, будет убит именно самый негодный процесс. Некий естественный отбор. Процесс убивается сигналом SIGKILL и не предоставляет приложению корректно завершиться. Вызывается функция out_of_memory, а далее select_bad_process.
После убийства, в системном журнале появится строчка:
Out of Memory: Killed process 2256 (mysql) score 907 or sacrifice childА это уже не шутки. Если к тебе стал приходить OOM Killer, значит в какой-то момент на сервере, что-то
Очки негодности могут принимать значение от -1000 до +1000. Соответственно чем выше это значение, тем вероятнее, что процесс будет убит. А процесс со значением -1000 будет по логике — бессмертным.
Посмотреть репутацию процесса, можно командой:
cat /proc/<PID>/oom_scoreГде PID это идентификатор процесса, узнать можешь командой ps ax|grep postfix
В результатах ты увидишь число, к примеру: 826, это и есть очки негодности.
Если интересно как начисляются очки негодности, я вынес это в отдельный пост в телеграф, чтобы не валить тебя скучной теорией. Почитать можешь тут:
TL;DR Если подытожить, то OOM Killer убьет самый «жирный» процесс, который наименее активен в системе и имеет самое короткое время жизни.
Как обуздать OOM Killer?
Можно вообще его отключить! Но по понятным причинам, это все равно что отключить жизненно важный орган у человека. Какое-то время он еще проживет, но потом обязательно сдохнет в kernel panic.
Отключается командой:
sudo echo 1 > /proc/sys/vm/panic_on_oomПо умолчанию 0 (то есть включено). Я ни разу не встречал, чтобы кто-то отключил этот функционал, но достаточно много раз сталкивался с забиваем костылей в сами процессы.
Можно повысить или понизить репутацию для процесса, добавив в файл oom_adj значение от -17 до +15. Для повышения репутации выполняем команду:
sudo echo -6 > /proc/<PID>/oom_adjНе забываем подставить в PID, идентификатор нужного процесса.
Для отключения OOM Killer для определенного процесса, выставляем репутацию -17. Теперь этот процесс в «домике» и его никакая собака не посмеет тронуть.
sudo echo -17 > /proc/<PID>/oom_adjНо если ты рестартанешь процесс, у него изменится PID. А репутация, которую ты ему уже накрутил, может примениться к совсем другому процессу таким же PID.
Также можно динамически определять PID процесса и менять ему репутацию. Закинуть это в крон и прыгать от счастья:
pgrep -f "/usr/sbin/sshd" | while read PID; do echo -17 > /proc/$PID/oom_adj; doneНо правильнее задать очки в самом systemd, в юните для сервиса, этот параметр:
[Service]Собственно это база. По опыту скажу так — если к тебе пришел OOM Killer, сервак можно смело перезагружать. Нихрена там уже не работает, несмотря на всякие очки и коэффициенты. Перезагрузиться будет намного эффективнее, чем пытаться поднять что-то. Поднял, а потом уже по горячим следам и логам, дебаж.
OOMScoreAdjust=-500
Поздравляю, ты только что прокачался еще на один уровень. Хорошего тебе понедельника, да и лёгкой рабочей недели! Увидимся!
tags: #linux
—
Please open Telegram to view this post
VIEW IN TELEGRAM
👍140
День прошел, число сменилось нихуя ничего не изменилось. Привет, коллеги!
Как-то года 3 назад мы настолько устали каждую неделю ремонтировать маунтшары через glusterfs, что было принято решение выкинуть егонахуй и пойти в сторону упрощения. Много что попробовали, но остановились на sshfs.
GlusterFS — это распределённая, параллельная, линейно масштабируемая файловая система с возможностью защиты от сбоев. НУ-НУ😠
SSHFS — это клиентская программа для Linux, используемая для удаленного управления файлами по протоколу SSH таким образом, как будто они находятся на локальном компьютере.
По вводным: у нас есть baremetal сервер с огромными HDD дисками на овер 500 терабайт. На диске хранится статика, которую отдаем через nginx. Задача: подключать этот диск в облачную инфраструктуру к различным нодам. Условия: чтобы работало и не воняло.🤒
Тут все достаточно просто. Даем команду на нужной нам ноде и шара монтируется в папку
Из плюсов: на baremetal сервере не надо устанавливать никакой дополнительный софт, все работает по протоколу ssh.
Но есть нюансы. Допустим если ноду перезагрузить, то всё отвалится. Либо придут сетевые ножницы и оно тоже отвалится.
Запихать в fstab не вариант. Так как на этапе маунта еще нет сети и загрузка сервера просто остановится в попытках примонтировать шару. А ключик reconnect работает как ему захочется, даже если выставить таймауты проверок.
Решение простое, создаем три юнита в systemd.
✅ Первый юнит (АААААРРРРРР!!!!! В пост не влазиет, да и форматирование тут убогое, публикую в телеграфе)
Важно! Файл юнита должен называться в соответствии с путем куда монтируем. Узнать имя можно командой:
✅ Второй юнит
Юнит-файл таймера можно называть как угодно. Но чтобы было понятнее, будем называть также, как и маунт-юнит. Итак, сохраняем в
✅ Третий юнит
Здесь всё просто. Bash строка в ExecStart это bash’евый однострочник, проверяющий наличие маркерного файла mount.yes, при отсутствии которого будет перезапущен маунт-юнит. В более новой версии systemd можно было бы это всё сделать иначе, но зато такой вариант более универсален.
Cохраняем в
Ну и в финале запускаем таймер:
Способ рабочий, полет стабильный более трёх лет. Можешь приспособить к своим каким-то изобретениям и использовать уже юниты, а не закроненные bash скрипты. А шары монтировать через sshfs, а не через вонючий, разваливающийся gluster. Фак еее!🐄
tags: #linux
—
🟢 Подпишись: @bashdays
Как-то года 3 назад мы настолько устали каждую неделю ремонтировать маунтшары через glusterfs, что было принято решение выкинуть его
GlusterFS — это распределённая, параллельная, линейно масштабируемая файловая система с возможностью защиты от сбоев. НУ-НУ
SSHFS — это клиентская программа для Linux, используемая для удаленного управления файлами по протоколу SSH таким образом, как будто они находятся на локальном компьютере.
По вводным: у нас есть baremetal сервер с огромными HDD дисками на овер 500 терабайт. На диске хранится статика, которую отдаем через nginx. Задача: подключать этот диск в облачную инфраструктуру к различным нодам. Условия: чтобы работало и не воняло.
Тут все достаточно просто. Даем команду на нужной нам ноде и шара монтируется в папку
/mnt/storage:sshfs -o compression=no,allow_other,reconnect [email protected]:/storage /mnt/storage
compression - не использовать компрессиюallow_other - разрешить доступ к шаре reconnect - нативный реконект если шара отвалилась Из плюсов: на baremetal сервере не надо устанавливать никакой дополнительный софт, все работает по протоколу ssh.
Но есть нюансы. Допустим если ноду перезагрузить, то всё отвалится. Либо придут сетевые ножницы и оно тоже отвалится.
Запихать в fstab не вариант. Так как на этапе маунта еще нет сети и загрузка сервера просто остановится в попытках примонтировать шару. А ключик reconnect работает как ему захочется, даже если выставить таймауты проверок.
Решение простое, создаем три юнита в systemd.
After=network.target - запускать маунт только после того, как на хосте поднимется сеть[email protected]:/storage - что монтируемWhere=/mnt/storage - куда монтируемВажно! Файл юнита должен называться в соответствии с путем куда монтируем. Узнать имя можно командой:
systemd-escape -p /mnt/storageПервый юнит сохраняем сюда:
/etc/systemd/system/mnt-storage.mount
Теперь нужно сделать юнит проверки, если шара отвалилась. Для начала создаем юнит с таймером:After=mnt-storage.mount - обеспечит запуск таймера после загрузки сервера, но только после того, как маунт юнит будет запущен, то есть после того, как удалённая ФС смонтируется.Unit=mnt-storage.service - какой юнит будем запускать при срабатывании таймера. О нём чуть ниже.OnCalendar=*-*-* *:*:00 - это означает каждую минуту.Юнит-файл таймера можно называть как угодно. Но чтобы было понятнее, будем называть также, как и маунт-юнит. Итак, сохраняем в
/etc/systemd/system/mnt-storage.timer
Теперь нужно создать юнит, который будет заниматься проверкой маунта и его перезапуском при необходимости:Здесь всё просто. Bash строка в ExecStart это bash’евый однострочник, проверяющий наличие маркерного файла mount.yes, при отсутствии которого будет перезапущен маунт-юнит. В более новой версии systemd можно было бы это всё сделать иначе, но зато такой вариант более универсален.
Cохраняем в
/etc/systemd/system/mnt-storage.service
Релодим и активируем systemctl daemon-reloadТретий юнит mnt-storage.service при загрузке сервера активировать не нужно, поскольку этот юнит вызывается таймером mnt-storage.timer. Он будет всегда Active: inactive (dead), это нормально.
systemctl enable mnt-storage.mount
systemctl enable mnt-storage.timer
Ну и в финале запускаем таймер:
systemctl start mnt-storage.timerВот и все! Наша шара успешно взята под контроль, подключена. А в случае отвала по любым причинам, она сама перемонтируется без лишних вопросов. Ну и после перезагрузки ноды, тоже все поднимется из коробки.
Способ рабочий, полет стабильный более трёх лет. Можешь приспособить к своим каким-то изобретениям и использовать уже юниты, а не закроненные bash скрипты. А шары монтировать через sshfs, а не через вонючий, разваливающийся gluster. Фак еее!
tags: #linux
—
Please open Telegram to view this post
VIEW IN TELEGRAM
👍129 1
Доброе утро, наливай кофея и погнали. Щас расскажу, как мы сэкономили кучу денег на тестовой инфраструктуре.
У меня есть 5 тестовых стендов. Каждый стенд это копия продакшена, но с открученными ресурсами и обезличенной базой данных.
Для каждого тестировщика свой отдельный стенд. Чтобы QA между собой непопиздились дрались и не ныли. Каждый стенд включает в себя 5 инстансов: балансировщик, база, фронтэнд, бекэнд, микросервисы. Считаем 5x5=25 серверов. Чето дохуя много. 😐
Все сервера развернуты в Selectel. По итогу в месяц набегает приличная сумма. По бюджету прям заметно кусается.
Думали мы, думали и придумали.
Будем автоматически отключать всю эту ферму на ночь, в выходные и праздники. Но столкнулись с проблемой, что даже выключенные машины — тарифицируются как включенные. Сука. Ладно.... В Selectel так нельзя, а где можно? А можно в Yandex Cloud!
Перетащили полностью тестовую ферму в YC. Накидали бота для slack/mattermost, который будет управлять кнопками включения/выключения. И реализовали такой концепт:
Концепт:
1. Бот взаимодействует с API Yandex Cloud.
2. С 18:00-08:00 реализовано автоматическое отключение фермы.
3. Автоматически отключаем ферму в выходные и праздничные дни (бот взаимодействует с производственным календарем).
4. Если тестировщик желает поработать вне рабочее время, он пишет боту команду и бот включает ему нужные сервера.
5. Если тестировщик забыл выключить сервер, бот проверит, что нет активности (берет метрики с prometheus) и всё погасит.
Есть еще всякие нюансы, но это основной алгоритм. Да. В YC тарифицируются HDD/IP/четотамеще даже если всё погасить, но это копейки.
По итогу если мы раньше платили 500к рублей в месяц только за тестовую инфраструктуру. Сейчас все это дело обходится в 100к, а порой и еще меньше. К примеру если тестировщик ушел в отпуск, то его сервер 2-3-4 недели будет выключен, а мы накопили себе на пивко.
Жалоб со стороны QA отдела не наблюдаем, значит решение рабочее. А сэкономленный бюджет можно смело пустить в дело: пропить либо выписать квартальные премии.
Сегодня закину еще один пост про костыли, правда после нативной интеграции, чото там про ЦОД и сети, от партнера залетит, не обессудьте. Ловите мясного пацана👍
Спасибо коллеги за внимание, увидимся чуть попозже!
tags: #рабочиебудни
—
🟢 Подпишись: @bashdays
У меня есть 5 тестовых стендов. Каждый стенд это копия продакшена, но с открученными ресурсами и обезличенной базой данных.
Для каждого тестировщика свой отдельный стенд. Чтобы QA между собой не
Все сервера развернуты в Selectel. По итогу в месяц набегает приличная сумма. По бюджету прям заметно кусается.
Думали мы, думали и придумали.
Будем автоматически отключать всю эту ферму на ночь, в выходные и праздники. Но столкнулись с проблемой, что даже выключенные машины — тарифицируются как включенные. Сука. Ладно.... В Selectel так нельзя, а где можно? А можно в Yandex Cloud!
Перетащили полностью тестовую ферму в YC. Накидали бота для slack/mattermost, который будет управлять кнопками включения/выключения. И реализовали такой концепт:
Концепт:
1. Бот взаимодействует с API Yandex Cloud.
2. С 18:00-08:00 реализовано автоматическое отключение фермы.
3. Автоматически отключаем ферму в выходные и праздничные дни (бот взаимодействует с производственным календарем).
4. Если тестировщик желает поработать вне рабочее время, он пишет боту команду и бот включает ему нужные сервера.
5. Если тестировщик забыл выключить сервер, бот проверит, что нет активности (берет метрики с prometheus) и всё погасит.
Есть еще всякие нюансы, но это основной алгоритм. Да. В YC тарифицируются HDD/IP/четотамеще даже если всё погасить, но это копейки.
По итогу если мы раньше платили 500к рублей в месяц только за тестовую инфраструктуру. Сейчас все это дело обходится в 100к, а порой и еще меньше. К примеру если тестировщик ушел в отпуск, то его сервер 2-3-4 недели будет выключен, а мы накопили себе на пивко.
Жалоб со стороны QA отдела не наблюдаем, значит решение рабочее. А сэкономленный бюджет можно смело пустить в дело: пропить либо выписать квартальные премии.
Сегодня закину еще один пост про костыли, правда после нативной интеграции, чото там про ЦОД и сети, от партнера залетит, не обессудьте. Ловите мясного пацана
Спасибо коллеги за внимание, увидимся чуть попозже!
tags: #рабочиебудни
—
Please open Telegram to view this post
VIEW IN TELEGRAM
👍138 1
Про костыли. Ну а как ты хотел? У нас тут про такое будет ой как много. Это в идеальном мире есть кодстайл, кубернейтс с аптаймом 100500%, кодревью, юнит-тесты и т.п. А в реальном мире дела обстоят иначе.
Короче, кейс. Есть у меня клиент, у клиента есть RabbitMQ.
RabbitMQ — программный брокер сообщений на основе стандарта AMQP — тиражируемое связующее программное обеспечение, ориентированное на обработку сообщений.
Если уже совсем простыми словами — это аналог почтового ящика, люди туда скидывают письма, утром приходит почтальон, забирает письма и доставляет адресатам.
В RabbitMQ есть очередь, в очередь попадают транзакционные письма, которые неспешно нужно отправить пользователям. Очередь обрабатывается микросервисом, который написан в 90е года на каком-то форке perl’а, дада именно так! Тот кто его писал, давным-давно нянчит внуков, либо кормит рыб📺
В какой-то момент этот микро-сервис -динозавр начинает троить и просто зависает при работе по протоколу amqp. Хотя визуально с ним все в порядке, в логах ошибок нет, собственно как нет и самих логов. Просто он в какой-то момент перестает выгребать очередь и на этом всё!
Поддерживать этот микросервис никто не хочет, но скорее всего просто не может. Переписывать тоже нет времени, нужно решение здесь и сейчас, как говорят блогеры — решение в моменте.Ебанутая Плохая фраза, да!
Ну раз клиент просит быстро решить проблему и согласен на костыли, да пожалуйста! Пишем ему bash'ник, забираем 50к рублей и идем пить чай/кофе/смузи/пиво.
Скрипт работает в кроне на сервере рядом с микросервисом. Запускается каждые полчаса. После запуска, он подключается по ssh к серверу с очередями RabbitMQ. Проверяет общее количество писем в очереди email.send.mass. Если писем скопилось более 500, то значит ПРИПЛЫЛИ!
Оператор
А конструкция su - amqp-daemon -c означает, что запускаем команды от пользователя amqp-daemon
Ну а далее срабатывает логика перезапуска микросервиса, остановка и запуск.
Профит. Клиент доволен как слон, а мы при деньгах.💰
Не забывыем прописать ssh public ключи, чтобы скрипт мог ходить на другие сервера без пароля. Ну про это ты должен знать. Если не знаешь, то обязательно погугли как работают ssh ключи, это база.
Также можно сюда прикрутить логирование, оповещения, экспортер в prometheus и на графиках в grafana все красиво вывести. Когда чо упало, когда перезапустилось, пустая ли очередь и т.п.
Переработав этот скрипт под свои нужды, можно получать вообще любые данные с любых серверов, не используя экспортеры. Ну и в дальнейшем строить логику в скрипте на этих данных. А самое главное это быстро реализуемо. Костыльно? Конечно! Но клиент всегда прав, а богатый клиент прав в двойне. Рабочие будни😎
С пятницей ребят! Всем хороших предстоящих выходных и самое главное — берегите себя.
tags: #bash
—
🟢 Подпишись: @bashdays
Короче, кейс. Есть у меня клиент, у клиента есть RabbitMQ.
RabbitMQ — программный брокер сообщений на основе стандарта AMQP — тиражируемое связующее программное обеспечение, ориентированное на обработку сообщений.
Если уже совсем простыми словами — это аналог почтового ящика, люди туда скидывают письма, утром приходит почтальон, забирает письма и доставляет адресатам.
В RabbitMQ есть очередь, в очередь попадают транзакционные письма, которые неспешно нужно отправить пользователям. Очередь обрабатывается микросервисом, который написан в 90е года на каком-то форке perl’а, дада именно так! Тот кто его писал, давным-давно нянчит внуков, либо кормит рыб
В какой-то момент этот микро-
Поддерживать этот микросервис никто не хочет, но скорее всего просто не может. Переписывать тоже нет времени, нужно решение здесь и сейчас, как говорят блогеры — решение в моменте.
Ну раз клиент просит быстро решить проблему и согласен на костыли, да пожалуйста! Пишем ему bash'ник, забираем 50к рублей и идем пить чай/кофе/смузи/пиво.
#!/bin/bashРазбор скрипта:
COUNT_Q=$(ssh user@bashdayz-d1 rabbitmqctl list_queues | grep 'email.send.mass'|awk '{print $2}')
if [ $COUNT_Q -gt 500 ]
then
su - amqp-daemon -c "cd ~/daemon && daemon.pl stop"
su - amqp-daemon -c "cd ~/daemon && daemon.pl start"
fi
Скрипт работает в кроне на сервере рядом с микросервисом. Запускается каждые полчаса. После запуска, он подключается по ssh к серверу с очередями RabbitMQ. Проверяет общее количество писем в очереди email.send.mass. Если писем скопилось более 500, то значит ПРИПЛЫЛИ!
Оператор
-gt в bash означает: БольшеА конструкция su - amqp-daemon -c означает, что запускаем команды от пользователя amqp-daemon
Ну а далее срабатывает логика перезапуска микросервиса, остановка и запуск.
Профит. Клиент доволен как слон, а мы при деньгах.
Не забывыем прописать ssh public ключи, чтобы скрипт мог ходить на другие сервера без пароля. Ну про это ты должен знать. Если не знаешь, то обязательно погугли как работают ssh ключи, это база.
Также можно сюда прикрутить логирование, оповещения, экспортер в prometheus и на графиках в grafana все красиво вывести. Когда чо упало, когда перезапустилось, пустая ли очередь и т.п.
Переработав этот скрипт под свои нужды, можно получать вообще любые данные с любых серверов, не используя экспортеры. Ну и в дальнейшем строить логику в скрипте на этих данных. А самое главное это быстро реализуемо. Костыльно? Конечно! Но клиент всегда прав, а богатый клиент прав в двойне. Рабочие будни
С пятницей ребят! Всем хороших предстоящих выходных и самое главное — берегите себя.
tags: #bash
—
Please open Telegram to view this post
VIEW IN TELEGRAM
👍127 2 1
Утречка всем! Не думал, что буду в выходные пилить посты, но чо поделаешь, работа есть работа. Пользуешься VIM? Тогда лови крутую разработку от очередного упоротого гика.
Если педаль нажата, редактор находится в режиме вставки текста. При отпускании, переходит в обычный режим. Автор проекта планировал добавить еще пару педалей для более продуктивной работы. Но чет не фартануло. А я бы еще руль😭 для перемещения по тексту прикрутил и коробку передач для повышения KPI.
Чем бы дитя ни тешилось. И это не шутка, это реальность. Посмотреть можешь на гитхабе. Проект как я понял давно не развивается, но возможно ты подхватишь идею и приладишь к vim свой гитарный свитчер на 5 кнопок.
После интеграции от партнера, залетит еще один интересный и необычный пост, ожидайте...
tags: #рабочиебудни
—
🟢 Подпишись: @bashdays
Если педаль нажата, редактор находится в режиме вставки текста. При отпускании, переходит в обычный режим. Автор проекта планировал добавить еще пару педалей для более продуктивной работы. Но чет не фартануло. А я бы еще руль
Чем бы дитя ни тешилось. И это не шутка, это реальность. Посмотреть можешь на гитхабе. Проект как я понял давно не развивается, но возможно ты подхватишь идею и приладишь к vim свой гитарный свитчер на 5 кнопок.
После интеграции от партнера, залетит еще один интересный и необычный пост, ожидайте...
tags: #рабочиебудни
—
Please open Telegram to view this post
VIEW IN TELEGRAM
👍84
Еще раз привет всем отдыхающим! Грузить не буду, всё по делу и быстренько, приключений на 5 минут. Иначе никак 🚑
Решил я упороться и упоролся. Захотелось мне короче прям из консоли вызывать всплывающую подсказку по хоткею. Нажал хоткей появилась справка-шпаргалка, отпустил и она закрылась.
ДА! Прям из консоли! Так как иксов на серверах нет, нужно было идти другим путем, а путь оказался ну совсем неочевидный. Я до сих пор не понимаю, почему такая больная мысль меня посетила, видимо задачи в бэклоге закончились и стало скучно.
Проштудировав документацию по readline, янихуя не понял ничего не нашел, видимо там нет нужных механизмов позволяющих определять нажата ли клавиша или отпущена.
Readline — библиотека GNU Project, которую Bash и другие программы с CLI-интерфейсом используют для взаимодействия с командной строкой.
Но нет ничего невозможного, раз readline шлет меня в жопу, повесим read на стандартный ввод. Когда клавиша будет отпущена, read вернет ошибку и выполнение скрипта перейдет к следующей инструкции, ну и по итогу скрипт завершится.
Если кто-то тебе говорит — это сделать невозможно! Он либопиздит врет либо просто не хочет этим заниматься. Всё можно сделать, было бы желание!
Ничего не понял? Забей, это мысли в слух, главное реализация, а не скучная теория. В общем пишем скрипт и кидаем его в
Кратенько:
Далее прописываем бинд в
😑 либо что-то еще полезное.
Как повторить для zsh, ХЗ, я не разбирался. Если будут наработки, скидывайте в бота, сделаю отдельный пост.
Ну и для гиков, кто хочет покопаться поглубже, можешь зама́нить и захелпить:
✅ ВИДЕО КАК ЭТО РАБОТАЕТ
tags: #bash
—
🟢 Подпишись: @bashdays
Решил я упороться и упоролся. Захотелось мне короче прям из консоли вызывать всплывающую подсказку по хоткею. Нажал хоткей появилась справка-шпаргалка, отпустил и она закрылась.
ДА! Прям из консоли! Так как иксов на серверах нет, нужно было идти другим путем, а путь оказался ну совсем неочевидный. Я до сих пор не понимаю, почему такая больная мысль меня посетила, видимо задачи в бэклоге закончились и стало скучно.
Проштудировав документацию по readline, я
Readline — библиотека GNU Project, которую Bash и другие программы с CLI-интерфейсом используют для взаимодействия с командной строкой.
Но нет ничего невозможного, раз readline шлет меня в жопу, повесим read на стандартный ввод. Когда клавиша будет отпущена, read вернет ошибку и выполнение скрипта перейдет к следующей инструкции, ну и по итогу скрипт завершится.
Если кто-то тебе говорит — это сделать невозможно! Он либо
Ничего не понял? Забей, это мысли в слух, главное реализация, а не скучная теория. В общем пишем скрипт и кидаем его в
/usr/local/sbin/cheat_shit.sh чмодим chmod +x cheat_shit.sh чтобы он в экзешник превратился.#!/bin/bashОЧЕНЬ СТРАШНО! Держу пари мало кто про такое вообще слышал и тем более видел. Но такое в bash вполне реализуемо и в школе такому не научат.
tput civis
tput smcup
tput cup 0 0
trap 'tput rmcup;tput cvvis' EXIT
echo 'Hello,this is Cheat-Shit'
echo '------------------------'
echo 'а тут можешь написать всё, что захочешь'
echo '------------------------'
echo 'source: https://t.iss.one/bashdays'
read -srn1 -t 0.7
while read -srn1 -t 0.1
do
:
done
exit
Кратенько:
tput civis = скрываем курсорtput smcup = переходим на альтернативный экранtput cup 0 0 = переводим курсор в начало строкиtrap 'tput…' = после выхода зачищаем весь мусорДалее прописываем бинд в
~/.bashrc и вешаем вызов скрипта на CTRL+hbind -x '"\C-h":"/usr/local/sbin/cheat_shit.sh"'Перезапускаем сессию. Теперь при нажатии CTRL+h у меня поверх рабочей консоли открывается попап с нужным мне текстом. В тексте может быть шпаргалка либо котик
Как повторить для zsh, ХЗ, я не разбирался. Если будут наработки, скидывайте в бота, сделаю отдельный пост.
Ну и для гиков, кто хочет покопаться поглубже, можешь зама́нить и захелпить:
man 3 readlineПомимо шпаргалки по хоткею, ты можешь запустить вообще любой скрипт. Тут уже зависит от полета фантазии. Больше не смею тебя отвлекать, спасибо за внимание. Давай пять и погнали дальше отдыхать!
man bash (раздел readline)
man tput
man stty
help trap
help read
help bind
man 5 terminfo
tags: #bash
—
Please open Telegram to view this post
VIEW IN TELEGRAM
👍154 1 1
Вот и август на носу, еще совсем чуть-чуть и снова новый год. Как говорится — дорогу осилит идущий. Так что не останавливаемся и продолжаем изучать новое.
Сегодня покажу вкусный трюк, как узнать физическое расположение файла на диске. Нет, не его путь, а именно в какой области жесткого диска этот файл находится. Поехали.🏃♂️
Создаём подопытный файл:
sync — утилита Unix, предназначенная для обновления файловых систем и для синхронизации данных на диске с данными в памяти. При этом выполняется системный вызов sync, который вызывает запись всех буферизованных изменений метаданных файлов и данных в базовые файловые системы. Он гарантирует, что все, что хранилось в памяти, будет записано на диск, предотвращая потерю данных, хранящихся в кеше, при аварийном завершении работы.
Так, файл успешно создан, давай посмотрим что внутри:
После выполнения команды, смотрим результат. Нам важна колонка: physical_offset в моём случае я получил такие значения:
По итогу запуска, я получаю ту же картину. Только без применения сторонних утилит вроде cat и т.п..
Полезно? Полезно! Для чего это можно применить? Нууу не знаю, коллега к примеру таким образом восстанавливал базу данных, которую в пятницу вечером решили случайно удалить. А бэкапы съели мыши.🐁 Кстати успешно восстановил. Ну это уже лирика…
Очередную порцию полезных знаний я тебе выдал, ставь лайк, изучай. Увидимся!😻
tags: #linux #bash
—
🟢 Подпишись: @bashdays
Сегодня покажу вкусный трюк, как узнать физическое расположение файла на диске. Нет, не его путь, а именно в какой области жесткого диска этот файл находится. Поехали.
Создаём подопытный файл:
printf '%s\n' {a..d} > /tmp/test.txt
либо так:echo {a..d} > /tmp/test.txt
После создания файла, нужно запустить команду sync, но можно и не запускать, спустя несколько секунд linux сам всё нужное сделает. Я запускаю, потому что мне важна чистота эксперимента.sync — утилита Unix, предназначенная для обновления файловых систем и для синхронизации данных на диске с данными в памяти. При этом выполняется системный вызов sync, который вызывает запись всех буферизованных изменений метаданных файлов и данных в базовые файловые системы. Он гарантирует, что все, что хранилось в памяти, будет записано на диск, предотвращая потерю данных, хранящихся в кеше, при аварийном завершении работы.
Так, файл успешно создан, давай посмотрим что внутри:
cat /tmp/test.txtОк. Теперь давай узнаем физическое расположение файла на диске, для этого запускай команду:
abcd
filefrag -b512 -v /tmp/test.txtПрограмма filefrag (из пакета e2fsprogs) показывает насколько сильно фрагментирован файл.
После выполнения команды, смотрим результат. Нам важна колонка: physical_offset в моём случае я получил такие значения:
4612136..4612143Отлично. Теперь я знаю точное расположение файла на жестком диске. А давай прочитаем его прям с диска! Для этого стартуем:
sudo dd if=/dev/sda1 skip=4612136 status=none count=8Важно правильно указать свой диск /dev/sdX. Ну и в параметр skip подставить первое значение из колонки physical_offset
По итогу запуска, я получаю ту же картину. Только без применения сторонних утилит вроде cat и т.п..
abcdНу и вишенка. Если я удалю файл
rm /tmp/test.txt и затем выполню предыдущую команду:sudo dd if=/dev/sda1 skip=4612136 status=none count=8То получу тот же вывод «abcd», потому что файл на диске продолжает лежать и занимать место. Это визуально он исчез, чтобы тебе глаза не мозолить. Но зная его physical_offset вполне можно до него дотянутся и восстановить при желании.
Полезно? Полезно! Для чего это можно применить? Нууу не знаю, коллега к примеру таким образом восстанавливал базу данных, которую в пятницу вечером решили случайно удалить. А бэкапы съели мыши.
Очередную порцию полезных знаний я тебе выдал, ставь лайк, изучай. Увидимся!
tags: #linux #bash
—
Please open Telegram to view this post
VIEW IN TELEGRAM
👍255
Мой каррент муд на сегодня «голова два уха». Но оставить тебя без новых знаний, я не в праве. Так что сегодня будем прикручивать новогоднюю гирлянду к логам. Летс мазафака го! 🕺
У меня в арсенале имеется ELK, но его в основном используют наши разработчики, которые привыкли мышкой натыкивать простые запросы. А я угораю по олдскулу, захожу на нужный мне сервер и тейлю/грепаю логи прям в консоли.
Какие-то особые инциденты конечно же разгребаю в ELK, но это бывает очень редко.
ELK – это аббревиатура, используемая для описания стека из трех популярных проектов: Elasticsearch, Logstash и Kibana. Стек ELK, зачастую именуемый Elasticsearch, предоставляет возможность собирать журналы всех ваших систем и приложений, анализировать их и создавать визуализации, чтобы мониторить приложения и инфраструктуры, быстрее устранять неполадки, анализировать систему безопасности и многое другое.
Минус консольных логов — все серо и бездушно, все сливается в одну портянку, приходится порой тушить жопу и закапывать глазики «артелаком».📺
Но это решаемо. Есть прекрасная утилита под названием ccze. Это незаменимый помощник, который раскрасит твои логи в цвета новогодней елки. И самое главное выделит красным цветом все ошибки.
В стандартные пакеты linux эта утилита не входит, так что тут нужно ее установить командой:
Вместо cat можно иcпользовать и tail, чтобы логи бежали в реальном времени. Я к примеру при дебаге использую исключительно tail.
Ура, теперь у нас настоящая новогодняя ёлка! От серых будней ничего не осталось, все чётенько, по цветам, ошибки промаркированы. Пушка!
А самая приятная киллер-фича этой утилиты, это то, что я могу записать логи в html файл. А затем передать этот файл разработчикам, которые частенько приходят с просьбой — Олег, выгрузи нам пожалуйста последние 500 строк.
У утилиты ccze есть много других ключей, а также присутствует поддержка плагинов. Но я пользуюсь функционалом из коробки. Список доступных плагинов можно глянуть командой:
✅ Картинка с ccze
В следующем посте расскажу как быстро передавать разработчикам подобные файлы, не мучаясь со скачиванием их на локальную машину, а затем приседать с пересылкой через слак/маттермост.
Давай краба, подписывайся, тыкай палец вверх, увидимся!
tags: #linux #utils
—
🟢 Подпишись: @bashdays
У меня в арсенале имеется ELK, но его в основном используют наши разработчики, которые привыкли мышкой натыкивать простые запросы. А я угораю по олдскулу, захожу на нужный мне сервер и тейлю/грепаю логи прям в консоли.
Какие-то особые инциденты конечно же разгребаю в ELK, но это бывает очень редко.
ELK – это аббревиатура, используемая для описания стека из трех популярных проектов: Elasticsearch, Logstash и Kibana. Стек ELK, зачастую именуемый Elasticsearch, предоставляет возможность собирать журналы всех ваших систем и приложений, анализировать их и создавать визуализации, чтобы мониторить приложения и инфраструктуры, быстрее устранять неполадки, анализировать систему безопасности и многое другое.
Минус консольных логов — все серо и бездушно, все сливается в одну портянку, приходится порой тушить жопу и закапывать глазики «артелаком».
Но это решаемо. Есть прекрасная утилита под названием ccze. Это незаменимый помощник, который раскрасит твои логи в цвета новогодней елки. И самое главное выделит красным цветом все ошибки.
В стандартные пакеты linux эта утилита не входит, так что тут нужно ее установить командой:
apt/yum install ccze
Ну а после установки, применяем на практике:cat /var/log/syslog | ccze -AКлюч
-A = Generate raw ANSI outputВместо cat можно иcпользовать и tail, чтобы логи бежали в реальном времени. Я к примеру при дебаге использую исключительно tail.
tail -f /var/log/syslog | cczetail позволяет выводить новые строки в интерактивном режиме, либо выводить заданное количество строк с конца файла.
Ура, теперь у нас настоящая новогодняя ёлка! От серых будней ничего не осталось, все чётенько, по цветам, ошибки промаркированы. Пушка!
А самая приятная киллер-фича этой утилиты, это то, что я могу записать логи в html файл. А затем передать этот файл разработчикам, которые частенько приходят с просьбой — Олег, выгрузи нам пожалуйста последние 500 строк.
tail -n 500 /var/log/auth.log | ccze -h > ~/log.htmlРаз и готов html файл, который можно открыть в браузере и посмотреть как иностранные бедолаги с дикого запада пытались подобрать пароль на 22 порт. И всё это будет в цвете!
У утилиты ccze есть много других ключей, а также присутствует поддержка плагинов. Но я пользуюсь функционалом из коробки. Список доступных плагинов можно глянуть командой:
ccze -lНу а если есть желание что-то там перепилить по цветам и т.п. всё это можно сделать в конфигурационном файле:
/etc/cczerc
Короче бери на вооружение, утилита мастхев. Картинка к посту опять не влезла, заливаю на телеграф, чтобы ты смог посмотреть на эту новогоднюю гирлянду и решить, что она тебе тоже ой как необходима.В следующем посте расскажу как быстро передавать разработчикам подобные файлы, не мучаясь со скачиванием их на локальную машину, а затем приседать с пересылкой через слак/маттермост.
Давай краба, подписывайся, тыкай палец вверх, увидимся!
tags: #linux #utils
—
Please open Telegram to view this post
VIEW IN TELEGRAM
👍212
Пятница и «Международный день пива» прям подкосили. Спасибо, но в следующем году я на этот фестиваль не куплюсь ❤️
Сегодня пусть и выходной, но это ничего не меняет. Поведаю про фичу с помощью которой можно легко передавать разработчикам нужные им файлы с серверов.
Частенько меня просят скинуть какой-нибудь огрызок лога, выгрузку и т.п. Тут алгоритм простой:
- зашел на сервер по ssh
- нашел/сделал то, что нужно передать
- если файл большой, то сжать
- вспомнить синтаксис scp
- на локальной машине натыкать команду чтобы забрать себе этот файл
- скинуть файл человеку в слак/маттермост
- если файл большой, выложить его на корпоративный google drive
- скинуть человеку ссылку на файл на корпоративном диске
scp (Secure CoPy) — утилита для безопасного копирования данных между Linux-системами по протоколу SSH
Тут подходит фраза из мема: вот этонихуя ничего себе! 😳 Ладно если это делаешь раз в месяц. Но если такое происходит пару раз в неделю, то ощущаются первые нотки выгорания.
Все гениальные вещи придумали ленивые люди. А мы с тобой одни из них. Поэтому бо́льшую часть я успешно автоматизировал через bash.
А вот и сам скрипт. Обзови его trans и закинь в /usr/local/sbin. Ну и не забывай про
Запускается всё это безобразие так: trans <файл>
1. Если размер файла > 1 мб, то сжимаем
2. После сжатия загружаем файл в сервис transfer.sh
3. Подчищаем за собой
4. Если файл < 1 мб, то просто загружаем как есть в тот же сервис transfer.sh
5. После загрузки в консоль выводится ссылка для скачивания
6. Копируем полученную ссылку и передаем разработчику
7. Профит. Минимум действий, максимум удобства
Сервис transfer.sh это очень удобная и простая штука, которая позволяет обмениваться файлами с помощью curl/wget. Без регистрации и смс. Лимиты приличные 10гигов на файл, 14 дней хранятся на сервере. Есть возможность зашифровать перед отправкой и проверить на вирусы. И все это бесплатно.
А еще в curl можно передать заголовки -H "Max-Downloads: 1" -H "Max-Days: 5" и тогда файл разрешат скачать только один раз, а через пять дней он сам удалится. Пожалуй очень удобно.
Тут конечно возникает вопрос — эммм, но это же не безопасно? Конечно не безопасно, поэтому годится лишь для передачи какой-то некритичной информации. А я передаю чисто логи, в них ничего критичного нет.
Ну а если хочется передать сканы документов или реквизиты банковских карт, то в мой скрипт ты можешь встроить gpg шифрование. Либо переделать сжатие на 7z и зашифровать по максимуму. Но опять же не рекомендую, лучше передавай важные документы другим, более безопасным способом.
Мысли в слух: Вот есть корпоративный google диск, хранишь ты там абсолютно всё, включая секреты компании. Безопасно? НЕТ! Гугол давно уже у тебя всё спёр и всё про всех знает. Так что можно булки расслабить и перестать параноить. Ладно, опять в лирику ударились.
Короче бери на заметку, дорабатывай, переделывай. Можешь добавить xclip/pbcopy чтобы ссылка автоматом в буфер обмена копировалась. Ну и зайди на сайт transfer.sh и посмотри все возможности, которые они предоставляют. Там все с примерами, разберется любой.
А можно создать приватный телеграм/слак/маттермост канал, добавить туда разработчиков и в скрипте прикрепить отправку ссылки в этот канал. Тогда даже ссылку не нужно будет руками копировать и передавать разработчику, максимальная автоматизация.
Удобно? Удобно! А главное максимально просто. Хорошо тебе провести остаток выходных, ну и увидимся!
tags: #bash #services
—
🟢 Подпишись: @bashdays
Сегодня пусть и выходной, но это ничего не меняет. Поведаю про фичу с помощью которой можно легко передавать разработчикам нужные им файлы с серверов.
Частенько меня просят скинуть какой-нибудь огрызок лога, выгрузку и т.п. Тут алгоритм простой:
- зашел на сервер по ssh
- нашел/сделал то, что нужно передать
- если файл большой, то сжать
- вспомнить синтаксис scp
- на локальной машине натыкать команду чтобы забрать себе этот файл
scp -r user@bashdayz:/tmp/nginx.log /home/user/tmp/ - скинуть файл человеку в слак/маттермост
- если файл большой, выложить его на корпоративный google drive
- скинуть человеку ссылку на файл на корпоративном диске
scp (Secure CoPy) — утилита для безопасного копирования данных между Linux-системами по протоколу SSH
Тут подходит фраза из мема: вот это
Все гениальные вещи придумали ленивые люди. А мы с тобой одни из них. Поэтому бо́льшую часть я успешно автоматизировал через bash.
А вот и сам скрипт. Обзови его trans и закинь в /usr/local/sbin. Ну и не забывай про
chmod +x /usr/local/sbin/trans.Запускается всё это безобразие так: trans <файл>
#!/bin/bashЛогика такая:
SIZE=1000000
if [ -n "$(find "$1" -prune -size +"$SIZE"c)" ]; then
tar -czvf /tmp/$1.tar.gz $1
curl --upload-file /tmp/$1.tar.gz https://transfer.sh/$1.tar.gz
rm /tmp/$1.tar.gz
else
curl --upload-file $1 https://transfer.sh/$1
fi
1. Если размер файла > 1 мб, то сжимаем
2. После сжатия загружаем файл в сервис transfer.sh
3. Подчищаем за собой
4. Если файл < 1 мб, то просто загружаем как есть в тот же сервис transfer.sh
5. После загрузки в консоль выводится ссылка для скачивания
6. Копируем полученную ссылку и передаем разработчику
7. Профит. Минимум действий, максимум удобства
Сервис transfer.sh это очень удобная и простая штука, которая позволяет обмениваться файлами с помощью curl/wget. Без регистрации и смс. Лимиты приличные 10гигов на файл, 14 дней хранятся на сервере. Есть возможность зашифровать перед отправкой и проверить на вирусы. И все это бесплатно.
А еще в curl можно передать заголовки -H "Max-Downloads: 1" -H "Max-Days: 5" и тогда файл разрешат скачать только один раз, а через пять дней он сам удалится. Пожалуй очень удобно.
Тут конечно возникает вопрос — эммм, но это же не безопасно? Конечно не безопасно, поэтому годится лишь для передачи какой-то некритичной информации. А я передаю чисто логи, в них ничего критичного нет.
Ну а если хочется передать сканы документов или реквизиты банковских карт, то в мой скрипт ты можешь встроить gpg шифрование. Либо переделать сжатие на 7z и зашифровать по максимуму. Но опять же не рекомендую, лучше передавай важные документы другим, более безопасным способом.
Мысли в слух: Вот есть корпоративный google диск, хранишь ты там абсолютно всё, включая секреты компании. Безопасно? НЕТ! Гугол давно уже у тебя всё спёр и всё про всех знает. Так что можно булки расслабить и перестать параноить. Ладно, опять в лирику ударились.
Короче бери на заметку, дорабатывай, переделывай. Можешь добавить xclip/pbcopy чтобы ссылка автоматом в буфер обмена копировалась. Ну и зайди на сайт transfer.sh и посмотри все возможности, которые они предоставляют. Там все с примерами, разберется любой.
А можно создать приватный телеграм/слак/маттермост канал, добавить туда разработчиков и в скрипте прикрепить отправку ссылки в этот канал. Тогда даже ссылку не нужно будет руками копировать и передавать разработчику, максимальная автоматизация.
Удобно? Удобно! А главное максимально просто. Хорошо тебе провести остаток выходных, ну и увидимся!
tags: #bash #services
—
Please open Telegram to view this post
VIEW IN TELEGRAM
👍138
И снова здравствуй. Разбирался я тут на досуге с доменной зоной .to Моей целью было получить значение Expires on. То есть дату, до которой нужно продлить домен.
Как мы обычно делаем? Запускаем команду
Отправляемся на раскопки.
Существует корневой whois сервер не для доменов, а для зон. Называется он whois.iana.org. С помощью него можно получить данные по конкретной зоне, контакты, телефоны и т.п.
Проверяю нужную мне зону .to
😐
Ладно, я парень настырный. Пробую так:
В ответе вижу строчку:
Натыкаюсь на такой пункт: Предоставляет ли Tonic услугу whois? Компания Tonic не поддерживает базу данных whois, содержащую информацию о владельцах регистраций, поскольку многие наши клиенты считают, что публичное размещение такой информации нарушает их частную жизнь. Более того, мы никогда не будем продавать списки рассылки наших клиентов.
Приехали. Но чуть ниже вижу: всю доступную информацию по домену, ты можешь попробовать получить по ссылке: https://www.tonic.to/whois?best.to
А давай попробуем, вариантов у нас не много:
😎
После плановой интеграции про тимлидов, закину тебе еще какое-нибудь интересное чтиво. На связи!
tags: #networks
—
🟢 Подпишись: @bashdays
Как мы обычно делаем? Запускаем команду
whois <domain> и получаем желаемое. Но это не работает с доменной зоной .to. Если не веришь, можешь самостоятельно убедиться. Получишь массу информации, но никак не значение Expires on.Отправляемся на раскопки.
Существует корневой whois сервер не для доменов, а для зон. Называется он whois.iana.org. С помощью него можно получить данные по конкретной зоне, контакты, телефоны и т.п.
Проверяю нужную мне зону .to
whois to -h whois.iana.orgОтдается куча информации. И что мне с этим делать?
whois: whois.tonic.to
status: ACTIVE
remarks: Registration information: https://www.tonic.to/
created: 1995-12-18
changed: 2022-06-01
source: IANA
Ладно, я парень настырный. Пробую так:
whois best.to -h whois.tonic.toПолучаю тот же ответ что и раньше, ну нет нигде Expires on, шляпа какая-то.
В ответе вижу строчку:
remarks: Registration information: https://www.tonic.to/
Ок. Раз ничего не получается, самое время идти читать документацию, может в ней будет что-то полезное.Натыкаюсь на такой пункт: Предоставляет ли Tonic услугу whois? Компания Tonic не поддерживает базу данных whois, содержащую информацию о владельцах регистраций, поскольку многие наши клиенты считают, что публичное размещение такой информации нарушает их частную жизнь. Более того, мы никогда не будем продавать списки рассылки наших клиентов.
Приехали. Но чуть ниже вижу: всю доступную информацию по домену, ты можешь попробовать получить по ссылке: https://www.tonic.to/whois?best.to
А давай попробуем, вариантов у нас не много:
curl https://www.tonic.to/whois?best.toОПА! Есть контакт, Expires on как на ладони. Можно двигать таску в Done и писать экспортер для prometheus. И возможно однажды alertmanager вовремя сообщит, что стоило бы продлить домен, но это не точно
<pre>
Domain: best.to
Created on: Fri Apr 23 02:27:04 2021
Last edited on: Sat May 27 06:48:58 2023
Expires on: Sun Apr 28 07:33:28 2024
Primary host add: None
Primary host name: ns-494.awsdns-61.com
Secondary host add: None
Secondary host name: ns-1424.awsdns-50.org
END
После плановой интеграции про тимлидов, закину тебе еще какое-нибудь интересное чтиво. На связи!
tags: #networks
—
Please open Telegram to view this post
VIEW IN TELEGRAM
👍105
Пилил я как-то задачу связанную с мониторингом тестового сервера. С одной стороны ну что там сложного, воткнул везде node_exporter и вперед, пусть prometheus ходит и забирает с них метрики. Всё логично.
Но есть закон подлости: если оценить задачу в 5 минут, то обязательно вылезут подводные камни. Собственно они и вылезли. Сейчас расскажу.
Тестовый сервер представляет нечто подобное:
🤒
Уффф. Пошел смотреть в сторону pushgateway, чтобы инстансы сами метрики пушили в prometheus или сразу в VictoriaMetrics.
VictoriaMetrics — быстрая и масштабируемая СУБД для хранения и обработки данных в форме временного ряда (запись образует время и набор соответствующих этому времени значений, например, полученных через периодический опрос состояния датчиков или сбор метрик).
Но тут снова грабли. У prometheus тоже нет белого айпи. Это провал! Какой-то замкнутый круг получается. Забрать метрики не можем, отдать тоже не можем.
Выдавать белые айпишники ой как не хочется, по причине — лень настраивать фаерволы и прочую шляпу. Но что же делать? Правильно — достаём костыли!
Так как у тестовых серверов на [балансировщике] есть белый ip адрес, будем привлекать iptables и жёстко роутить.
На балансировщике с белым ip, выполняем:
А в prometheus говорим, иди на внешний айпишник балансировщика с портами 1001-1003 и выгребай данные с серых инстансов.
prometheus.yml
🧠
tags: #рабочиебудни #monitoring #networks
—
🟢 Подпишись: @bashdays
Но есть закон подлости: если оценить задачу в 5 минут, то обязательно вылезут подводные камни. Собственно они и вылезли. Сейчас расскажу.
Тестовый сервер представляет нечто подобное:
- балансировщик (белый айпишник)У [балансировщика] есть белый айпишник, у остальных (фронтэнд, бекэнд, база) только серые. Хм… ну и как prometheus будет ходить на серые инстансы и забирать метрики? Да никак!
- фронтэнд (192.168.0.3)
- бекэнд (192.168.0.4)
- база (192.168.0.5)
Уффф. Пошел смотреть в сторону pushgateway, чтобы инстансы сами метрики пушили в prometheus или сразу в VictoriaMetrics.
VictoriaMetrics — быстрая и масштабируемая СУБД для хранения и обработки данных в форме временного ряда (запись образует время и набор соответствующих этому времени значений, например, полученных через периодический опрос состояния датчиков или сбор метрик).
Но тут снова грабли. У prometheus тоже нет белого айпи. Это провал! Какой-то замкнутый круг получается. Забрать метрики не можем, отдать тоже не можем.
Выдавать белые айпишники ой как не хочется, по причине — лень настраивать фаерволы и прочую шляпу. Но что же делать? Правильно — достаём костыли!
Так как у тестовых серверов на [балансировщике] есть белый ip адрес, будем привлекать iptables и жёстко роутить.
На балансировщике с белым ip, выполняем:
-A PREROUTING -p tcp -m tcp --dport 1001 -j DNAT --to-destination 192.168.0.3:9100Идея заключается в том, что с портов 1001-1003 (на балансировщике) мы попадаем на внутренние инстансы с серыми айпишниками и забираем свои метрики с портов 9100.
-A PREROUTING -p tcp -m tcp --dport 1002 -j DNAT --to-destination 192.168.0.4:9100
-A PREROUTING -p tcp -m tcp --dport 1003 -j DNAT --to-destination 192.168.0.5:9100
-A POSTROUTING -j MASQUERADE
А в prometheus говорим, иди на внешний айпишник балансировщика с портами 1001-1003 и выгребай данные с серых инстансов.
prometheus.yml
---Красота! Кейс рабочий, костыли присутствуют, графики красивые, тестировщики довольные. Ну а что еще надо? Think different!
- targets:
- balancer:1001
labels:
env: test
role: frontend
- targets:
- balancer:1002
labels:
env: test
role: backend
tags: #рабочиебудни #monitoring #networks
—
Please open Telegram to view this post
VIEW IN TELEGRAM
👍131 1
Не думал что этот вопрос настолько актуален — почему перестают работать очевидные правила iptables на хостовой машине, если на сервере запущены какие-либо docker контейнеры?
Давай разбираться.
Если коротко, то когда ты запускаешь docker контейнеры, то все начинает работатьчерез жопу по правилам маршрутизации самого docker’а. И плевать он хотел что у тебя там на хостовой машине было ранее сконфигурировано в плане безопасности.
Давай рассмотрим на примере как с этим можно побороться.
Вводные: На сервере крутится контейнер nginx, порты 80 и 443 смотрят в мир, то есть открыты для всех.
Задача: Нужно, чтобы порты 80 и 443 были доступны только для определенных IP адресов.
Если бахнуть на хостовой машине так:
А решение простое, правим немного свой docker-compose.yml и добавляем networks. В моем примере я добавил сеть bashdays.
Не забывай правильно подставить свой интерфейс ethX/enoX, а то всякое бывает.
Важное замечание. После перезапуска контейнеров, docker снова перетрет правила на хостовой машине. Поэтому весь этот процесс хорошо бы автоматизировать. Я сильно не заморачивался, просто закинул правила в bash скрипт, повесил на крон (каждую минуту), да и все.🧠 Закостылил так закостылил.
Сегодня чуть позже покажу более правильный скрипт, который будет следить за ребутом docker, но по сути те же яйца, только сбоку. Рад был всех вас видеть!
tags: #networks
—
🟢 Подпишись: @bashdays
Давай разбираться.
Если коротко, то когда ты запускаешь docker контейнеры, то все начинает работать
Давай рассмотрим на примере как с этим можно побороться.
Вводные: На сервере крутится контейнер nginx, порты 80 и 443 смотрят в мир, то есть открыты для всех.
Задача: Нужно, чтобы порты 80 и 443 были доступны только для определенных IP адресов.
Если бахнуть на хостовой машине так:
-A INPUT -s xxx.xxx.xxx.xxx/32 -p tcp -m tcp --dport 80,443 -j ACCEPTТо порты 80 и 443 так же будут доступны всем желающим. Вот на эти грабли почти каждый и наступает.
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
А решение простое, правим немного свой docker-compose.yml и добавляем networks. В моем примере я добавил сеть bashdays.
version: '3.2'Ну и теперь на хостовой машине можно уже что-то запрещать или разрешать с помощью iptables.
services:
nginx:
image: nginx:1.20.1
container_name: nginx
ports:
- '80:80'
- '443:443'
networks:
- bashdays
networks:
bashdays:
driver: bridge
driver_opts:
com.docker.network.enable_ipv6: "false"
com.docker.network.bridge.name: "docker_bashdays"
/sbin/iptables -F DOCKER-USERГде <EXTERNAL IP> это айпишник сервера который доступен из мира. А <CLIENT_IP> собственно айпишник клиента, которому мы разрешим конектится к порту 80 и 443. Все! Теперь у нас и docker в шоколаде и хостовые правила iptables работают «наверное» правильно.
/sbin/iptables -I DOCKER-USER -i eth0 -o docker_bashdays -j DROP
/sbin/iptables -I DOCKER-USER -i eth0 -s <EXTERNAL IP> -j RETURN
/sbin/iptables -I DOCKER-USER -i eth0 -p tcp --dport 80 -s <CLIENT IP> -j RETURN
/sbin/iptables -I DOCKER-USER -i eth0 -p tcp --dport 443 -s <CLIENT IP> -j RETURN
/sbin/iptables -I DOCKER-USER -i eth0 -o docker_bashdays -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
Не забывай правильно подставить свой интерфейс ethX/enoX, а то всякое бывает.
Важное замечание. После перезапуска контейнеров, docker снова перетрет правила на хостовой машине. Поэтому весь этот процесс хорошо бы автоматизировать. Я сильно не заморачивался, просто закинул правила в bash скрипт, повесил на крон (каждую минуту), да и все.
Сегодня чуть позже покажу более правильный скрипт, который будет следить за ребутом docker, но по сути те же яйца, только сбоку. Рад был всех вас видеть!
tags: #networks
—
Please open Telegram to view this post
VIEW IN TELEGRAM
👍120
По сетям мы немного прошлись, давай побашим. Накидаем скрипт автоматизации к предыдущему посту. Чтобы проверялись iptables правила и если их перетер docker, то они бы восстанавливались.
Назовем скрипт check_iptables.sh и закинем его в /usr/local/sbin. Башник максимально упрощаю, оставляю лишь суть. Поняв суть, ты сможешь самостоятельно сообразить нужную тебе логику.
--check -C chain = Check for the existence of a rule
Последний блок прокручивает массив айпишников в цикле. Это весьма гибко, если тебе захочется добавить новых allow ip в свой массив. Ну а дальше кидаешь на всё это делоболт крон и радуешься 😮💨 Славьте меня! Я великий!
Еще если не знаешь полный путь до какой либо утилиты. Можешь применить конструкцию IT=`which iptables`. Нужный путь к утилите подставится автоматически. Указывать полный путь до утилиты очень важно если вешаешь скрипт на cron.
Потому что, cron может и не понять что ты от него хочешь. И просто сказать — у меня все ок! Но на неделе ничего не отработает как нужно. Про логирование крона я писал в этом посте, можешь там поглядеть как дебажить эту штуку.
Для неопытных: чтобы повесить скрипт на cron, нужно выполнить команду crontab -e и вставить туда нужное. В моем случае получилось такое:
Можно и руками отредактировать типа: vim /var/spool/cron/crontabs/root но тогда если ты допустишь ошибку в синтаксисе cron, то оно тебе про это не сообщит. А вот если через crontab -e накосячишь, то сообщит мол — ты чо ваще? дурной? Ну это так математика, чтобы ты понимал откуда что берется и почему.
Ну а если у тебя сложности с пониманием cron синтаксиса, есть прекрасный сервис, там всё наглядно и для человеков, отвечаю!😮💨
Полезного много я сегодня тебе принес. Переваривай потихоньку и забирай себе в копилочку. А я пойду дальше думать, чем же тебя еще удивить. Завтра кстати снова пятница, пора готовиться к выходным. Давай, увидимся!
tags: #bash #linux #networks
—
🟢 Подпишись: @bashdays
Назовем скрипт check_iptables.sh и закинем его в /usr/local/sbin. Башник максимально упрощаю, оставляю лишь суть. Поняв суть, ты сможешь самостоятельно сообразить нужную тебе логику.
#!/usr/bin/bashТут всё максимально просто. Есть массив айпишников в переменной ips. А далее просто проверяются iptables правила на их наличие. Ключ -C как раз то самое, необходимое чтобы определить не перетерлось ли что-то. Ну а если перетерлось, то оно само восстановится.
ips=("1.1.1.1" "2.2.2.2" "3.3.3.3")
IT=`which iptables`
$IT -C DOCKER-USER -j RETURN 2>> /dev/null
if [[ $? -eq 0 ]]
then $IT -D DOCKER-USER -j RETURN
fi
$IT -C DOCKER-USER -i eth0 -j DROP 2>> /dev/null
if [[ $? -eq 1 ]]
then $IT -A DOCKER-USER -i eth0 -j DROP
fi
for ip in ${ips[@]}; do
$IT -C DOCKER-USER -s $ip/32 -i eth0 -j RETURN 2>> /dev/null
if [[ $? -eq 1 ]]
then $IT -I DOCKER-USER 1 -s $ip -i eth0 -j RETURN
fi
done
exit 0
--check -C chain = Check for the existence of a rule
Последний блок прокручивает массив айпишников в цикле. Это весьма гибко, если тебе захочется добавить новых allow ip в свой массив. Ну а дальше кидаешь на всё это дело
Еще если не знаешь полный путь до какой либо утилиты. Можешь применить конструкцию IT=`which iptables`. Нужный путь к утилите подставится автоматически. Указывать полный путь до утилиты очень важно если вешаешь скрипт на cron.
Потому что, cron может и не понять что ты от него хочешь. И просто сказать — у меня все ок! Но на неделе ничего не отработает как нужно. Про логирование крона я писал в этом посте, можешь там поглядеть как дебажить эту штуку.
Для неопытных: чтобы повесить скрипт на cron, нужно выполнить команду crontab -e и вставить туда нужное. В моем случае получилось такое:
*/1 * * * * /usr/local/sbin/check_iptables.shКогда ты запускаешь команду crontab -e, открывается файл /var/spool/cron/crontabs/root. Все таски хранятся в нем. Естественно если у тебя другой пользователь, то замени root на него.
Можно и руками отредактировать типа: vim /var/spool/cron/crontabs/root но тогда если ты допустишь ошибку в синтаксисе cron, то оно тебе про это не сообщит. А вот если через crontab -e накосячишь, то сообщит мол — ты чо ваще? дурной? Ну это так математика, чтобы ты понимал откуда что берется и почему.
Ну а если у тебя сложности с пониманием cron синтаксиса, есть прекрасный сервис, там всё наглядно и для человеков, отвечаю!
Полезного много я сегодня тебе принес. Переваривай потихоньку и забирай себе в копилочку. А я пойду дальше думать, чем же тебя еще удивить. Завтра кстати снова пятница, пора готовиться к выходным. Давай, увидимся!
tags: #bash #linux #networks
—
Please open Telegram to view this post
VIEW IN TELEGRAM
👍94
Наконец-то за окошком +15, а то в жару совсем невозможно работать. Привет отдыхающим и дежурным. Сегодня поиграем.
Изучить командную строку и стать экспертом, можно не только по скучной документации и индийским🤒 роликам в ютубе. Сейчас я расскажу тебе о трех прекрасных играх, с помощью которых ты максимально быстро качнешь свой консольный левел.
Игры само собой англоязычные, но в наше время переводчиков хватает, да и базовый уровень английского сейчас есть у каждого. С виду всё кажется унылымгавном, но на деле затягивает, даже если у тебя игровая импотенция
Первая игра называется BashCrawl
Клонируем себе репу и запускаем через cat:
Вторая игра называется Terminus
Тут устанавливать ничего не нужно, все работает в браузере. Открывается консоль, а дальше следуешь подсказкам. Из приятных мелочей: есть визуальная составляющая. По мере прохождения квестов, картинки меняются. Намного круче чем предыдущая BashCrawl, по крайней мере мне было в ней уютнее.
Третья игра CL Mystery / Crimescence Mystery with Answers
На мой взгляд самая крутая и сбалансированная из всех вышеперечисленных.
Если коротко, то: В Терминал-Сити произошло убийство, и полиции TCPD нужна ваша помощь.
Чтобы поиграть, нужно скопировать репу и запустить:
Автор игры при создании воодушевлялся такими фильмами:
Если знаешь еще какие-то подобные тренажеры, скидывай в бота, выпустим отдельным постом. Всех благ и хорошо отдохнуть! На связи!
tags: #bash #linux #games
—
🟢 Подпишись: @bashdays
Изучить командную строку и стать экспертом, можно не только по скучной документации и индийским
Игры само собой англоязычные, но в наше время переводчиков хватает, да и базовый уровень английского сейчас есть у каждого. С виду всё кажется унылым
Первая игра называется BashCrawl
Клонируем себе репу и запускаем через cat:
git clone [email protected]:slackermedia/bashcrawl.gitИщем сокровища, собираем артефакты, проходим квесты, сражаемся с пиэмами и техдирами. Игра само собой представляет текстовый linux тренажёр. Чем-то напоминает рогалик dungeon crawl, кстати можешь в онлайне в неё побегать если совсем уж скучно.
cd bashcrawl/entrance
cat scroll
Вторая игра называется Terminus
Тут устанавливать ничего не нужно, все работает в браузере. Открывается консоль, а дальше следуешь подсказкам. Из приятных мелочей: есть визуальная составляющая. По мере прохождения квестов, картинки меняются. Намного круче чем предыдущая BashCrawl, по крайней мере мне было в ней уютнее.
Третья игра CL Mystery / Crimescence Mystery with Answers
На мой взгляд самая крутая и сбалансированная из всех вышеперечисленных.
Если коротко, то: В Терминал-Сити произошло убийство, и полиции TCPD нужна ваша помощь.
Чтобы поиграть, нужно скопировать репу и запустить:
git clone https://github.com/gannonk08/clmystery.gitНу а далее следовать инструкциям на экране. Очень интересный сюжет с детективной составляющей. Рекомендую. Довольно качественная реализация, а самое главное — залипательно.
cd clmystery
cat instructions
Автор игры при создании воодушевлялся такими фильмами:
Достать ножи: Стеклянная луковица (2022)И не нужна нам никакая плойка и дорогущая видеокарта. Сарказм. Нужна! Но можно и в консоли прекрасно поиграть, получив массу удовольствия. А самое главное в процессе игры — ты прокачиваешь не только паттерны, алгоритмы и логику, но и в игровом режиме знакомишься с командной строкой.
Убийство в Восточном экспрессе (2017)
Поиск (2018)
Достать ножи (2017)
Улика (1985)
Исчезнувшая (2014)
Если знаешь еще какие-то подобные тренажеры, скидывай в бота, выпустим отдельным постом. Всех благ и хорошо отдохнуть! На связи!
tags: #bash #linux #games
—
Please open Telegram to view this post
VIEW IN TELEGRAM
👍131
Я уверен что почти все из вас встречались с таким комментарием: выполни эту команду
Но мало кто знает, что эта команда называется «Патч Бармина».
Патч Бармина — шутка, описывающая универсальное средство устранения любых неполадок в Unix-системах. Сам «патч» состоит из одной строки, которую следует набрать в консоли root.
Данная команда действительно устраняет любые неполадки вместе с самой Unix-системой. Поэтому будь аккуратен в своих экспериментах, запускать такое можно только на подопытных стендах ради науки. Надеюсь ты успел дочитать до этого абзаца🤒 и не побежал проверять на продакшене.
Давай разберем как работает «Патч Бармина»
По умолчанию утилита rm проверяет аргументы командной строки на соответствие корневой директории. Если в rm передан аргумент /, то выведется предупреждение. Но с помощью опции
В случае команды
Достаточно чтобы процессу были доступны чтение/запись/исполнение (rwx) для директории в которой будут удаляться файлы. Ну и чтение/исполнение (r-x) на компоненты пути до этой директории.
Права на чтение не обязательны если известен полный путь и он задан в качестве аргумента.
К примеру этой командой
Также имеется еще одна опция
На этой прекрасной ноте, жму тебе руку и желаю хорошего дня!
tags: #bash #linux
—
🟢 Подпишись: @bashdays
sudo rm -rf /* и твоя проблема решится.Но мало кто знает, что эта команда называется «Патч Бармина».
Патч Бармина — шутка, описывающая универсальное средство устранения любых неполадок в Unix-системах. Сам «патч» состоит из одной строки, которую следует набрать в консоли root.
Данная команда действительно устраняет любые неполадки вместе с самой Unix-системой. Поэтому будь аккуратен в своих экспериментах, запускать такое можно только на подопытных стендах ради науки. Надеюсь ты успел дочитать до этого абзаца
Давай разберем как работает «Патч Бармина»
По умолчанию утилита rm проверяет аргументы командной строки на соответствие корневой директории. Если в rm передан аргумент /, то выведется предупреждение. Но с помощью опции
--no-preserve-root это предупреждение можно отключить.В случае команды
rm -rf /* аргументами будет содержимое корневой директории. Оболочка bash передаст команде rm список. Чтобы посмотреть, что будет в списке, выполни:printf '%s\n' /*Выведется список папок и файлов. Но корневой директории в этом списке не будет. Ну а дальше команда rm начет удалять всё до чего сможет дотянуться. Даже если её запустить под обычным пользователем, многие файлы будут удалены.
Достаточно чтобы процессу были доступны чтение/запись/исполнение (rwx) для директории в которой будут удаляться файлы. Ну и чтение/исполнение (r-x) на компоненты пути до этой директории.
Права на чтение не обязательны если известен полный путь и он задан в качестве аргумента.
К примеру этой командой
rm -ri /* давай удалим содержимое домашней директории пользователя. Но перед каждым удалением будет задаваться вопрос (ключ -i).rm: спуститься в защищённый от записи каталог '/boot'?Если мне что-то не нужно удалять, я просто нажимаю Enter, а для положительного ответа набираю «y» и жму Enter.
rm: спуститься в защищённый от записи каталог '/dev'?
rm: спуститься в защищённый от записи каталог '/etc'?
rm: спуститься в защищённый от записи каталог '/home'? y
rm: спуститься в каталог '/home/user'? y
rm: удалить обычный файл '/home/user/.bashrc?
Также имеется еще одна опция
--preserve-root, без аргументов эта опция как раз и включает проверку которую отключает --no-preserve-root. При задании этой опции с аргументом all директории чьи родители находятся на другой файловой системе (то что было смонтировано) — пропускуются. Например домашняя папка пользователя находится на отдельном разделе.rm -ri --preserve-root=all /*вывод будет таким:
rm: пропускается '/dev', поскольку он находится на другом устройствеКакие выводы. Даже если не указывать
rm: и действует --preserve-root=all
rm: пропускается '/run', поскольку он находится на другом устройстве
rm: и действует --preserve-root=all
rm: пропускается '/tmp', поскольку он находится на другом устройстве
rm: и действует --preserve-root=all
--no-preserve-root, команда rm может знатно начудить. Всегда гугли/читай, прежде чем бездумно копировать и запускать. Ну и всегда пробегайся глазами по чужим bash скриптам, особенно если эти скрипты дернуты у какого нибудь Васи Нонейма.На этой прекрасной ноте, жму тебе руку и желаю хорошего дня!
tags: #bash #linux
—
Please open Telegram to view this post
VIEW IN TELEGRAM
👍117
Привет. На
А правда, почему? Что бы отвечать на подобные вопросы, сначала нужно задать другой вопрос — что бы что?
А ответ на этот вопрос простой: Ни одна из оболочек не поддерживает такое. Потому что POSIX не требует от оболочки поддержки символов, отличных от «цифр, букв, символа подчеркивания из набора кодировки (ASCII)». И добавлять поддержку эмоджи/смайлов вообще не имеет никакого смысла.
POSIX — набор стандартов, описывающих интерфейсы между операционной системой и прикладной программой, библиотеку языка C и набор приложений и их интерфейсов.
Данные правила действуют для именования переменных. А вот имена функций не имеют подобных ограничений. Так что в функциях ты вправе использовать эмоджи и это даже будет работать.
Вот пример рабочей функции, которая выводит Hello World.
💕 Пусть орут.
Пока на этом все, после интеграции от партнера, чего-нибудь еще интересное закину почитать, увидимся!
Ну а если скучно и хочется прокрастинации, камон в мои мемные айти каналы: @devopsina и @devopsgarden
tags: #bash #linux
—
🟢 Подпишись: @bashdays
gnu.org как-то пролетал improvement тикет, который звучит так: Эмоджи/Смайлики не поддерживаются в оболочке bash в качестве имен переменных.А правда, почему? Что бы отвечать на подобные вопросы, сначала нужно задать другой вопрос — что бы что?
А ответ на этот вопрос простой: Ни одна из оболочек не поддерживает такое. Потому что POSIX не требует от оболочки поддержки символов, отличных от «цифр, букв, символа подчеркивания из набора кодировки (ASCII)». И добавлять поддержку эмоджи/смайлов вообще не имеет никакого смысла.
POSIX — набор стандартов, описывающих интерфейсы между операционной системой и прикладной программой, библиотеку языка C и набор приложений и их интерфейсов.
Данные правила действуют для именования переменных. А вот имена функций не имеют подобных ограничений. Так что в функциях ты вправе использовать эмоджи и это даже будет работать.
Вот пример рабочей функции, которая выводит Hello World.
#!/bin/bashМожно прям веселые bash скрипты писать (добавлять какашки и баклажаны) и радовать своих коллег.
😀😀😀 () {
echo "hello world"
}
😀😀😀
Пока на этом все, после интеграции от партнера, чего-нибудь еще интересное закину почитать, увидимся!
Ну а если скучно и хочется прокрастинации, камон в мои мемные айти каналы: @devopsina и @devopsgarden
tags: #bash #linux
—
Please open Telegram to view this post
VIEW IN TELEGRAM
👍75
Если тебе приходится ковырять и писать скрипты на bash, порой хочется иметь под рукой какой-нибудь линтер. Чтобы уж слишком в говнокод не скатываться.
И такой линтер есть, называется shellcheck. С помощью него можно производить статический анализ кода и повышать качество твоих замечательных скриптов. Написан этот линтер на Haskell.
Haskell — стандартизированный чистый функциональный язык программирования общего назначения. Является одним из самых распространённых языков программирования с поддержкой отложенных вычислений.
С помощью этого линтера ты сможешь искать ошибки в текстах скриптов и получать отчеты о проведенных проверках. Это позволяет повысить производительность работы и качество кода.
Установка элементарная
А если лень ставить и тыкать, можешь воспользоваться онлайн версией. Я пользуюсь консольной версией, из коробки, без всяких дополнительных ключей. Но ключи все же имеются, можешь запустить
🐱 Проект shellcheck на github
Ну и котиков лови:🤭 . 👀 😊 кудаж без них.
tags: #bash #utils
—
🟢 Подпишись: @bashdays
И такой линтер есть, называется shellcheck. С помощью него можно производить статический анализ кода и повышать качество твоих замечательных скриптов. Написан этот линтер на Haskell.
Haskell — стандартизированный чистый функциональный язык программирования общего назначения. Является одним из самых распространённых языков программирования с поддержкой отложенных вычислений.
С помощью этого линтера ты сможешь искать ошибки в текстах скриптов и получать отчеты о проведенных проверках. Это позволяет повысить производительность работы и качество кода.
Установка элементарная
apt/yum/brew install shellcheckА использование этого линтера, вообще максимально простое:
shellcheck script.shВот и все. Если твой скрипт написан чисто и без косяков, то после запуска этой команды, ничего не произойдет. А вот если запустить его на скрипте из этого поста, то в ответ получим много нецензурной брани и полезные советы. С одной стороны использовать эмоджи нам дают, но линтер как бы намекает на наш IQ.
^-- SC1036 (error): '(' is invalid here. Did you forget to escape it?
^-- SC1088 (error): Parsing stopped here. Invalid use of parentheses?
For more information:
https://www.shellcheck.net/wiki/SC1036 -- '(' is invalid here. Did you forg...
https://www.shellcheck.net/wiki/SC1088 -- Parsing stopped here. Invalid use...
Что еще сказать, этот линтер можно прикрутить в vim. Достаточно установить из репозитория плагин Plug 'neomake/neomake’. А в VSCode так и называется shellcheck.А если лень ставить и тыкать, можешь воспользоваться онлайн версией. Я пользуюсь консольной версией, из коробки, без всяких дополнительных ключей. Но ключи все же имеются, можешь запустить
--help и поглядеть сам, но там особо ничего такого нет.Ну и котиков лови:
tags: #bash #utils
—
Please open Telegram to view this post
VIEW IN TELEGRAM
👍121
Всем доброе утро! По мотивам поста про изучения bash через игры. Мне в бота накидали достаточно много всего. Всем большое и огромное спасибо ребята!
Больше всего раз упоминалась игрушка «Bandit» от Overthewire. Давай обсудим.
Сюжет такой: Ты подключаешься к удаленной машине и в изолированном пространстве ищешь ключ для подключения к следующей машине, используя рекомендации на сайте. В описании практически каждого уровня имеется список команд, которые тебе могут пригодиться.
Устанавливать ничего не надо, заходишь на сайт, выбираешь Level 0 и читаешь условия задачи. Затем подключаешься физически по ssh к серверу и начинаешь игру.
🤒 то представлять ничего не нужно.
Плюсы игры: У тебя есть задачи, которые нужно решить с помощью консоли. Помимо этого отлично прокачивается логика и навыки дебага.
В общем рекомендую поиграть. Ну а если уперся, можешь глянуть полное прохождение на хабре. Да и на ютубе этого добра навалом.
Помимо «Bandit» на сайте имеется еще с десяток игр, покопайся, обязательно что-то зацепит.
Я в прошлой жизни обожал игру uplink, просто жил в ней. Помню даже отреверсил и патч сделал, чтобы накинуть на баланс денег и купить крутое виртуальное железо. Artmoney почему-то ее никак не хотела ломать, пришлось на ассемблере инжектор писать.
Uplink — компьютерная игра, симулирующая деятельность хакера. Дебютный проект, выпущенный британской независимой компанией Introversion Software в 2001 году
Сейчас игра доступна для покупки в стиме, стоит копейки, но можно и пиратку легко найти на трекерах да на олдскульных форумах.
У Introversion еще есть несколько крутых игрух, например крутецкая стратегия darwinia. Тоже рекомендую погонять. Ну и defcon. Короче все их игры это шедевры.
Как-то так. Сегодня еще один пост закину, после очередной интеграции, там побашим уже и новое разберем, так что на связи. Не прощаюсь.
tags: #linux #games
—
🟢 Подпишись: @bashdays
Больше всего раз упоминалась игрушка «Bandit» от Overthewire. Давай обсудим.
Сюжет такой: Ты подключаешься к удаленной машине и в изолированном пространстве ищешь ключ для подключения к следующей машине, используя рекомендации на сайте. В описании практически каждого уровня имеется список команд, которые тебе могут пригодиться.
Устанавливать ничего не надо, заходишь на сайт, выбираешь Level 0 и читаешь условия задачи. Затем подключаешься физически по ssh к серверу и начинаешь игру.
ssh -p 2220 [email protected]Сделано всё достаточно реалистично, можно представить себя хакером или пентестером. Хотя если ты уже хакер или пентестер
Плюсы игры: У тебя есть задачи, которые нужно решить с помощью консоли. Помимо этого отлично прокачивается логика и навыки дебага.
В общем рекомендую поиграть. Ну а если уперся, можешь глянуть полное прохождение на хабре. Да и на ютубе этого добра навалом.
Помимо «Bandit» на сайте имеется еще с десяток игр, покопайся, обязательно что-то зацепит.
Я в прошлой жизни обожал игру uplink, просто жил в ней. Помню даже отреверсил и патч сделал, чтобы накинуть на баланс денег и купить крутое виртуальное железо. Artmoney почему-то ее никак не хотела ломать, пришлось на ассемблере инжектор писать.
Uplink — компьютерная игра, симулирующая деятельность хакера. Дебютный проект, выпущенный британской независимой компанией Introversion Software в 2001 году
Сейчас игра доступна для покупки в стиме, стоит копейки, но можно и пиратку легко найти на трекерах да на олдскульных форумах.
У Introversion еще есть несколько крутых игрух, например крутецкая стратегия darwinia. Тоже рекомендую погонять. Ну и defcon. Короче все их игры это шедевры.
Как-то так. Сегодня еще один пост закину, после очередной интеграции, там побашим уже и новое разберем, так что на связи. Не прощаюсь.
tags: #linux #games
—
Please open Telegram to view this post
VIEW IN TELEGRAM
👍82
Хеллоу! Попался мне вчера чей-то очередной bash скрипт, в котором были такие конструкции:
Теперь если мне нужно вывести какие-то заголовки в «рамке», я делаю так:
Гуд. Но функция все равно не универсальная, хочется большего. Давай теперь передадим в функцию repeat количество повторов. В предыдущем скрипте у меня зашит харкод на 90 символов. Вуаля:
Команда seq в этом скрипте выводит последовательность целых чисел с шагом, заданным пользователем. По-умолчанию, выводимые числа отделяются друг от друга символом перевода строки, однако, с помощью ключа -s может быть задан другой разделитель.
С printf это реализуется намного проще, вот варианты:
Двойное тире означает «флаги командной строки». Поскольку мне нужно вывести «-», двойное тире указывает команде printf не пытаться анализировать то, что идет после параметров командной строки.😶 ЧО?
Короче простым языком: если выводишь символ «-» через printf, то нужно двойное тире. Если выводишь к примеру символ «~» можно обойтись такой конструкцией:
на закуску:
tags: #bash
—
🟢 Подпишись: @bashdays
echo '--------------'Так-то нормальная практика, но смотрится как-то уж очень не профессионально. У python и прочих языков такое можно реализовать примерно так:
printf '%s\n' '--------------'
python3 -c 'print("-" * 80)'
perl -E 'say "-" x 80'
А что-же с bash? Из коробки такой функции увы нет. Включаем «режим изобретателя». Поехали.repeat(){
for i in {1..90}; do echo -n "$1"; done
}
repeat '-'
Создаём функцию с циклом repeat, в которую передадим символ «-» для повторения 90 раз. Вот оно! Уже намного лучше.Теперь если мне нужно вывести какие-то заголовки в «рамке», я делаю так:
repeat '-';.Уже не плохо. Символ \t означает = Табуляция. Ну а \n я думаю ты и так знаешь = Новая строка.
echo -e '\nHeader 1\t\tHeader 2\t\tHeader 3\t\t\t\tHeader 4';
repeat '-';
Гуд. Но функция все равно не универсальная, хочется большего. Давай теперь передадим в функцию repeat количество повторов. В предыдущем скрипте у меня зашит харкод на 90 символов. Вуаля:
repeat() {
range=$(seq $2)
for i in $range; do echo -n "$1"; done
}
repeat '-' 20
Передаем в функцию 2 параметра, первый = какой символ loop’ить, второй = сколько будет повторов. В примере выше, символ «-» выведется 20 раз.Команда seq в этом скрипте выводит последовательность целых чисел с шагом, заданным пользователем. По-умолчанию, выводимые числа отделяются друг от друга символом перевода строки, однако, с помощью ключа -s может быть задан другой разделитель.
# seq 5С этим ок, разобрались. А что если воспользоваться printf? Давай попробуем.
1
2
3
4
5
# seq -s : 5
1:2:3:4:5
С printf это реализуется намного проще, вот варианты:
printf -- '-%.0s' 1 2 3 4 5Разборка этой магии
printf -- '-%.0s' {1..20}
Двойное тире означает «флаги командной строки». Поскольку мне нужно вывести «-», двойное тире указывает команде printf не пытаться анализировать то, что идет после параметров командной строки.
Короче простым языком: если выводишь символ «-» через printf, то нужно двойное тире. Если выводишь к примеру символ «~» можно обойтись такой конструкцией:
printf '~%.0s' {1..20}; printf '\n'
Просто при выводе «-» printf думает что ты ему какой-то ключ хотел подсунуть и заорет: printf: -%: invalid option. В общем такая вот особенность. Ну либо всех обмануть и сделать так:printf '%.0s-' {1..80}
Подобное можно реализовать с помощью внешних утилит таких как: awk/sed и т.п. Но чем больше ты усложняешь, тем тяжелее это дебажить. Это утверждение справедливо вообще для всего.на закуску:
seq -s_ 20|tr -d '[:digit:]'Надеюсь ты узнал что-то новое. Спасибо за внимание, ставь лайк, репости и приводи к нам своих коллег и друзей. Забашим!
tags: #bash
—
Please open Telegram to view this post
VIEW IN TELEGRAM
👍120
Привет друзья-товарищи. Сегодня разберем полезную утилиту, которая позволяет из консоли сгенерировать временный адрес электронной почты. Поехали.
Для чего вообще нужен временный адрес электронной почты? Лично мне он нужен для регистрации в сервисах, которые предварительно требуют проверки прежде чем я начну с ними работу. Сначала хочу убедиться, что сервис мне подойдет и будет отвечать моим требованиям. А лишь потом регистрироваться в нем на корпоративную почту.
Ну или к примеру, хочешь ты в комментариях на форуме кого-тозасрать пристыдить, или оставить гневный отзыв на флампе — нужна почта для регистрации. Тут как раз подходит вариант с временным ящиком, который спустя какое-то время бесследно исчезнет.
Ведь как часто бывает — зарегистрировался на свою личную почту, а потом понеслись вагончикис письками со спамом и ненужными рассылками.
Можно конечно завести под это дело отдельный почтовый ящик, либо использовать конструкцию
Будем использовать готовый bash скрипт
Обязательно пробегаемся глазами по скаченному файлу, чтобы в нем не было приколов типа «Патча Бармина»
Ок, Запускаем
ВАЖНО! Отправлять письма с таких ящиков ты не можешь, они работают только на приём.
У скрипта есть несколько ключей, давай посмотрим:
Сгенерировать НОВЫЙ временный адрес
Выводит список доступных доменов, на которые можно создать временную почту
Из основного это всё. Ну а чтобы посмотреть список входящих писем. Просто запускаешь заново:
Я использую такую конструкцию, открываю последнее письмо в текстовом режиме.
Эту утилиту вполне реально интегрировать со своими bash скриптами и полностью автоматизировать какую-то рутину. Например, если ты QA, то можешь в автотесты легко это закинуть и проверять кейсы про авторизацию и регистрацию новых пользователей. Тут полёт фантазии безграничный.
Ну и алиасы никто не отменял, создай парочку с нужными тебя ключами и вообще всё будет в шоколаде.
🐱 Проект на github
Также можешь воспользоваться онлайн версией если не хочешь ничего устанавливать.
Забирай в коллекцию, рекомендую!🐾
tags: #services #bash
—
🟢 Подпишись: @bashdays
Для чего вообще нужен временный адрес электронной почты? Лично мне он нужен для регистрации в сервисах, которые предварительно требуют проверки прежде чем я начну с ними работу. Сначала хочу убедиться, что сервис мне подойдет и будет отвечать моим требованиям. А лишь потом регистрироваться в нем на корпоративную почту.
Ну или к примеру, хочешь ты в комментариях на форуме кого-то
Ведь как часто бывает — зарегистрировался на свою личную почту, а потом понеслись вагончики
Можно конечно завести под это дело отдельный почтовый ящик, либо использовать конструкцию
[email protected] (подставлять символ «+»), но мне гораздо удобнее получить временный почтовый ящик консольной командой и принять на него письмо. Сейчас расскажу как такое реализовать.Будем использовать готовый bash скрипт
wget -O /usr/local/sbin/tmpmail https://raw.githubusercontent.com/sdushantha/tmpmail/master/tmpmailВыкачиваем, помещаем в папку /usr/local/sbin и даем файлу атрибут на исполнение.
chmod +x /usr/local/sbin/tmpmail
Обязательно пробегаемся глазами по скаченному файлу, чтобы в нем не было приколов типа «Патча Бармина»
Ок, Запускаем
# tmpmailХм, устанавливаем зависимости:
Could not find the following dependencies: jq w3m xclip curl
apt/yum/brew install jq w3m xclip curlНу и запускаем повторно:
# tmpmailНу вот и всё! Временный адрес электронной почты готов и все это без лишних манипуляций в браузере. Теперь можешь на него получать коды и ссылки.
[ Inbox for [email protected] ]
No new mail
ВАЖНО! Отправлять письма с таких ящиков ты не можешь, они работают только на приём.
У скрипта есть несколько ключей, давай посмотрим:
Сгенерировать НОВЫЙ временный адрес
# tmpmail -gЕсли указать [ADDRESS], то временная почта будет с твоим индивидуальным префиксом. Ну а если не указывать, то будет рандом.
# tmpmail -g [ADDRESS]
Выводит список доступных доменов, на которые можно создать временную почту
# tmpmail -dВ первой строке выводится список доступных доменов, во второй строке я собираю себе индивидуальную почту из префикса+домен.
# tmpmail -g [email protected]
Из основного это всё. Ну а чтобы посмотреть список входящих писем. Просто запускаешь заново:
# tmpmailДля того чтобы прочитать:
[ Inbox for [email protected] ]
- 347359684 [email protected] Signup code for Workflowy
# tmpmail 347359684То есть передаешь идентификатор письма, которое нужно открыть. Либо можешь воспользоваться ключом tmpmail -r, тогда сразу откроется самое последнее письмо.
Я использую такую конструкцию, открываю последнее письмо в текстовом режиме.
tmpmail -t -rКлюч -t открывает письмо в raw (сыром) виде. Если этот ключ не указывать, то письмо будет рендериться как HTML. Мне проще сразу открыть последнее и получить текст.
Эту утилиту вполне реально интегрировать со своими bash скриптами и полностью автоматизировать какую-то рутину. Например, если ты QA, то можешь в автотесты легко это закинуть и проверять кейсы про авторизацию и регистрацию новых пользователей. Тут полёт фантазии безграничный.
Ну и алиасы никто не отменял, создай парочку с нужными тебя ключами и вообще всё будет в шоколаде.
Также можешь воспользоваться онлайн версией если не хочешь ничего устанавливать.
Забирай в коллекцию, рекомендую!
tags: #services #bash
—
Please open Telegram to view this post
VIEW IN TELEGRAM
👍120
В дополнении к предыдущему посту про временный адрес электронной почты. Порекомендую тебе еще один сервис, который существует уже лет 100 и работает как надежные часы. Сам иногда им пользуюсь. Ну а когда работал автотестировщиком, то использовал его в автотестах постоянно.
Называется putsbox, про него мало кто знает, он распространен больше в англоязычном сегменте.
Устанавливать ничего не надо, зашел на сайт, нажал - Create a PutsBox и получил временный почтовый ящик. Все максимально просто, как мы с тобой и любим.
Из плюсов:
1. Можешь создать одновременно много ящиков
2. Легкая интеграция с Selenium, Capybara и др.
3. Личный кабинет после регистрации (не обязательно)
4. Доступ к ящику по прямой ссылке (можно шарить)
5. В любой момент можно уничтожить временную почту
Входящее письмо открывается как text/html/json. За json прям отдельный респект, можно сразу на бекенде его обрабатывать в тех же автотестах. Вот небольшой мануал как приручить к тестам.
А еще у них есть очень крутой инструмент PutsReq который позволяет дебажить HTTP-запросы и отдавать фейковые ответы.
Собственно на этом всё, Давай, хорошего понедельника!
tags: #services
—
🟢 Подпишись: @bashdays
Называется putsbox, про него мало кто знает, он распространен больше в англоязычном сегменте.
Устанавливать ничего не надо, зашел на сайт, нажал - Create a PutsBox и получил временный почтовый ящик. Все максимально просто, как мы с тобой и любим.
Из плюсов:
1. Можешь создать одновременно много ящиков
2. Легкая интеграция с Selenium, Capybara и др.
3. Личный кабинет после регистрации (не обязательно)
4. Доступ к ящику по прямой ссылке (можно шарить)
5. В любой момент можно уничтожить временную почту
Входящее письмо открывается как text/html/json. За json прям отдельный респект, можно сразу на бекенде его обрабатывать в тех же автотестах. Вот небольшой мануал как приручить к тестам.
А еще у них есть очень крутой инструмент PutsReq который позволяет дебажить HTTP-запросы и отдавать фейковые ответы.
Собственно на этом всё, Давай, хорошего понедельника!
tags: #services
—
Please open Telegram to view this post
VIEW IN TELEGRAM
👍88