uz
Feedback
Bash Days | Linux | DevOps

Bash Days | Linux | DevOps

Kanalga Telegram’da o‘tish

Авторский блог от действующего девопса Самобытно про разработку, devops, linux, скрипты, сисадминство, техдирство и за айтишную жизу. Автор: Роман Шубин Реклама: @maxgrue MAX: https://max.ru/bashdays Курс: @tormozilla_bot Блог: https://bashdays.ru

Ko'proq ko'rsatish

📈 Telegram kanali Bash Days | Linux | DevOps analitikasi

Bash Days | Linux | DevOps (@bashdays) Rus til segmentidagi kanali faol ishtirokchi. Hozirda hamjamiyat 23 767 obunachidan iborat bo'lib, Texnologiyalar & Aralashmalar toifasida 5 674-o'rinni va Rossiya mintaqasida 28 079-o'rinni egallagan.

📊 Auditoriya ko‘rsatkichlari va dinamika

невідомо sanasidan buyon loyiha tez o‘sib, 23 767 obunachiga ega bo‘ldi.

24 Iyun, 2026 dagi oxirgi ma’lumotlarga ko‘ra kanal barqaror faollikka ega. Oxirgi 30 kunda obunachilar soni -207 ga, so‘nggi 24 soatda esa -4 ga o‘zgardi va umumiy qamrov yuqori darajada qolmoqda.

  • Tasdiqlash holati: Tasdiqlanmagan
  • Jalb etish (ER): Auditoriya o‘rtacha 25.62% darajada jalb etiladi. Nashrdan keyingi dastlabki 24 soatda kontent odatda umumiy obunachilar sonining 14.38% ini tashkil etuvchi reaksiyalarni to‘playdi.
  • Post qamrovi: Har bir post o‘rtacha 6 090 marta ko‘riladi; birinchi sutkada odatda 3 419 ta ko‘rish yig‘iladi.
  • Reaksiyalar va o‘zaro ta’sir: Auditoriya faol: har bir postga o‘rtacha 21 ta reaksiya keladi.
  • Tematik yo‘nalishlar: Kontent bashdays, linux, bash, docker, скрипт kabi asosiy mavzularga jamlangan.

📝 Tavsif va kontent siyosati

Muallif resursni shaxsiy fikrni ifoda etish maydoni sifatida ta’riflaydi:
Авторский блог от действующего девопса Самобытно про разработку, devops, linux, скрипты, сисадминство, техдирство и за айтишную жизу. Автор: Роман Шубин Реклама: @maxgrue MAX: https://max.ru/bashdays Курс: @tormozilla_bot Блог: https://bashdays.r...

Yuqori yangilanish chastotasi (oxirgi ma’lumot 25 Iyun, 2026 da olingan) sababli kanal doimo dolzarb va katta qamrovli bo‘lib qoladi. Analitika auditoriya kontent bilan faol hamkorlik qilishini, uni Texnologiyalar & Aralashmalar toifasidagi muhim ta’sir nuqtasiga aylantirishini ko‘rsatadi.

23 767
Obunachilar
-424 soatlar
-257 kunlar
-20730 kunlar
Postlar arxiv
Привет, коллеги. Ура, чтиво подвезли! Есть такая команда в Linux, называется cat. Ну ты наверняка про неё знаешь. С помощью cat можно быстро посмотреть содержимое файла, объединить несколько файлов в один ну так далее. Но сегодня речь пойдёт не о ней, существует более продвинутая утилита, которая делает то же самое, но по красоте и даже больше. И называется она batcat. bat — это продвинутый клон cat с поддержкой подсветки синтаксиса и интеграцией Git. Утилита bat поддерживает подсветку синтаксиса для огромного количества языков программирования. Выводит текст в читаемом виде и нумерацией строк. Сделано всё это для того, чтобы ты лучше воспринимал информацию, которая выводится на экран. Также у нее отличная интеграция с git, ты всегда будешь видеть какие сроки были добавлены либо удалены. Вот это прям годнота, по крайней мере я использую ее на постоянке в своей работе. Это всяко лучше git status и т.п. Утилита очень гибкая, можно кастомизировать как захочешь, менять темы, добавлять свои синтаксисы, наруливать пагинацию. Установка стандартная
apt/yum/brew install bat

После установки создай alias либо симлинк, чтобы запускать ее тремя буквами bat, а не batcat, но можешь конечно и свой вариант с тремя буквами использовать.
alias bat="batcat"
mkdir -p ~/.local/bin
ln -s /usr/bin/batcat ~/.local/bin/bat

Как пользоваться? Элементарно:
bat ~/bashdays.sh

Если нужно вывести на экран несколько файлов, то пишешь их подряд через символ пробела. Если нужно вывести диапазон строк, делаешь так:
bat -r 20:25 ~/bashdays.sh

Если ты новичок и не знаешь что такое «~/», это домашний каталог, допустим ты работаешь под пользователем user, и выполнив cd ~ ты попадешь в жопу в /home/user. Посмеялись, поехали дальше. Чтобы посмотреть список всех поддерживаемых языков и расширений файлов, запускай:
bat -L

Основное рассмотрели, у bat есть еще куча разных ключей, если есть интерес запускай: bat --help и наслаждайся. Многое можно включить и отключить. Я использую bat из коробки, без всяких ключей, чисто на просмотр файлов, остальное мне и не нужно. В скриптах не рекомендую использовать, применяй старый проверенный cat. А bat оставь чисто на просмотр файлов в режиме реального времени. Больше подробностей можешь найти на 🐱 официальной github странице. Там же можешь посмотреть картинки как это всё выглядит в реальном времени, в этот пост опять ничего не могу вставить, ограничения по символам. Лады, рад был тебя видеть. Увидимся наверное завтра. tags: #utils #linux — 🟢 Подпишись: @bashdays

Давно не виделись 🥳 Давай сразу к делу. У меня есть скрипт с бесконечным циклом, который выполняет какие-то действия. Задача: нужно чтобы скрипт отработал 3 минуты и завершился. Можно конечно запустить скрипт, подождать 3 минуты и руками его стопнуть через ctrl+c, но это не трувей. А что если нужно 5 минут или 45? Не буду же я сидеть всё это время в ожидании. К счастью у нас с тобой есть утилита timeout, которая уже идет в коробке с Linux. Timeout, это утилита командной строки, которая запускает указанную команду и завершает ее, если она все еще выполняется через определенный промежуток времени. Другими словами, timeout позволяет запустить команду с ограничением по времени. Команда timeout является частью пакета основных утилит GNU, который устанавливается практически в любом дистрибутиве Linux. Вот с помощью этой утилиты, можно ограничивать по времени выполнение скриптов и команд. Давай рассмотрим примеры.
timeout 3s ping www.bashdayz.ru

Команда ping отработает 3 секунды и завершится. Конечно у ping есть свои ключи для этого, но сегодня у нас про другое. Синтаксис у команды timeout довольно простой:
timeout DURATION COMMAND

DURATION = Длительность. Это число с плавающей запятой и с необязательным суфиксом следующего вида: s = секунды m = минуты h = часы d = дни COMMAND = сама команда или скрипт, которому нужно ограничить работу по времени. Допустим мне нужно запустить какое-то приложение (например top) на удалённом сервере и через 3 минуты всё это безобразие прекратить. Ок, делаем такое:
timeout 3m ssh user@bashdayz.ru -- /usr/bin/top

Прошло 3 минуты, приложение гасится, ssh сессия завершается. Удобно? Удобно! Если по истечению этого времени у тебя в терминале исчез курсор (частенько такое бывает), то выполни команду reset, терминал сбросится и всё вернется на круги своя. Так же можно послать определенный сигнал завершения для приложения. К примеру:
timeout -s 9 3m ping www.bashdayz.ru

Чтобы получить список всех сигналов, можешь выполнить команду kill -l и посмотреть. Их там достаточно много. Я не заморачиваюсь и рублю с плеча сигналом 9 (SIGKILL). Убивать так убивать. Вместо номера сигнала, можно указывать явное имя:
timeout -s SIGTERM 5m ping www.bashdayz.ru

У timeout есть еще несколько опций, но я никогда не видел, чтобы кто-то их использовал, так что можно забить. Возможно они пригодятся для каких-то специфичных задач, но я с такими к счастью не сталкивался. Ладно. Утилита timeout это клева, а как реализовать то же самое не применяя ее, на чистом bash’е? Смотри:
ping www.bashdayz.ru & read -t 3 || kill $!

В этом примере выполняется ping и по прошествию 3х секунд завершается. Тут уже тебе самому решать, использовать timeout либо подобную конструкцию. А, точно, забыл объяснить про символ «$!». Эта конструкция содержит в себе идентификатор процесса (PID) последнего выполненного фонового конвейера. В примере выше последним выполненным заданием был ping. То есть явно не нужно указывать PID, чтобы kill корректно отработал. Собственно на этом всё. В Linux столько всего интересного, но не каждый про это интересное знает. Я изначально использовал bash конструкцию и только спустя какое-то время узнал про утилиту timeout. Век живи, век учись. 😐 Котиков тебе и удачи. Давай, увидимся! tags: #bash #utils #linux — 🟢 Подпишись: @bashdays

Как подготовить IT-инфраструктуру к бизнес-сезону вместе с сервисами для Kubernetes Совсем скоро наступит осень, а значит, дл
Как подготовить IT-инфраструктуру к бизнес-сезону вместе с сервисами для Kubernetes Совсем скоро наступит осень, а значит, для компаний начнется жаркая пора — и в это время как никогда нужно быть уверенными в отказоустойчивости и надежности своей инфраструктуры. Решить эту проблему поможет переход на микросервисную архитектуру на базе кластеров Kubernetes. Благодаря этой методологии вы сможете выстроить гибкую и масштабируемую инфраструктуру для быстрого запуска новых продуктов на рынке. Кстати, 29 августа в 11:00 состоится вебинар про Kubernetes от команды провайдера облачных и AI-технологий Cloud․ru. В прямом эфире эксперты расскажут о: 😶‍🌫преимуществах и сценариях применения сервиса для управления кластерами Kubernetes; 😶‍🌫способах настройки сетевых доступов внутри кластеров Kubernetes;  😶‍🌫вариантах настройки безопасного контура внутри кластера в облаке на примере реального приложения. Всем зарегистрированным участникам встречи будет доступна запись вебинара. 😶‍🌫Зарегистрироваться на вебинар: https://sc.link/1Ieu 😶‍🌫Подписаться на Телеграм канал: @cloudruprovider 🥹😅😂🤣

Привет друзья. Сегодня грузить дебагом и гиковскими вещами не буду, разберем простую, но важную тему: как проверить существует ли файл. Сделать это можно несколькими способами:
filename="test.txt"

if [ -f $filename ];
then
    echo "File exist"
fi

if test -f $filename;
then
   echo "File exist"
fi

В первом примере ключ -f означает = True if file exists and is a regular file. Возвращаем True если файл существует и является обычным файлом (не директорий, ни симлинком и т.п.) Во втором примере я использую команду test. Оба этих примера делают одно и тоже, но в большинстве случаев обычно используется первый вариант. Команда test предназначена для проверки типа файла и сравнения чисел и строк. Возвращает код возврата 0 (истина) или 1 (ложь) в зависимости от вычисления выражения. Выражения могут быть как унарными, так и бинарными. Ну а если подставить символ «!» в условия, то сработает обратная логика:
if [ ! -f $filename ];
if ! test -f $filename;

Здесь мы уже получим сообщение — указанный файл не найден. Для разных задач, разные условия. Да, часто возникают вопросы по ключу «-f», это не единственный ключ, их достаточно много, например можно проверить существование директории, сокета, установленные права и т.п. Табличку со всеми этими ключами я вынес отдельно сюда. То же самое можно уместить в одну строчку, синтаксис будет таким:
[ ! -f "$filename" ] && echo "file not found" || echo "file exist"

Подобные конструкции с одной стороны удобные, но ОЧЕНЬ плохо читаются, так что советую использовать их по минимуму. Например однострочник актуален в пайплайнах gitlab и т.п. где нужно умещать логику в одну строку. Вещи с виду банальные, но важные, подобные конструкции очень часто используются в bash скриптах. В этом посте я использую проверку существования файла, для того чтобы определить подключен ли у меня сетевой диск. Опять же все зависит от задачи, которую ты хочешь решить. Сегодня еще увидимся после интеграции, а вот завтра устроим разгрузочный день, пятница как-никак. Ладно давай пять, на связи! tags: #bash #linux — 🟢 Подпишись: @bashdays

День сегодня какой-то сумасшедший, троить жестко начинаю, но раз обещал еще один пост, значит нужно сделать. Как проверить, определена ли переменная в bash скрипте? Давай разберемся. К примеру мне нужно установить переменную CRAZYDAY и выполнить определенные действия в моём скрипте. Если переменная CRAZYDAY задана, то срабатывает первая логика, если нет, то другая. Чтобы узнать определена ли переменная я могу передать параметр -z условному выражению if.
if [ -z ${CRAZYDAY+x} ];
then
    echo "LOGIC 1"
else
    echo "LOGIC 2"
fi

либо с помощью команды test
if test -z ${CRAZYDAY+y}
then
    echo "LOGIC 1"
else
    echo "LOGIC 2"
fi

Команда test применяется для проверки условия. Она вычисляет выражение и, если его значение - истина, возвращает код завершения 0; иначе - ненулевое значение. Ненулевой код возвращается и в случае, когда выражение отсутствует. При проверке прав доступа используется действующий идентификатор пользователя. Когда я запущу эти скрипты, не установив переменную CRAZYDAY, я получу результат LOGIC 1. Для того что бы получить LOGIC 2, я должен сделать:
export CRAZYDAY=somestr
./script.sh

Результатом будет LOGIC 2. Чтобы снова получить LOGIC 1, мне нужно сбросить установленную переменную с помощью команды: unset CRAZYDAY. Теперь давай разберем как работает: ${CRAZYDAY+x} Выполняем последовательно команды и смотрим на выхлоп дебага:
set -x
./script.sh

вернуло:
+ '[' -z ']'
+ echo LOGIC 1
LOGIC 1

далее:
CRAZYDAY=some ./script.sh

появился параметр x, с ним и идет сравнение, x=some
+ '[' -z x ']'
+ echo LOGIC 2
LOGIC 2

далее:
export CRAZYDAY=str
./script.sh

вернуло то же самое
+ '[' -z x ']'
+ echo LOGIC 2
LOGIC 2

ну а теперь так:
unset CRAZYDAY
./script.sh

вернуло тоже самое как и в первом примере
+ '[' -z ']'
+ echo LOGIC 1
LOGIC 1

По сути x это расширение параметра bash, если переменная CRAZYDAY не задана, она не имеет в себе никакого значения. Ну а если задано, то все что внутри переменной CRAZYDAY заменяется просто на x и потом уже сравнивается в if. Вместо x можно написать хоть что, будет работать. Но в бест практиках рекомендуют использовать именно x ну или y. Есть и другие способы узнать задана ли переменная, но они более гиковские и совсем не человечные, поэтому опущу этот момент чтобы тебя не шокировать. set -x = включить режим дебага set +x = выключить режим дебага Добавить пока больше нечего, изучай. Завтра снова увидимся, очередной CRAZYDAY. Ну и доброй ночи тебе! tags: #bash #linux — 🟢 Подпишись: @bashdays

⚡️Куда расти, если вы тимлид или СТО? Формировать новый mindset и прокачивать более глубокие навыки управления проектами и ко
⚡️Куда расти, если вы тимлид или СТО? Формировать новый mindset и прокачивать более глубокие навыки управления проектами и командами вместе с OTUS. Уже 29 августа стартует новый поток курса «CTO / Технический директор», где вы сможете перенять опыт управленцев IT-спектра из МТС и Авито. 📌Курс поможет вам: * Получить необходимые знания и навыки, чтобы достичь должности CTO * Сбалансировать операционную и тактическую деятельность, обратив должное внимание на стратегическое планирование * Адаптировать подход к управлению под изменения в подразделении, сделав качественные улучшения Программа идеально подойдёт: * Опытным TeamLead'ам или Delivery Manager'ам с запросом на карьерное развитие * Начинающим CTO * Опытным CTO, переживающим фазу роста подразделения * CTO, недавно сменившим компанию и столкнувшимся с новыми трудностями 👉Отправьте заявку, чтобы записаться на курс по спеццене: https://otus.pw/sk5D/ Реклама. ООО "ОТУС ОНЛАЙН-ОБРАЗОВАНИЕ". ИНН 9705100963. erid: LjN8KK7Md

Хаа.. Привет! Сегодня будем извлекать расширение и имя файла на bash. Для чего? А почему бы и нет! На самом деле это нужно знать, это база. Я часто вижу как это делают люди с помощью какой-то зиготы 🤒 (регулярки/awk/sed), ну боль же. Не надо ничего усложнять, есть вещи на порядок выше. Что такое имя файла и расширение, объяснять не буду, как говорил мой техдир — заебал, если интересно, сходи погугли. Теперь по делу. Берем какой-нибудь подопытный файл, пусть будет: bashdays.gzip и накидываем скрипт.
#!/bin/bash

FILE="bashdays.gzip"

FIRST="${FILE%.*}"
SECOND="${FILE##*.}"

echo $FIRST
echo $SECOND

В переменной FILE заносим имя файла bashdays с расширением gzip. Далее в переменной FIRST отсекаем расширение gzip, в переменной SECOND отсекаем имя bashdays. По итогу на экран выведется такая шляпа:
bashdays
gzip

Понял? Легкотня, без гигантских регулярок и гавнокода. Сейчас объясню подробнее, что происходит. Символ %.* означает отсекание всего после точки. Символ ##*. ну а тут наоборот, отсекание всего до точки. Если бы файл назывался bashdays,gzip (через запятую), то наш скрипт, нужно было бы немного адаптировать под эту запятую.
FIRST="${FILE%,*}"
SECOND="${FILE##*,}"

Проще уже не объяснишь. Если не дошло, сам потыкай на примерах и уже точно въедешь в тему, на практике само собой всё проще и понятнее. Это один из способов реализовать желаемое. Но есть и другой. Давай воспользуется командой basename. Команда basename в Linux печатает последний компонент в пути к файлу. Это особенно полезно в скриптах bash, где вы хотите извлечь имя файла из длинного пути к файлу. Если тебе заранее известно расширение файла, в нашем случае оно известно как gzip. То мы сможем отсечь расширение такими способами (они идентичны):
basename /tmp/bashdays.gzip .gzip
basename -s .gzip /tmp/bashdays.gzip

В обоих случаях на экран выведется: bashdays Ключ -s удаляет завершающее расширение файла, но можно и из коробки запускать, не указывая его. Еще есть ключ -a, в который можно передать несколько путей и извлечь сразу пачку. Но я ни разу не видел, что бы такое использовали где-то, так что можно забить. С basename вроде всё, дальше у нас по списку dirname. Команда dirname в Linux печатает путь к файлу с удаленным последним компонентом. Это в основном дает вам путь к каталогу из пути к файлу.
dirname /usr/local/sbin
dirname /tmp/bashdays.gzip
dirname /usr/bin/date

Результат будет таким:
/usr/local/
/tmp/
/usr/bin/

Ну а чо, вообще шикарно! Ну и вишня для гиков, магия с переменной $IFS. Переменная IFS (внутренний разделитель полей) используется для указания определенного разделителя для разделения строк.
_file="/tmp/bashdays.gzip"

OLDIFS="$IFS"
IFS='.'
set -- $_file
IFS="$OLDIFS"

printf "File: %s\nExt: %s\n" "$1" "$2"

Кратенько: Определяем имя файла, задаем переменную IFS для извлечения имени файла и расширения, указываем разделитель «.» (точка), выполняем set для разделения на позиционные параметры, ну и выводим все на экран с помощью printf (но можно и через echo). Выхлоп скрипта будет таким:
File: /tmp/bashdays
Ext: gzip

Команда set — это встроенная команда оболочки, которая позволяет отображать или устанавливать переменные оболочки и среды. Уффф.. Как-то много букв получилось, пардон. Основные моменты рассмотрели, надеюсь твой интерес я удовлетворил. Спасибо за внимание, ставь лайк. А вечером закину еще что-нибудь занимательное. Давай, на связи! tags: #bash #linux — 🟢 Подпишись: @bashdays

В дополнении к предыдущему посту про временный адрес электронной почты. Порекомендую тебе еще один сервис, который существует
В дополнении к предыдущему посту про временный адрес электронной почты. Порекомендую тебе еще один сервис, который существует уже лет 100 и работает как надежные часы. Сам иногда им пользуюсь. Ну а когда работал автотестировщиком, то использовал его в автотестах постоянно. Называется putsbox, про него мало кто знает, он распространен больше в англоязычном сегменте. Устанавливать ничего не надо, зашел на сайт, нажал - Create a PutsBox и получил временный почтовый ящик. Все максимально просто, как мы с тобой и любим. Из плюсов: 1. Можешь создать одновременно много ящиков 2. Легкая интеграция с Selenium, Capybara и др. 3. Личный кабинет после регистрации (не обязательно) 4. Доступ к ящику по прямой ссылке (можно шарить) 5. В любой момент можно уничтожить временную почту Входящее письмо открывается как text/html/json. За json прям отдельный респект, можно сразу на бекенде его обрабатывать в тех же автотестах. Вот небольшой мануал как приручить к тестам. А еще у них есть очень крутой инструмент PutsReq который позволяет дебажить HTTP-запросы и отдавать фейковые ответы. Собственно на этом всё, Давай, хорошего понедельника! tags: #services — 🟢 Подпишись: @bashdays

Вебинар «Пора в облака: преимущества облачной инфраструктуры для бизнеса, нюансы и инсайты» Когда: 29 августа 2023 в 12:00 МС
Вебинар «Пора в облака: преимущества облачной инфраструктуры для бизнеса, нюансы и инсайты» Когда: 29 августа 2023 в 12:00 МСК Переход в облако меняет бизнес-процессы, подход к планированию и стратегию компании. Компания, использующая облака будет иметь конкурентное преимущество над организацией, работающей на собственных мощностях. На вебинаре спикеры расскажут про историю облачных технологий и актуальные тренды, про преимущества использования облачных ресурсов и выгоду для бизнеса, про все тонкости миграции в облако и многое другое. Спикеры ITGLOBAL.COM - Алина Жигалова, директор по развитию сервисов - Андрей Серпецкий, руководитель отдела продаж Зарегистрироваться на вебинар 🥹😅😂🤣

Привет друзья-товарищи. Сегодня разберем полезную утилиту, которая позволяет из консоли сгенерировать временный адрес электронной почты. Поехали. Для чего вообще нужен временный адрес электронной почты? Лично мне он нужен для регистрации в сервисах, которые предварительно требуют проверки прежде чем я начну с ними работу. Сначала хочу убедиться, что сервис мне подойдет и будет отвечать моим требованиям. А лишь потом регистрироваться в нем на корпоративную почту. Ну или к примеру, хочешь ты в комментариях на форуме кого-то засрать пристыдить, или оставить гневный отзыв на флампе — нужна почта для регистрации. Тут как раз подходит вариант с временным ящиком, который спустя какое-то время бесследно исчезнет. Ведь как часто бывает — зарегистрировался на свою личную почту, а потом понеслись вагончики с письками со спамом и ненужными рассылками. Можно конечно завести под это дело отдельный почтовый ящик, либо использовать конструкцию hello+service@bashdayz.ru (подставлять символ «+»), но мне гораздо удобнее получить временный почтовый ящик консольной командой и принять на него письмо. Сейчас расскажу как такое реализовать. Будем использовать готовый bash скрипт
wget -O /usr/local/sbin/tmpmail https://raw.githubusercontent.com/sdushantha/tmpmail/master/tmpmail

chmod +x /usr/local/sbin/tmpmail

Выкачиваем, помещаем в папку /usr/local/sbin и даем файлу атрибут на исполнение. Обязательно пробегаемся глазами по скаченному файлу, чтобы в нем не было приколов типа «Патча Бармина» Ок, Запускаем
# tmpmail
Could not find the following dependencies: jq w3m xclip curl

Хм, устанавливаем зависимости:
apt/yum/brew install jq w3m xclip curl

Ну и запускаем повторно:
# tmpmail
[ Inbox for qxsgxmmeuas@1secmail.com ]

No new mail

Ну вот и всё! Временный адрес электронной почты готов и все это без лишних манипуляций в браузере. Теперь можешь на него получать коды и ссылки. ВАЖНО! Отправлять письма с таких ящиков ты не можешь, они работают только на приём. У скрипта есть несколько ключей, давай посмотрим: Сгенерировать НОВЫЙ временный адрес
# tmpmail -g
# tmpmail -g [ADDRESS]

Если указать [ADDRESS], то временная почта будет с твоим индивидуальным префиксом. Ну а если не указывать, то будет рандом. Выводит список доступных доменов, на которые можно создать временную почту
# tmpmail -d
# tmpmail -g bashdayz@kzccv.com

В первой строке выводится список доступных доменов, во второй строке я собираю себе индивидуальную почту из префикса+домен. Из основного это всё. Ну а чтобы посмотреть список входящих писем. Просто запускаешь заново:
# tmpmail
[ Inbox for bashdayz@kzccv.com ]
- 347359684 kzccv.com@email.workflowy.com Signup code for Workflowy

Для того чтобы прочитать:
# tmpmail 347359684

То есть передаешь идентификатор письма, которое нужно открыть. Либо можешь воспользоваться ключом tmpmail -r, тогда сразу откроется самое последнее письмо. Я использую такую конструкцию, открываю последнее письмо в текстовом режиме.
tmpmail -t -r

Ключ -t открывает письмо в raw (сыром) виде. Если этот ключ не указывать, то письмо будет рендериться как HTML. Мне проще сразу открыть последнее и получить текст. Эту утилиту вполне реально интегрировать со своими bash скриптами и полностью автоматизировать какую-то рутину. Например, если ты QA, то можешь в автотесты легко это закинуть и проверять кейсы про авторизацию и регистрацию новых пользователей. Тут полёт фантазии безграничный. Ну и алиасы никто не отменял, создай парочку с нужными тебя ключами и вообще всё будет в шоколаде. 🐱 Проект на github Также можешь воспользоваться онлайн версией если не хочешь ничего устанавливать. Забирай в коллекцию, рекомендую! 🐾 tags: #services #bash — 🟢 Подпишись: @bashdays

Хеллоу! Попался мне вчера чей-то очередной bash скрипт, в котором были такие конструкции:
echo '--------------' 
printf '%s\n' '--------------'

Так-то нормальная практика, но смотрится как-то уж очень не профессионально. У python и прочих языков такое можно реализовать примерно так:
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 '-';.
echo -e '\nHeader 1\t\tHeader 2\t\tHeader 3\t\t\t\tHeader 4';
repeat '-';

Уже не плохо. Символ \t означает = Табуляция. Ну а \n я думаю ты и так знаешь = Новая строка. Гуд. Но функция все равно не универсальная, хочется большего. Давай теперь передадим в функцию repeat количество повторов. В предыдущем скрипте у меня зашит харкод на 90 символов. Вуаля:
repeat() {
    range=$(seq $2)
    for i in $range; do echo -n "$1"; done
}

repeat '-' 20

Передаем в функцию 2 параметра, первый = какой символ loop’ить, второй = сколько будет повторов. В примере выше, символ «-» выведется 20 раз. Команда seq в этом скрипте выводит последовательность целых чисел с шагом, заданным пользователем. По-умолчанию, выводимые числа отделяются друг от друга символом перевода строки, однако, с помощью ключа -s может быть задан другой разделитель.
# seq 5
1
2
3
4
5

# seq -s : 5
1:2:3:4:5

С этим ок, разобрались. А что если воспользоваться printf? Давай попробуем. С 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 — 🟢 Подпишись: @bashdays

⚡️ Тест на знание K8s от Отус ⚡️ Освойте функционал K8s на курсе — «Инфраструктурная платформа на основе Kubernetes». Пройдит
⚡️ Тест на знание K8s от Отус ⚡️ Освойте функционал K8s на курсе — «Инфраструктурная платформа на основе Kubernetes». Пройдите вступительный тест на знание K8s и узнайте, насколько вы готовы к обучению на нашем курсе. Обучение проходит на Kubernetes v1.24. ❗️На курсе вы пройдете весь путь разработки инфраструктурной платформы на основе Kubernetes и получите все необходимые навыки, которые позволят вам вырасти до платформенного инженера. ➡️ ПРОЙТИ ТЕСТ  - https://otus.pw/1g37/ 🎁 Пройдете успешно тест, бонусом, после прохождения теста, получите доступ к записям открытых уроков курса. Нативная интеграция. Информация о продукте www.otus.ru 🥹😅😂🤣

Всем доброе утро! По мотивам поста про изучения bash через игры. Мне в бота накидали достаточно много всего. Всем большое и огромное спасибо ребята! Больше всего раз упоминалась игрушка «Bandit» от Overthewire. Давай обсудим. Сюжет такой: Ты подключаешься к удаленной машине и в изолированном пространстве ищешь ключ для подключения к следующей машине, используя рекомендации на сайте. В описании практически каждого уровня имеется список команд, которые тебе могут пригодиться. Устанавливать ничего не надо, заходишь на сайт, выбираешь Level 0 и читаешь условия задачи. Затем подключаешься физически по ssh к серверу и начинаешь игру.
ssh -p 2220 root@bandit.labs.overthewire.org

Сделано всё достаточно реалистично, можно представить себя хакером или пентестером. Хотя если ты уже хакер или пентестер 🤒 то представлять ничего не нужно. Плюсы игры: У тебя есть задачи, которые нужно решить с помощью консоли. Помимо этого отлично прокачивается логика и навыки дебага. В общем рекомендую поиграть. Ну а если уперся, можешь глянуть полное прохождение на хабре. Да и на ютубе этого добра навалом. Помимо «Bandit» на сайте имеется еще с десяток игр, покопайся, обязательно что-то зацепит. Я в прошлой жизни обожал игру uplink, просто жил в ней. Помню даже отреверсил и патч сделал, чтобы накинуть на баланс денег и купить крутое виртуальное железо. Artmoney почему-то ее никак не хотела ломать, пришлось на ассемблере инжектор писать. Uplink — компьютерная игра, симулирующая деятельность хакера. Дебютный проект, выпущенный британской независимой компанией Introversion Software в 2001 году Сейчас игра доступна для покупки в стиме, стоит копейки, но можно и пиратку легко найти на трекерах да на олдскульных форумах. У Introversion еще есть несколько крутых игрух, например крутецкая стратегия darwinia. Тоже рекомендую погонять. Ну и defcon. Короче все их игры это шедевры. Как-то так. Сегодня еще один пост закину, после очередной интеграции, там побашим уже и новое разберем, так что на связи. Не прощаюсь. tags: #linux #games — 🟢 Подпишись: @bashdays

Если тебе приходится ковырять и писать скрипты на bash, порой хочется иметь под рукой какой-нибудь линтер. Чтобы уж слишком в говнокод не скатываться. И такой линтер есть, называется spellcheck. С помощью него можно производить статический анализ кода и повышать качество твоих замечательных скриптов. Написан этот линтер на Haskell. Haskell — стандартизированный чистый функциональный язык программирования общего назначения. Является одним из самых распространённых языков программирования с поддержкой отложенных вычислений. С помощью этого линтера ты сможешь искать ошибки в текстах скриптов и получать отчеты о проведенных проверках. Это позволяет повысить производительность работы и качество кода. Установка элементарная
apt/yum/brew install spellcheck

А использование этого линтера, вообще максимально простое:
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’. А если лень ставить и тыкать, можешь воспользоваться онлайн версией. Я пользуюсь консольной версией, из коробки, без всяких дополнительных ключей. Но ключи все же имеются, можешь запустить --help и поглядеть сам, но там особо ничего такого нет. 🐱 Проект shellcheck на github Ну и котиков лови: 🤭. 👀 😊 кудаж без них. tags: #bash #utils — 🟢 Подпишись: @bashdays

💣 Хардкорный тест для сетевых инженеров! ➡️ Пройдите тест из 22 вопросов и получите welcome-скидку на онлайн-курс «Network E
💣 Хардкорный тест для сетевых инженеров! ➡️ Пройдите тест из 22 вопросов и получите welcome-скидку на онлайн-курс «Network Engineer» от OTUS. 💻 В программе курса — все актуальные инструменты, необходимые сетевому инженеру. Возможна рассрочка. ➡️ ПРОЙТИ ТЕСТ: https://otus.pw/hY0H/ 🥹😅😂🤣

Привет. На gnu.org как-то пролетал improvement тикет, который звучит так: Эмоджи/Смайлики не поддерживаются в оболочке bash в качестве имен переменных. А правда, почему? Что бы отвечать на подобные вопросы, сначала нужно задать другой вопрос — что бы что? А ответ на этот вопрос простой: Ни одна из оболочек не поддерживает такое. Потому что POSIX не требует от оболочки поддержки символов, отличных от «цифр, букв, символа подчеркивания из набора кодировки (ASCII)». И добавлять поддержку эмоджи/смайлов вообще не имеет никакого смысла. POSIX — набор стандартов, описывающих интерфейсы между операционной системой и прикладной программой, библиотеку языка C и набор приложений и их интерфейсов. Данные правила действуют для именования переменных. А вот имена функций не имеют подобных ограничений. Так что в функциях ты вправе использовать эмоджи и это даже будет работать. Вот пример рабочей функции, которая выводит Hello World.
#!/bin/bash

😀😀😀 () {
 echo "hello world"
}
😀😀😀

Можно прям веселые bash скрипты писать (добавлять какашки и баклажаны) и радовать своих коллег. 💕 Пусть орут. Пока на этом все, после интеграции от партнера, чего-нибудь еще интересное закину почитать, увидимся! Ну а если скучно и хочется прокрастинации, камон в мои мемные айти каналы: @devopsina и @devopsgarden 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'?
rm: спуститься в защищённый от записи каталог '/dev'?
rm: спуститься в защищённый от записи каталог '/etc'?
rm: спуститься в защищённый от записи каталог '/home'? y
rm: спуститься в каталог '/home/user'? y
rm: удалить обычный файл '/home/user/.bashrc?

Если мне что-то не нужно удалять, я просто нажимаю Enter, а для положительного ответа набираю «y» и жму Enter. Также имеется еще одна опция --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 — 🟢 Подпишись: @bashdays

Наконец-то за окошком +15, а то в жару совсем невозможно работать. Привет отдыхающим и дежурным. Сегодня поиграем. Изучить командную строку и стать экспертом, можно не только по скучной документации и индийским 🤒 роликам в ютубе. Сейчас я расскажу тебе о трех прекрасных играх, с помощью которых ты максимально быстро качнешь свой консольный левел. Игры само собой англоязычные, но в наше время переводчиков хватает, да и базовый уровень английского сейчас есть у каждого. С виду всё кажется унылым гавном, но на деле затягивает, даже если у тебя игровая импотенция Первая игра называется BashCrawl Клонируем себе репу и запускаем через cat:
git clone git@gitlab.com:slackermedia/bashcrawl.git
cd bashcrawl/entrance
cat scroll

Ищем сокровища, собираем артефакты, проходим квесты, сражаемся с пиэмами и техдирами. Игра само собой представляет текстовый linux тренажёр. Чем-то напоминает рогалик dungeon crawl, кстати можешь в онлайне в неё побегать если совсем уж скучно. Вторая игра называется Terminus Тут устанавливать ничего не нужно, все работает в браузере. Открывается консоль, а дальше следуешь подсказкам. Из приятных мелочей: есть визуальная составляющая. По мере прохождения квестов, картинки меняются. Намного круче чем предыдущая BashCrawl, по крайней мере мне было в ней уютнее. Третья игра CL Mystery / Crimescence Mystery with Answers На мой взгляд самая крутая и сбалансированная из всех вышеперечисленных. Если коротко, то: В Терминал-Сити произошло убийство, и полиции TCPD нужна ваша помощь. Чтобы поиграть, нужно скопировать репу и запустить:
git clone https://github.com/gannonk08/clmystery.git
cat instructions

Ну а далее следовать инструкциям на экране. Очень интересный сюжет с детективной составляющей. Рекомендую. Довольно качественная реализация, а самое главное — залипательно. Автор игры при создании воодушевлялся такими фильмами:
Достать ножи: Стеклянная луковица (2022)
Убийство в Восточном экспрессе (2017)
Поиск (2018)
Достать ножи (2017)
Улика (1985)
Исчезнувшая (2014)

И не нужна нам никакая плойка и дорогущая видеокарта. Сарказм. Нужна! Но можно и в консоли прекрасно поиграть, получив массу удовольствия. А самое главное в процессе игры — ты прокачиваешь не только паттерны, алгоритмы и логику, но и в игровом режиме знакомишься с командной строкой. Если знаешь еще какие-то подобные тренажеры, скидывай в бота, выпустим отдельным постом. Всех благ и хорошего воскресения! На связи! tags: #bash #linux #games — 🟢 Подпишись: @bashdays

По сетям мы немного прошлись, давай побашим. Накидаем скрипт автоматизации к предыдущему посту. Чтобы проверялись iptables правила и если их перетер docker, то они бы восстанавливались. Назовем скрипт check_iptables.sh и закинем его в /usr/local/sbin. Башник максимально упрощаю, оставляю лишь суть. Поняв суть, ты сможешь самостоятельно сообразить нужную тебе логику.
#!/usr/bin/bash

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

Тут всё максимально просто. Есть массив айпишников в переменной ips. А далее просто проверяются iptables правила на их наличие. Ключ -C как раз то самое, необходимое чтобы определить не перетерлось ли что-то. Ну а если перетерлось, то оно само восстановится. --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 /usr/local/sbin/check_iptables.sh но тогда если ты допустишь ошибку в синтаксисе cron, то оно тебе про это не сообщит. А вот если через crontab -e накосячишь, то сообщит мол — ты чо ваще? дурной? Ну это так математика, чтобы ты понимал откуда что берется и почему. Ну а если у тебя сложности с пониманием cron синтаксиса, есть прекрасный сервис, там всё наглядно и для человеков, отвечаю! 😮‍💨 Полезного много я сегодня тебе принес. Переваривай потихоньку и забирай себе в копилочку. А я пойду дальше думать, чем же тебя еще удивить. Завтра кстати снова пятница, пора готовиться к выходным. Давай, увидимся! tags: #bash #linux #networks — 🟢 Подпишись: @bashdays

Самое время познакомиться с концепцией операторов и контроллеров в Kubernetes вместе с Отус! ❗Приглашаем 17 августа в 20:00 п
Самое время познакомиться с концепцией операторов и контроллеров в Kubernetes вместе с Отус! ❗Приглашаем 17 августа в 20:00 по Москве, на открытый вебинар “Custom Resource Definitions в Kubernetes. Операторы”. Вебинар приурочен к старту онлайн-курса «Инфраструктурная платформа на основе Kubernetes». Записывайтесь на вебинар и приходите учиться на курс. Обучение проходит на Kubernetes v1.24. В рамках вебинара вы поймете: – Различия между операторами и контролерами; – Как разрабатывать контроллеры на Bash; – Особенности работы контролеров. ✅ Вы изучите следующие темы: – Определение контроллеров в Kubernetes; – Обзор событийной модели, используемой в Kubernetes; – Разработка Custom Resource Definitions и их работа; – Практика создания контроллеров на Bash; – Примеры контроллеров и их логика работы. ➡ Записаться на вебинар: https://otus.pw/C0Dt/ По окончании вебинара вы получите необходимые знания и навыки для разработки контроллеров в Kubernetes. Нативная интеграция. Информация о продукте www.otus.ru 🥹😅😂🤣