Мастер ремонтирует электронную платуФото: Bulat843 🌙 / Pexels
← Все подборки Маршрут Bashdays

Bash и автоматизация

Скрипты, однострочники, awk, cron, mapfile и практическая автоматизация рутины.

bashshellawkскриптскриптыcronоднострочникmapfile
310 материалов в подборке
О подборке

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

Сначала новые

Материалы маршрута

Материалов: 310

bash

Почему нельзя перезаписывать файл через sed и редирект

Команда cat file | sed ... > file обнуляет исходный файл до начала чтения. Показываем опасный пример, результат и замену через временный файл с последующим mv, а также альтернативный вариант с ed.

Фото: Mikhail Nilov / Pexels
linux

Почему удалённый файл доступен через дескриптор

Что происходит с файлом после unlink, пока процесс удерживает открытый файловый дескриптор. Bash-пример с exec 3, rm и read демонстрирует, почему имя исчезает из каталога раньше, чем содержимое перестаёт быть доступным.

Фото: Kindel Media / Pexels
bash

Как Bash загружает функции через source

Проверяем через strace, перечитывает ли Bash подключённый файл при каждом вызове функции. Минимальный эксперимент показывает обращения openat и подтверждает, что source загружает файл один раз на запуск скрипта.

Фото: Daniil Komov / Pexels
linux

Как безопасно обнулить лог-файл

Удаление активного лога через rm разрывает привычный путь к файлу, пока процесс продолжает писать в открытый дескриптор. Разбираем безопасное обнуление через редирект, truncate и сигнал USR1 для Nginx или Apache.

Фото: Thirdman / Pexels
bash

Как собрать все логи в один поток

Простой Bash-скрипт объединяет обычные и сжатые логи в правильном порядке и выводит их в stdout. Разбираем выбор между cat и zcat, сортировку файлов и дальнейшую обработку через grep, awk или sed.

Фото: Rafael Minguet Delgado / Pexels
bash

Переполнение целых чисел в Bash

Два коротких Bash-скрипта показывают, что происходит с целочисленной переменной при выходе за пределы 64-битного диапазона. Наглядный эксперимент с инкрементом и умножением на два демонстрирует переполнение знакового integer.

Фото: Eva Bronzini / Pexels
bash

Варианты циклов for в Bash

Сравниваем арифметические циклы Bash, диапазоны, seq, чтение файлов и перебор путей. В конце — три необычные конструкции for для собеседований и экспериментов.

Фото: Giant Asparagus / Pexels
bash

Индексы массивов в Bash

Показываем, как Bash вычисляет арифметические выражения внутри индекса массива. На примерах 6%2, 7%2 и 5%3 разбираем остаток от деления и выбор элемента.

Фото: Jan van der Wolf / Pexels
bash

Что делает kill -0 в Bash

Проверяем существование процесса и права на отправку сигналов с помощью kill -0. Примеры Bash показывают коды возврата, фоновые процессы и ограничения обычного пользователя.

Фото: Susanne Plank / Pexels
max

Отправка сообщений и файлов через MAX Bot API

Практический Bash-скрипт для отправки текстовых сообщений и файлов пользователю или в групповой чат через MAX Bot API. Разбираем параметры запуска, загрузку вложений, формирование JSON через jq и антифлуд-задержку.

Фото: Darina Belonogova / Pexels
linux

Зачем использовать touch перед редактированием файла

Разбираемся, зачем создавать файл командой touch перед открытием в Vim, если редактор и так умеет сохранить новый файл. Обсуждаем раннюю проверку прав на запись, обновление времени модификации и применение touch для lock-файлов и …

Фото: TStudio / Pexels
devops

Как настроить алиасы Git для быстрых коммитов

Автоматизируем повторяющуюся цепочку git add, commit и push с помощью shell-алиаса и встроенных алиасов Git. В статье есть готовая команда с датой коммита и набор сокращений для повседневной работы.

Фото: ThisIsEngineering / Pexels
bash

Как отменить export переменной в Bash

Показываем, как убрать у переменной Bash атрибут экспорта, не удаляя её из текущей оболочки. Сравниваем громоздкий вариант с unset и короткие решения через typeset, declare и export -n.

Фото: Markus Spiske / Pexels
networks

Как поднять SOCKS-прокси через SSH

Настраиваем личный SOCKS5-прокси через SSH без доступа пользователя к shell и SFTP. Ограничиваем аккаунт в sshd_config, запускаем динамический проброс порта и подключаем Firefox с передачей DNS-запросов через прокси.

Фото: Holger Schué / Pexels
bash

Как управлять переменными окружения через direnv

Настраиваем direnv для автоматической загрузки и выгрузки переменных окружения при переходе между каталогами проектов. Устанавливаем hook для Bash, разрешаем .envrc и проверяем изоляцию переменной FOO на практике.

Фото: Arina Krasnikova / Pexels
linux

Чем BSD в OPNsense отличается от Linux

Личный опыт переноса shell-скрипта с Linux на OPNsense и BSD. Разбираем различия csh и sh, перенос строк, особенности date и awk, отсутствие /dev/shm и набор консольных редакторов.

Фото: Brian Jesus / Pexels
linux

Timer path и socket три скрытых юнита systemd

Три практических механизма systemd для задач по расписанию, наблюдения за файлами и запуска сервисов по подключению. Примеры юнитов timer, path и socket помогают заменить cron, inotify-tools и постоянно работающие службы.

Фото: Annushka Ahuja / Pexels
bash

Зачем ставить ./ перед запуском скрипта

Объясняем, почему исполняемый файл из текущего каталога запускают через ./ и как оболочка использует PATH. Разбираем безопасность такого поведения, опасность добавления точки в PATH и полные пути для cron.

Фото: Tom Fisk / Pexels
bash

Как передавать текст сигналами реального времени в Bash

Эксперимент с передачей текстовых сообщений между Bash-процессами через сигналы SIGRTMIN. Сервер и клиент кодируют символы по битам, обрабатывают границы сообщений и показывают, почему важны задержки.

Фото: Juan Martin Gomez / Pexels
bash

Конфиг-агент на Bash для восстановления Nginx

Собираем минимальный конфиг-агент на Bash, который синхронизирует эталонные настройки Nginx из Git. Скрипт с cron, rsync и systemctl автоматически восстанавливает конфиги и перезагружает сервис только при изменениях.

Фото: Omar Ashraf / Pexels
bash

Почему mv удаляет файлы при переименовании

Разбираем Bash-скрипт, который при массовом переименовании незаметно теряет половину файлов. На тестовом наборе показываем поведение mv при совпадении имён и используем опцию -b для резервных копий.

Фото: Marlon Castor / Pexels
bash

Зачем использовать env в shebang

Объясняем разницу между жёстким путём к интерпретатору и конструкцией /usr/bin/env в shebang. На примерах с Bash, Python, PATH и виртуальным окружением показываем преимущества и ограничения переносимого запуска скриптов.

Фото: Jordi Gamundi Domenech / Pexels
bash

Как извлечь имя и расширение файла в Bash

Разбираем несколько способов отделить имя файла от расширения в Bash без громоздких регулярных выражений. Используем подстановку параметров, basename, dirname и переменную IFS на понятных примерах.

Фото: cottonbro studio / Pexels
security

Как полностью отключить логирование в Linux

Экспериментируем с отключением системных журналов Linux, journald, rsyslog и истории Bash. Материал показывает, где остаются логи, какие побочные эффекты возникают и почему эти приёмы допустимы только в учебной среде.

Фото: Amorie Sam / Pexels
linux

locate и globbing для быстрого поиска файлов

Сравниваем locate и find, разбираемся с базой updatedb и ускоряем простой поиск файлов в Linux. На примере strace показываем, как globbing в Bash меняет аргументы команды и почему шаблоны нужно заключать в кавычки.

Фото: RDNE Stock project / Pexels
linux

Как настроить вход по SSH-ключу

Пошагово настраиваем вход на Linux-сервер по SSH-ключу: генерируем пару RSA, восстанавливаем публичную часть, копируем её через ssh-copy-id и выставляем права на authorized_keys. Также разбираем подключение под разными …

Фото: Obi Onyeador / Pexels
linux

Как подменить файл через mount --bind

Символическая ссылка не может заменить уже существующий файл, а bind mount справляется с такой подменой. Проверяем поведение ln -s и mount --bind на двух текстовых файлах.

Фото: Mac Solatorio / Pexels
bash

Как сделать комментарии Bash видимыми при отладке

Автор COLODEBUG предлагает использовать встроенную команду Bash : вместо обычного символа комментария #. Такой приём делает пояснения заметными в трассировке скрипта и помогает при отладке.

Фото: Markus Winkler / Pexels
linux

CLI Exercises — 77 задач по Linux-терминалу

CLI Exercises — интерактивный тренажёр с 77 заданиями по командной строке Linux, подсказками и несколькими вариантами решений. Показываю установку в отдельное Python-окружение через venv и запуск одной командой.

Фото: Mikhail Nilov / Pexels
devops

goManageDocker управляет Docker из терминала

goManageDocker добавляет текстовый интерфейс для управления образами, контейнерами и томами Docker без длинных команд. Инструмент устанавливается одной shell-командой и подходит для локальных пет-проектов.

Фото: Bulat843 🌙 / Pexels
soft

QEMU-QuickBoot разворачивает виртуалки через GUI

Bash-скрипт QEMU-QuickBoot упрощает создание и загрузку виртуальных машин QEMU через графический интерфейс Zenity. Можно выбрать физическое устройство, ISO, VHD или другой образ и запустить установку с BIOS либо UEFI.

Фото: Panumas Nikhomkhai / Pexels
games

Rick & Morty BASH Quest для практики командной строки

Rick & Morty BASH Quest превращает базовые команды Linux в браузерный текстовый квест. Чтобы найти Саммер и Рика, придётся перемещаться между порталами, читать подсказки и пользоваться ls, cd, cat, pwd и man.

Фото: Anastasia Shuraeva / Pexels
bash

Как дать Bash-скрипту выходной

Короткая проверка номера дня недели через date +%u позволяет Bash-скрипту отказаться от работы в субботу и воскресенье. Это шуточный вредный совет для cron-задач, который заодно показывает простое условие с числовым сравнением.

Фото: Bingqian Li / Pexels
bash

Краткий Bash Style Guide от Дэйва Эдди

Bash Style Guide Дэйва Эдди — короткая выжимка о безопасных, предсказуемых и единообразных shell-скриптах. Руководство можно читать в браузере или прямо в терминале через curl, а основные темы разобраны и в видеороликах YSAP.

Фото: Jess Bailey Designs / Pexels
bash

Ввод пароля со звёздочками в Bash

Два однострочника на Bash читают пароль без отображения символов и печатают звёздочки вместо введённого текста. Второй вариант дополнительно поддерживает удаление символов клавишей Backspace.

Фото: Magda Ehlers / Pexels
bash

Как использовать IFS как выходной разделитель

В Bash нет отдельной переменной OFS, но первый символ IFS становится разделителем для параметров внутри "$*". Пример показывает, как собрать CSV-строку и почему команда set меняет позиционные параметры текущей оболочки.

Фото: Alex Andrews / Pexels
linux

Когда использовать runuser вместо su

Команда runuser запускает процесс от имени другого пользователя без запроса пароля, когда вызывающий процесс уже обладает правами root. Это делает её удобной для системных скриптов, cron-задач и служб.

Фото: Jonathan Borba / Pexels
bash

cdspell и autocd в Bash

Две встроенные опции Bash упрощают навигацию по каталогам: cdspell исправляет небольшие ошибки в путях, а autocd позволяет переходить в директорию без команды cd. Показываем работу обеих функций на коротких примерах.

Фото: fauxels / Pexels
bash

Автоматическая перезагрузка Linux после обновлений

Однострочник для автоматического обновления Debian или Ubuntu и перезагрузки только при появлении /var/run/reboot-required. Подход пригодится в самописных установочных скриптах без Ansible и Puppet.

Фото: energepic.com / Pexels
bash

Шпаргалка по расширению параметров Bash

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

Фото: RDNE Stock project / Pexels
bash

HSTR для удобного поиска по истории команд

HSTR превращает историю команд Bash и Zsh в интерактивный список с удобной фильтрацией. Вместо многократного Ctrl-R можно ввести часть запроса, выбрать нужную команду стрелками и сразу вернуть её в терминал.

Фото: Justin Rieta / Pexels
linux

Как найти создаваемый файл с inotify-tools

inotify-tools позволяет в реальном времени увидеть, где приложение создаёт неизвестный файл. На практическом примере отслеживаем события каталога рекурсивно, находим выгрузку и разбираемся, когда пригодится incrond.

Фото: fall maple / Pexels
bash

Форматер длинных команд Bash

Онлайн-форматер превращает длинную однострочную Bash-команду в читаемый многострочный вариант с переносами и отступами. Инструмент пригодится для Docker, gcloud и других громоздких консольных конструкций.

Фото: Tanha Tamanna Syed / Pexels
bash

Почему read пропускает строки в цикле while

Сравниваем циклы for и while при чтении файла в Bash и выясняем, почему вложенный read забирает строки из stdin. Наглядный скрипт показывает разницу между предварительной загрузкой значений и последовательным чтением.

Фото: Mark Stebnicki / Pexels
bash

Piu-piu — мультиплеерная игра на Bash

Piu-piu — консольная мультиплеерная игра, написанная на Bash и ANSI-последовательностях. Внутри вертолёты, дуэли, совместная игра, необычный специальный режим и простая установка из репозитория.

Фото: Ruben Boekeloo / Pexels
bash

Генераторы приглашения Bash без ручной настройки

Три браузерных генератора помогают собрать приглашение командной строки Bash без ручного изучения параметров PS1, PS2 и PS3. Подборка Bash Prompt Generator, Prompt Gen и EZprompt для быстрой настройки терминала.

Фото: Rafael Minguet Delgado / Pexels
bash

Как хранить crontab в Git

Простой способ хранить задания crontab в Git и автоматически раскатывать их на серверы без Ansible или Puppet. Скрипт забирает файл supercron из репозитория и целиком импортирует его в пользовательский crontab.

Фото: Alicia Christin Gerald / Pexels
linux

Как выйти в root shell через Vim

Vim и Vi могут запустить интерактивную оболочку через команды -c и --cmd. Показываем, почему редактор в белом списке команд способен обойти ограниченную оболочку и открыть путь к повышению привилегий.

Фото: Diana Indriany / Pexels
linux

MySQL без пароля через .my.cnf

Настраиваем подключение к MySQL без передачи логина и пароля в командной строке или Bash-скрипте. Используем файл ~/.my.cnf, секцию client, параметр --defaults-file и безопасные права доступа.

Фото: Dan Nelson / Pexels
bash

Как Bash освобождает память без Garbage Collector

Проверяем потребление RSS текущего процесса Bash до и после заполнения большой переменной. Эксперимент показывает, как память увеличивается и снова уменьшается без отдельного Garbage Collector.

Фото: Polina Tankilevitch / Pexels
bash

Лучшие посты Bashdays за октябрь 2023

Собрали самые просматриваемые, пересылаемые и обсуждаемые публикации Bashdays за октябрь 2023 года. В подборке Bash, Linux, chroot, strace, VIM, архиваторы и полезные shell-инструменты.

Фото: Tiger Lily / Pexels
bash

Эмоджи в именах функций Bash

POSIX ограничивает имена переменных в shell буквами, цифрами и подчёркиванием, но функции Bash допускают более необычные символы. Показываем рабочую функцию с эмоджи в имени и объясняем разницу правил.

Фото: Tim Witzdam / Pexels
linux

jc превращает вывод Linux-команд в JSON

Утилита jc преобразует вывод iptables, ls, fstab, ping и других Linux-команд в структурированный JSON. Показываем простой конвейер с jq, доступные парсеры и вариант использования jc как Python-модуля.

Фото: Bibek ghosh / Pexels
games

Остров сокровищ в Minecraft

На сервере Minecraft спрятаны сто денежных кодов и десять призов на обучение в Linux Factory. Рассказываем правила поиска, регистрацию, координаты и режим работы игрового сервера mc.bashdays.ru.

Фото: Lara Jameson / Pexels
bash

Почему false возвращает код 1 для help

Сравниваем встроенную команду false в Bash и отдельный бинарник /usr/bin/false. Объясняем, почему даже параметры --help и --version завершаются с кодом 1 и как проверить тип команды.

Фото: Mwabonje Ringa / Pexels
soft

Atuin для синхронизации истории команд

Atuin заменяет стандартный поиск Ctrl+R, хранит историю shell-команд в SQLite и синхронизирует её между компьютерами. Рассматриваем шифрование, фильтры и самостоятельный сервер через Docker Compose.

Фото: Godfrey Atima / Pexels
bash

Восемь ферзей на AWK через восьмеричный перебор

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

Фото: Doğan Alpaslan Demir / Pexels
bash

Генератор ANSI-кодов для цветного вывода

Веб-генератор ansicodes помогает мышкой подобрать цвет, фон и стиль терминального текста, а затем получить готовую ANSI-последовательность. Рассматриваем self-hosted-вариант, CLI-альтернативу и обязательный флаг --no-color.

Фото: Myburgh Roux / Pexels
linux

Как ускорить gzip-сжатие с помощью pigz

Обычный gzip использует одно ядро, а pigz распараллеливает сжатие и заметно ускоряет архивирование. Сравниваем время на файле 10 ГБ и подключаем pigz к tar через pipe и --use-compress-program.

Фото: Anna Tarazevich / Pexels
linux

Что такое POSIX и зачем он нужен

POSIX задаёт общий интерфейс операционных систем и помогает создавать переносимые программы и shell-скрипты. Объясняем происхождение стандарта, сертификацию Linux-дистрибутивов и практический смысл POSIX Shell.

Фото: Joachim Schnürle / Pexels
bash

XOR-шифрование слова Linux в Bash

Эксперимент с XOR-преобразованием слова Linux в PURID и обратно. Разбираем Bash brace expansion, систему счисления по основанию 64, printf, echo и альтернативный вариант на Perl.

Фото: Daniil Komov / Pexels
bash

Два коротких Bash-челленджа

Две задачи на самый короткий Bash-код: вывести таблицу умножения и нарисовать шахматную доску в терминале. Авторские решения используют brace expansion, арифметику, printf и ANSI-последовательности.

Фото: Pixabay / Pexels
bash

Мониторинг через journalctl без Prometheus

Простой самописный мониторинг через journalctl, logger и cron без связки Prometheus, Grafana и Alertmanager. Bash-скрипты считают события за заданный интервал и запускают полезную нагрузку при превышении порога.

Фото: Mikhail Nilov / Pexels
security

Самодельная двухфакторная аутентификация для SSH

Концепт второго фактора для SSH без стороннего сервиса аутентификации. Shell-скрипт после входа выдаёт код, уведомляет администратора, проверяет ответ через почту или Telegram и передаёт управление Bash.

Фото: Jakub Zerdzicki / Pexels
bash

tee и script для записи вывода терминала

Утилита tee одновременно показывает вывод команды на экране и записывает его в файл, а script сохраняет всю терминальную сессию. Разбираем простые команды для логирования вывода в реальном времени.

Фото: 도연 김 / Pexels
bash

Уникальные строки в Bash без сортировки

Сравниваем три способа получить уникальные строки файла: sort с uniq, ассоциативный массив в awk и чистый Bash. Готовый скрипт показывает одинаковый результат и напоминает о расходе памяти на больших файлах.

Фото: Anete Lusina / Pexels
bash

Условный параметр platform для ARM64 в pipeline

Разбираем, как условно добавлять параметр --platform linux/arm64 в Docker-команду внутри pipeline. Сравниваем Bash-конструкцию [[ ]] и POSIX-совместимый вариант с [ ], чтобы один сценарий работал на разных архитектурах.

Фото: Jonathan Borba / Pexels
linux

Fedora после установки с CRIMS0NH4T

CRIMS0NH4T автоматизирует рутинную настройку Fedora после чистой установки: DNF, RPM Fusion, кодеки, GPU-драйверы и оптимизацию GNOME. Разбираем раннюю версию Bash-скрипта и точечные улучшения для строгого режима, логов и …

Фото: Oluwaseun Duncan / Pexels
bash

source, точка и запуск Bash-скрипта

Чем отличаются source script.sh, . script.sh и ./script.sh в Bash. На примерах разбираем текущую оболочку, локальные и экспортированные переменные, shebang и право на выполнение.

Фото: cottonbro studio / Pexels
devops

Автоматические бэкапы PostgreSQL с уведомлениями

Bash-скрипт для автоматического создания дампов PostgreSQL через pg_dump, логирования результата и отправки уведомлений в Telegram. Дополнительно настраиваем очистку старых файлов через find и cron.

Фото: Jakub Zerdzicki / Pexels
linux

Как заменить last и lastb в Debian 13

В Debian 13 привычные команды last и lastb могут отсутствовать, но историю успешных и неудачных SSH-входов можно собрать через journalctl и gawk. Готовые команды формируют таблицу timestamp, IP и логина, поддерживают фильтр по …

Фото: Tima Miroshnichenko / Pexels
linux

Как не путать chmod и chown

Простой способ перестать путать команды chmod и chown через понятные смысловые якоря. Разбираем, как связать owner с владельцем, mode с режимом доступа и запомнить ключи tar без зубрёжки.

Фото: Kindel Media / Pexels
debug

Нумерация системных вызовов strace

Perl-скрипт автоматически нумерует системные вызовы в выводе strace и упрощает подготовку инъекций. Разбираем запуск через -o, цветовую подсветку, подсчёт openat и newfstatat и отделение трассировки stderr от вывода программы.

Фото: Daniil Komov / Pexels
bash

Таймер обратного отсчёта на Bash

Два варианта таймера обратного отсчёта на Bash: с ведущим нулём через tput и упрощённый цикл с управляющими последовательностями терминала. Разбираем позиционирование и скрытие курсора, расчёт длины строки и обновление счётчика на …

Фото: Image Hunter / Pexels
bash

Bash-скрипт в бинарник через shc

Знакомимся с Shell Script Compiler и превращаем Bash-скрипт в C-код и готовый ELF-бинарник. Разбираем установку shc, команду shc -f, созданные файлы и ограничения переносимости между Linux-системами.

Фото: Alexey Demidov / Pexels
services

Бесплатные Linux- и Windows-серверы в браузере

Тестируем платформу Terminator с бесплатными сессиями Debian 12 и Windows Server 2016 прямо в браузере. Рассматриваем ограничения 15-минутной сессии и сценарии для проверки программ, скриптов, команд и доступности сайтов.

Фото: Mikhail Nilov / Pexels
bash

Генератор случайных строк на Bash

Создаём генератор псевдослучайных строк в Bash с помощью /dev/urandom, tr и head. Разбираем набор допустимых символов, длину результата и ключи -c и -d команды tr.

Фото: lil artsy / Pexels
bash

Как Bash-скрипту определить запуск в контейнере

Проверяем из Bash, работает скрипт на хосте или внутри Docker-контейнера. Рассматриваем файл /.dockerenv, проверку процесса kthreadd через /proc/2/status и сохранение изменённого контейнера командой docker commit.

Фото: Joni Tuohimaa / Pexels
bash

Как работает fork-бомба в Bash

Разбираем fork-бомбу на Bash: как рекурсивный запуск процессов приводит к отказу в обслуживании и почему используется конвейер. Показываем читаемую форму функции и ограничение числа процессов через ulimit и limits.conf.

Фото: CK Seng / Pexels
bash

Пасхальное яйцо awk --nostalgia

Разбираемся, зачем в awk появилась недокументированная опция --nostalgia и почему она аварийно завершает программу. Заодно смотрим на GNU-синтаксис -W long_option и эквивалентные команды для nostalgia и copyright.

Фото: Sidde / Pexels
bash

Как вывести все доступные команды через compgen

Используем встроенную команду compgen для просмотра команд, алиасов, функций, ключевых слов, файлов и пользователей в Bash. Показываем генерацию динамических массивов и практический способ изучать возможности Linux небольшими …

Фото: Tibe De Kort / Pexels
bash

Как работает перенаправление 2>&1 в Bash

Разбираем файловые дескрипторы stdout и stderr и синтаксис перенаправления 2>&1 в Bash. Объясняем роль амперсанда, отличие от записи 2>1 и сокращённый оператор |& на примере отправки общего потока в tee.

Фото: Wayan Daton / Pexels
bash

Как Bash обрабатывает числа с ведущим нулём

Разбираемся, почему Bash воспринимает 08 как некорректное восьмеричное число и как безопасно получить номер месяца без ведущего нуля. Сравниваем решения через date, арифметику Bash, sed и awk с учётом различий между gawk и mawk.

Фото: RDNE Stock project / Pexels
bash

Как Bash распознаёт ответы да и нет

Разбираемся, откуда команды Linux берут допустимые варианты подтверждения y, n, Д, Н, 0, 1, плюс и минус. Изучаем выражения yesexpr и noexpr в локалях, проверяем их через locale и собираем собственную локаль с localedef.

Фото: Ann H / Pexels
linux

Как освободить занятый порт через Kill Port

Знакомимся с Bash-утилитой Kill Port, которая находит и завершает процесс, занявший указанный TCP-порт. Разбираем сценарий локальной разработки, простую ручную установку, запуск через killport и ограничения для процессов уровня …

Фото: Steve A Johnson / Pexels
bash

Как отключить буферизацию вывода через stdbuf

Настраиваем построчный вывод программы в файл с помощью stdbuf -oL, чтобы наблюдать за логом в реальном времени. Дополнительно разбираем сочетание с nohup и альтернативный запуск через утилиту script с принудительным flush.

Фото: Joshua Woroniecki / Pexels
bash

Как форматировать Bash-скрипты с shfmt

Знакомимся с shfmt — форматтером и синтаксическим анализатором shell-скриптов для POSIX, Bash и mksh. Показываем базовый запуск, перезапись файла ключом -w и применение инструмента перед публикацией кода в открытых репозиториях.

Фото: Marian Florinel Condruz / Pexels
bash

Подстановка аргумента текущей команды в Bash

Разбираем конструкцию !#:3 из механизма history expansion в Bash и Zsh. Показываем, как сослаться на третий аргумент ещё не выполненной команды и повторно использовать путь без дублирования ввода.

Фото: Christina Morillo / Pexels
bash

Почему переменные Bash нужно брать в кавычки

Показываем, как вывод переменной без кавычек запускает разбиение по словам и глоббинг в Bash. На примерах с шаблоном *.zip разбираемся, чем отличаются echo $var, echo "$var" и безопасный вывод через printf.

Фото: Suzy Hazelwood / Pexels
linux

Как восстановить SSH после ошибки в .bashrc

Восстанавливаем доступ по SSH, когда ошибка в .bashrc ломает интерактивную оболочку удалённого сервера. Показываем два способа входа через принудительный запуск /bin/sh и SFTP, а также объясняем риск простых ограничивающих …

Фото: Mikhail Nilov / Pexels
security

Как ограничить SFTP через MySecureShell

Настраиваем отдельный SFTP-сервер MySecureShell поверх OpenSSH и ограничиваем пользователей файловой подсистемой. Разбираем установку в Debian, смену оболочки, конфигурацию, управление скоростью и совместимость с SSHFS и rsync.

Фото: cottonbro studio / Pexels
debug

Как отследить запускаемые команды через strace

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

Фото: cottonbro studio / Pexels
bash

Как проверить формат файла скриптом sed

Пишем исполняемый sed-скрипт, который проверяет повторяющуюся последовательность строк в файле и выводит номер первого нарушения. Разбираем адресацию, переходы по меткам, команду q и набор тестовых случаев для проверки результата.

Фото: Tara Winstead / Pexels
bash

Одинарные и двойные скобки в Bash

Сравниваем условия [ ] и [[ ]] в shell-скриптах: переносимость между POSIX sh, Bash и ksh, доступные операторы, экранирование и регулярные выражения. Практические примеры показывают, когда выбрать совместимость, а когда — более …

Фото: Tasso Mitsarakis / Pexels
bash

Почему условие while с pgrep работает не так

Разбираем ошибочную конструкцию while с pgrep, command substitution, test и перенаправлением в файл 0. Упрощаем цикл Bash до проверки кода возврата процесса и объясняем, почему лишние квадратные скобки только запутывают условие.

Фото: Andrea Piacquadio / Pexels
linux

Как искать пути повышения привилегий через LinPEAS

Проверяем Linux-сервер с помощью LinPEAS и ищем ошибки конфигурации, SUID-файлы и другие пути повышения привилегий. Показываем запуск без установки через curl или Python и объясняем, почему скрипту не нужен root.

Фото: Bulat843 / Pexels
bash

Как использовать алиасы в Bash-скриптах

Показываем, почему алиасы из `.bashrc` не работают в обычном Bash-скрипте и как включить интерактивный режим ключом `-i`. Сравниваем этот подход с `source`, `expand_aliases` и экспортируемой функцией.

Фото: Tara Winstead / Pexels
bash

Как работают сопроцессы в Bash

Разбираем сопроцессы `coproc`, появившиеся в Bash 4, и их отличие от обычных фоновых заданий. Показываем синтаксис запуска, массив дескрипторов COPROC, направления stdin и stdout и правила именованной группировки.

Фото: Mikhail Nilov / Pexels
bash

Как реализовать try/catch в Bash

Разбираемся, чем заменить try/catch в Bash с помощью логического оператора `||`, группировки команд и проверки кода возврата. Показываем практический шаблон обработки ошибок и объясняем, когда проще использовать `set -e`.

Фото: So Phors / Pexels
bash

Как управлять заданиями cron из Bash

Добавляем и удаляем задания cron прямо из Bash-скрипта. Используем уникальные комментарии для идентификации строк crontab, функции ADD_CRON_TASK и REMOVE_CRON_TASK, а также учитываем переменную PATH.

Фото: Karolina Grabowska / Pexels
bash

Задача о восьми ферзях на AWK

Решаем классическую задачу о восьми ферзях средствами AWK и вложенных циклов. Разбираем проверку горизонталей и диагоналей, ограничение оператора break и полученные 92 варианта.

Фото: Steve A Johnson / Pexels
bash

Как менять регистр ASCII одним битом

Разбираем двоичное представление букв ASCII и отличие верхнего регистра от нижнего в шестом бите. Меняем регистр через XOR и сравниваем подход со встроенными конструкциями Bash.

Фото: Markus Spiske / Pexels
bash

Двоеточие или true в бесконечном цикле Bash

Сравниваем два бесконечных цикла Bash — с командами : и true. Объясняем одинаковый код возврата, роль пустой команды и наследие Bourne Shell, а также оцениваем читаемость обоих вариантов.

Фото: mg shawn / Pexels
bash

Двоичное кодирование через basenc

Показываем, как утилита basenc из GNU coreutils кодирует UTF-8-текст в двоичное представление и возвращает его обратно. Разбираем параметры base2msbf, ширину вывода и байт перевода строки.

Фото: Pixabay / Pexels
bash

Как настроить подсказки и темы в Bash

Добавляем в чистый Bash автоподсказки и подсветку команд с помощью BLE.sh. Затем устанавливаем oh-my-posh, подключаем темы оформления через профиль оболочки и получаем удобный терминал без Zsh.

Фото: FOX ^.ᆽ.^= ∫ / Pexels
bash

Как проверять код через pre-commit

Настраиваем Git-хук pre-commit для автоматической проверки Bash-скриптов через ShellCheck. В качестве бонуса адаптируем тот же подход для Ansible-плейбуков и ansible-lint.

Фото: Jakub Zerdzicki / Pexels
bash

Как узнать имя функции в Bash

Разбираем массив FUNCNAME и получаем имя текущей функции внутри Bash-скрипта. Показываем стек вызовов, аналог funcstack в Zsh и связанные переменные BASH_SOURCE и BASH_LINENO для отладки.

Фото: Walls.io / Pexels
bash

Что означает звёздочка в history Bash

Разбираемся, почему команда history иногда показывает звёздочку рядом с записью Bash. Пошагово воспроизводим изменение строки истории, откатываем правку и сверяем поведение с документацией GNU Bash.

Фото: AI25.Studio Studio / Pexels
bash

Как пронумеровать строки одним вызовом sed

Решаем задачу нумерации строк одним процессом sed вместо связки из двух вызовов. Используем команду `=` и управляющие ANSI-последовательности для перемещения курсора в терминале.

Фото: Pixabay / Pexels
bash

Как скачать файл средствами Bash

Скачиваем файл без curl и wget через встроенное устройство `/dev/tcp` в Bash. Разбираем HTTP-запрос, файловый дескриптор и ограничения прямого сокетного соединения без TLS.

Фото: Sergei Starostin / Pexels
bash

Как работает set -k в Bash

Разбираемся с малоизвестной настройкой `set -k` в Bash, которая превращает присваивания в окружение команды независимо от их позиции. На примере `dd` показываем неожиданное поведение и способ отключить режим через `set +k`.

Фото: Darren Halos / Pexels
workflow

Как управлять dotfiles через chezmoi

Знакомимся с chezmoi для управления `.bashrc`, `.vimrc`, `.gitconfig` и другими dotfiles на нескольких устройствах. Добавляем и редактируем конфиги, смотрим diff, восстанавливаем файлы и синхронизируем репозиторий через Git.

Фото: Mikhail Nilov / Pexels
bash

Как определить pipe в Bash через test -t

Используем проверку test -t в Bash, чтобы понять, направлен ли стандартный вывод в терминал или в pipe. Скрипт сможет включать оформление для интерактивного запуска и не передавать управляющие последовательности другим утилитам.

Фото: Ann H / Pexels
bash

Как проверить синтаксис Bash-скрипта без запуска

Проверяем синтаксис Bash-скриптов до выполнения с помощью bash -n и режима set -o noexec. Добавляем проверку всех .sh-файлов в Git hook и используем set -u, чтобы находить обращения к необъявленным переменным.

Фото: cottonbro studio / Pexels
bash

Как проверить существование файла в Bash

Проверяем существование обычного файла в Bash с помощью test -f и квадратных скобок. Разбираем коды возврата, отрицание, однострочные условия и другие ключи для проверки директорий, сокетов и прав доступа.

Фото: cottonbro studio / Pexels
bash

Как работает exec и перенаправление дескрипторов в Bash

Разбираем два режима команды exec в Bash: замену текущего процесса и перенаправление потоков. На примерах открываем файловые дескрипторы 3–9, отправляем stdout и stderr в файлы и читаем несколько файлов во вложенных циклах.

Фото: Aleks Magnusson / Pexels
bash

Как синхронизировать историю Bash между терминалами

Настраиваем общую историю команд Bash для нескольких одновременно открытых терминалов. Разбираем `history -a/-c/-r`, `histappend`, `HISTCONTROL` и `PROMPT_COMMAND`, чтобы новые команды сразу появлялись во всех сессиях.

Фото: Kindel Media / Pexels
bash

Как узнать дату и время в Bash без date

Необычные способы получить текущую дату, время и Unix time в Bash без привычной команды date. Используем stat, ps, printf, преобразование `${parameter@P}`, а также переменные EPOCHREALTIME и EPOCHSECONDS.

Фото: Engin Akyurt / Pexels
bash

Почему в Bash лучше использовать двойные скобки

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

Фото: Tom Fisk / Pexels
bash

Горячие клавиши Bash для работы в терминале

Подборка полезных горячих клавиш Bash для навигации, редактирования команд, поиска по history и управления терминалом. Разбираем сочетания Ctrl и Alt, которые помогают быстрее работать в командной строке.

Фото: Soumil Kumar / Pexels
bash

Как ждать файл в Bash через until и таймаут

Используем цикл until в Bash, чтобы дождаться появления непустого файла и затем выполнить полезную нагрузку. Добавляем таймаут через SECONDS и разбираем ограничения такого опроса по времени.

Фото: marco / Pexels
linux

Как найти лишние файлы в Linux через cruft

Утилита cruft находит файлы, которые появились в Linux в обход пакетного менеджера. Настраиваем исключения для Docker и пользовательских каталогов, сохраняем отчёт и ищем забытые скрипты или подозрительные артефакты.

Фото: cottonbro studio / Pexels
devops

Почему серверные диски надёжнее обычных

Сравниваем вероятность неисправимых ошибок чтения у WD Blue, WD Gold, SAS Toshiba и SSD Micron. Объясняем, почему RAID не всегда защищает от повреждённых данных и как контрольные суммы ZFS помогают обнаруживать ошибки.

Фото: Josh Moodley / Pexels
bash

Как добавить номера строк в отладку Bash

Настраиваем трассировку Bash через set -xve и переменную PS4, чтобы видеть файл, номер строки и имя функции. Добавляем цвет к отладочному выводу и быстрее находим место падения большого скрипта.

Фото: Bulat843 🌙 / Pexels
bash

Как искать примеры Bash без интернета

Когда нет интернета и подсказок ИИ, готовые примеры Bash уже лежат в системных скриптах Linux. Одной командой находим реальные случаи использования getopts и других конструкций в /usr/bin, /usr/sbin, /bin и /sbin.

Фото: Ruben Boekeloo / Pexels
bash

Как работает readonly в Bash

Разбираем readonly-переменные в Bash: как защитить значение от перезаписи, почему unset не помогает и как увидеть ошибку readonly variable. Отдельно показываем рискованный трюк с GDB и его ограничения.

Фото: Towfiqu barbhuiya / Pexels
linux

Как узнать число процессорных ядер в Linux

Сравниваем три способа узнать число доступных процессорных ядер в Linux: /proc/cpuinfo, getconf и nproc. Используем результат в Bash-скрипте для обновления worker_processes и безопасной перезагрузки Nginx.

Фото: ed br / Pexels
bash

Почему самоучитель по Bash не получился в Markdown

Практический опыт подготовки большого самоучителя по Bash сначала в Markdown и Pandoc, а затем в LibreOffice. Разбираем ограничения таблиц, кириллицы, UTF-символов и PDF-вёрстки, которые стали заметны после девятнадцати глав.

Фото: Ron Lach / Pexels
bash

Автозакрытие скобок и кавычек в Bash

Настраиваем Bash Readline так, чтобы кавычки, круглые, квадратные и фигурные скобки автоматически закрывались прямо в терминале. Разбираем bind, inputrc, режим emacs и возможные конфликты горячих клавиш.

Фото: Matheus Bertelli / Pexels
bash

Как не запускать скрипт повторно через flock

Защищаем долгий Bash-скрипт от параллельных запусков из cron с помощью flock и lock-файла. Готовый обработчик блокирует повторную копию процесса и освобождает блокировку после завершения работы.

Фото: Engin Akyurt / Pexels
bash

Как проверить tar.gz без распаковки

Проверяем целостность архивов tar.gz без распаковки командами tar и gzip, намеренно повреждаем файл через truncate и разбираем коды возврата. В конце — готовый Bash-скрипт для автоматической проверки резервных копий.

Фото: brokenadmiral_ / Pexels
bash

Специальные параметры Bash на примерах

Практический справочник по специальным параметрам Bash: позиционные аргументы, PID, код возврата, IFS, имя скрипта и последний фоновый процесс. Каждый параметр разобран на коротком воспроизводимом примере.

Фото: Gonzalo Álvarez Balcazar / Pexels
bash

Как автоматизировать ответы командой yes

Разбираем Linux-команду yes для автоматической передачи подтверждений в интерактивные программы. Показываем работу через пайп, произвольные ответы и отправку пустой строки для имитации Enter в скриптах и пайплайнах.

Фото: Tara Winstead / Pexels
linux

Как узнать внешний IP из терминала

Собрали консольные сервисы для определения внешнего IP-адреса и геолокации через curl, dig и whois. Показываем короткие команды и объясняем, как сделать проверку отказоустойчивой в Bash-скриптах.

Фото: Luke Greenwood / Pexels
linux

Поиск файлов по времени через find -newer

Разбираем тест -newerXY утилиты find и временные метки файлов. Ищем изменения относительно заданной даты или файла-образца, создаём контрольную метку через touch и выводим время найденных объектов.

Фото: Thirdman / Pexels
bash

ASCII и UTF-8 в Bash через printf

Используем printf для получения кодов символов в шестнадцатеричной, восьмеричной и десятичной системах. Проверяем влияние LC_ALL на UTF-8 и сохраняем форматированный результат в переменную.

Фото: Markus Spiske / Pexels
bash

Как Bash запускает скрипты без Shebang

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

Фото: Ron Lach / Pexels
linux

Как получить доступ к закрытому серверу через netcat

Разбираем Reverse Shell через netcat для подключения к серверу без внешнего IP-адреса. Показываем команды для принимающей стороны и закрытого узла, перенаправление потоков и обязательные ограничения безопасности.

Фото: Brett Sayles / Pexels
bash

Работа со временем в Bash без date

Работаем со временем в Bash через SECONDS, EPOCHSECONDS, EPOCHREALTIME и встроенный printf. Сравниваем с date, форматируем Unix-время и временно меняем часовой пояс через TZ.

Фото: Zia Moshtaghi / Pexels
bash

Зачем командам двойное тире

Разбираем назначение разделителя -- в командах Linux и показываем его работу на примерах ssh, cat и rm. Учимся безопасно передавать имена файлов и аргументы, начинающиеся с дефиса.

Фото: Arlind D / Pexels
bash

Как гарантированно удалять tmp-файлы через trap

Используем Bash trap с EXIT для автоматической очистки временных файлов при успешном завершении, ошибке и SIGTERM. Проверяем порядок системных вызовов через strace и разбираем работу ловушек сигналов.

Фото: cottonbro studio / Pexels
linux

Чем rm отличается от unlink

Сравниваем команды rm и unlink в Linux: системные вызовы, обработку отсутствующих файлов, шаблоны и каталоги. Показываем, когда unlink удобнее для контроля ошибок в Bash-скриптах.

Фото: Yan Krukau / Pexels
bash

Защита от повторного запуска через lckdo

Используем lckdo из пакета moreutils, чтобы второй экземпляр скрипта не запускался одновременно с первым. Рассматриваем lock-файл, ожидание через -w и безопасный запуск периодической задачи cron.

Фото: Heru Dharma / Pexels
bash

Многопоточное чтение файлов на Bash через FIFO

Практический Bash-скрипт для параллельной обработки строк файла с ограничением числа потоков через FIFO. Разбираем именованный канал, файловый дескриптор и простой семафор без GNU parallel.

Фото: Satoshi Hirayama / Pexels
bash

Приём почты по POP3 в Bash через coproc

Продолжаем практику Bash-сопроцессов и принимаем почту по POP3 через openssl s_client. Реализуем команды STAT, DELE, RETR и TOP, затем собираем цикл обработки сообщений.

Фото: Nur Yilmaz / Pexels
bash

Проверка переменной в Bash через -z

Проверяем, определена ли переменная Bash, с помощью условного выражения -z и расширения параметра ${VAR+x}. Пошагово разбираем результаты, режим set -x, export и unset.

Фото: Ann H / Pexels
games

Три игры для изучения командной строки Linux

Три игровых тренажёра для изучения командной строки Linux: BashCrawl, Terminus и CL Mystery. Они помогают практиковать навигацию, команды и логику в формате текстовых приключений и детективных квестов.

Фото: Erik Mclean / Pexels
linux

Фильтрация файлов через awk без сортировки

Показываем, как отфильтровать строки одного текстового файла по списку из другого с помощью конструкции NR == FNR и массива awk. Разбираем работу NR, FNR и next, выбор столбцов и ограничение по памяти без обязательной …

Фото: Sevgi Gümüş / Pexels
bash

Измерение времени Bash-скриптов через EPOCHREALTIME

Функция uTIME измеряет интервалы выполнения Bash-кода в микросекундах с помощью EPOCHREALTIME. Сравниваем функции в текущей оболочке и subshell, а также преобразование даты через printf и внешнюю команду date.

Фото: Peter Morch / Pexels
bash

Как base64 игнорирует посторонние символы

Разбираем ключ -i в GNU base64, который пропускает символы вне алфавита кодирования. Примеры показывают, как декодировать изменённые строки и почему такое сокрытие данных нельзя считать настоящим шифрованием.

Фото: Markus Spiske / Pexels
linux

Логирование cron-задач и ротация логов

Показываем, как сохранить стандартный вывод cron-задачи в отдельный файл и настроить его ротацию через logrotate. Такой журнал помогает увидеть внутренние ошибки приложения, которые не попадают в системный лог cron.

Фото: Mikhail Nilov / Pexels
bash

Тернарный оператор Bash и его ловушки

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

Фото: Kikz Pinzon / Pexels
bash

Fallthrough в операторе case Bash

Разбираем завершители блоков ;;, ;& и ;;& в операторе case Bash. На практических примерах показываем обычное завершение ветки, fallthrough и повторную проверку следующих шаблонов.

Фото: Atlantic Ambience / Pexels
bash

IP-watchdog на Bash для перезагрузки роутера

Пишем Bash-watchdog, который проверяет доступность интернета и наращивает интервалы попыток восстановления связи. Для физической перезагрузки роутера подключаем недорогое USB-реле и управляем им через последовательный порт.

Фото: Pascal / Pexels
linux

Как запускать долгие скрипты в screen

Разбираем запуск долгих задач в именованных screen-сессиях, подключение через -r и -x и корректное отсоединение сочетанием Ctrl+A, d. Показываем фоновый запуск, передачу команд в сессию и организацию логирования.

Фото: Tom Fisk / Pexels
bash

Как кэшировать управляющие последовательности tput

Разбираемся, почему многократные вызовы tput замедляют Bash-скрипт, и один раз сохраняем управляющие последовательности терминала в переменные. Показываем печать, экранирование и практические однострочники.

Фото: Rafael Minguet Delgado / Pexels
linux

Как переназначить Ctrl+C в Linux

Смотрим текущие настройки терминала через stty -a и меняем символ прерывания процесса с Ctrl+C на другое сочетание клавиш. Разбираем возврат настройки, запись в shell-конфиг и альтернативу через xbindkeys.

Фото: Erkan Utu / Pexels
bash

Как рендерить шаблоны в Bash через envsubst

Создаём шаблон конфигурации nginx и подставляем разные значения для production и stage через envsubst. Сравниваем функцию рендеринга с heredoc и разбираем передачу переменных окружения.

Фото: Marina Zvada / Pexels
bash

Лишний cat и другие Bash-антипаттерны

Разбираем распространённые Bash-антипаттерны из учебных скриптов: лишний cat перед cut, grep и tr, а также небезопасный перебор файлов через ls. Показываем более прямые и устойчивые варианты команд.

Фото: Bayram Er / Pexels
bash

Как временно отключить alias в Bash

Пять способов запустить исходную команду в Bash, не удаляя alias из конфигурации оболочки. Показываем экранирование, кавычки, полный путь, command и unalias с восстановлением настроек.

Фото: Ekaterina / Pexels
bash

Как повторять символы в Bash

Несколько способов вывести повторяющуюся строку в Bash: собственная функция repeat, seq, printf и tr. Разбираем параметры функции, двойное тире printf и компактные однострочные команды.

Фото: Bastien Neves / Pexels
bash

Зачем нужна команда enable в Bash

Разбираем встроенную команду enable в Bash: отключаем shell builtin, переключаемся на дисковую утилиту и загружаем расширения оболочки. Показываем работу с test, mkdir и BASH_LOADABLES_PATH.

Фото: Ömer Yılmaz / Pexels
linux

Как настроить zram и отключить zswap

Отключаем zswap через параметры GRUB и настраиваем сжатие оперативной памяти с помощью zram. Показываем Bash-скрипт и конфигурацию systemd-zram-generator с алгоритмом lz4.

Фото: Richard L / Pexels
bash

Как работает RANDOM в Bash

Исследуем генератор псевдослучайных чисел RANDOM в Bash на примере безопасной русской рулетки. Разбираем seed, влияние BASH_COMPAT и различия поведения между версиями оболочки.

Фото: Pavel Danilyuk / Pexels
linux

Как установить сертификаты Минцифры в Ubuntu

Устанавливаем корневой и подчинённый сертификаты Минцифры в Ubuntu одной shell-командой. Проверяем subject, SHA-1 fingerprint и цепочку OpenSSL, обновляем системное хранилище CA и тестируем HTTPS через curl.

networks

Контроль новых IP и MAC через csh и awk

Контролируем появление новых связок IP и MAC в сетях DMZ и LAN на OPNsense. Скрипты csh и awk сравнивают ARP-таблицу со справочником и отправляют уведомление в Telegram без раскрытия инфраструктуры.

Фото: Brett Sayles / Pexels
bash

Перезапуск сервиса по длине очереди RabbitMQ

Пишем Bash-скрипт, который проверяет длину очереди RabbitMQ по SSH и перезапускает зависший микросервис при накоплении писем. Разбираем cron, rabbitmqctl, awk и запуск команд от отдельного пользователя.

Фото: Pavel Danilyuk / Pexels
bash

Чем export отличается от переменной Bash

Показываем разницу между обычной переменной Bash и переменной окружения, объявленной через export. Проверяем наследование в подпроцессах и разбираем обходной способ передачи массивов через строку.

Фото: luis gomes / Pexels
security

Белый список команд SSH через ONLY

Настраиваем белый список команд для SSH-пользователя с помощью Bash-скрипта ONLY и директивы command в authorized_keys. Разбираем ключи, ограничения сессии и правила .onlyrules без выдачи интерактивной оболочки.

Фото: Jakub Zerdzicki / Pexels
bash

Как dd обновляет прогресс в одной строке

Разбираем, как dd обновляет статистику через stderr и символ возврата каретки. Превращаем динамический прогресс в строки и пишем Bash-бенчмарк для сравнения скорости при разных размерах блока.

Фото: Aleksander Dumała / Pexels
bash

Как редактировать команды через Ctrl+X+E

Используем встроенный хоткей Ctrl+X+E для редактирования многострочной команды в Vim, Nano или другом редакторе. Настраиваем переменную EDITOR и разбираем, как Bash выполняет сохранённый временный файл.

Фото: Kürşad Ç. / Pexels
linux

Как создать и завершить зомби-процесс в Linux

Создаём зомби-процесс на C и Bash, находим его и родительский PID через ps и разбираем завершение процесса. Объясняем, почему kill по PID зомби не помогает и когда такие записи можно не трогать.

Фото: James L / Pexels
bash

Терминальная шпаргалка по хоткею в Bash

Создаём всплывающую шпаргалку прямо в терминале без графической оболочки. Используем tput, read, trap и bind, чтобы показывать альтернативный экран по Ctrl+H и закрывать его после отпускания клавиши.

Фото: John Petalcurin / Pexels
bash

Юнит-тесты Bash-скриптов с bashunit

Пишем первый юнит-тест для Bash-скрипта с фреймворком bashunit. Разбираем установку, assert_equals, успешный и проваленный прогон, а также другие доступные проверки.

Фото: ThisIsEngineering / Pexels
linux

Systemd-таймеры против cron

Сравниваем systemd timers и cron на практическом примере: создаём service и timer, запускаем задачу каждую минуту и включаем автозагрузку. Разбираемся, когда гибкость таймеров оправдана, а когда сотни unit-файлов только усложняют …

Фото: Kofi Nartey / Unsplash
bash

Анимация выполнения команд на Bash

Bash-скрипт запускает долгую команду в фоне и показывает текстовую анимацию до её завершения. Разбираем временный лог, trap, tput, сигналы, PID процесса и очистку терминального вывода.

Фото: Danny Meneses / Pexels
bash

Аргументы скрипта в Bash

На примерах сравниваем специальные переменные $@ и $* в Bash с кавычками и без них. Показываем разбиение аргументов с пробелами, объединение в одну строку и влияние разделителя IFS.

Фото: Nemuel Sereti / Pexels
security

Детерминированные пароли с pwgen

Генерируем повторяемые пароли через pwgen по логину, ключевому файлу и запоминаемому модификатору. Bash-обёртка скрывает ввод, проверяет зависимости и позволяет получать тот же набор паролей без их хранения.

Фото: Pixabay / Pexels · CC0
bash

Как проверить каталоги в PATH одной командой

Разбираем Bash-команду, которая проверяет каждый элемент PATH и выводит отсутствующие или недоступные каталоги. Пошагово объясняем set -f, IFS, проверку переменной, права доступа и диагностику путей через namei.

Фото: Masood Aslami / Pexels
bash

TCP и UDP-запросы через /dev в Bash

Проверяем TCP- и UDP-порты средствами Bash через /dev/tcp и /dev/udp, когда в системе нет curl, wget или telnet. Добавляем timeout, читаем код возврата и сравниваем подход с netcat.

Фото: Brett Sayles / Pexels
bash

Временные метки в истории Bash и Zsh

Добавляем дату и время к истории команд в Bash через HISTTIMEFORMAT и настраиваем цветные метки. Сравниваем history -E, history -i и fc в Zsh и сохраняем удобные настройки оболочки.

Фото: Mikhail Nilov / Pexels
bash

Генератор TOTP-кодов на Bash

Собираем локальный генератор TOTP-кодов для двухфакторной аутентификации на Bash. Извлекаем секрет из QR-кода через zbarimg, генерируем OTP с oathtool и делаем меню для нескольких сервисов.

Фото: Annushka Ahuja / Pexels
bash

Как Bash обрабатывает сигналы

Объясняем коды завершения после SIGINT и SIGTERM и настраиваем обработчики сигналов через trap в Bash. Разбираем, почему получается код 130, как изменить поведение скрипта и почему SIGKILL нельзя перехватить.

Фото: Emiliano Rodríguez / Pexels
linux

Как найти шрифты с кириллицей в Linux

Ищем Linux-шрифты с кириллическими глифами через fc-list и сопоставляем их со шрифтами ImageMagick. Затем Bash-скрипт генерирует образцы русской буквы «А» для каждого найденного файла.

Фото: Eugenia Remark / Pexels
linux

Как устроена справочная система man

Разбираем разделы справочной системы man: команды, системные вызовы, форматы файлов, административные утилиты и функции ядра. Показываем поиск через man -k, страницы intro и вывод справки в HTML.

Фото: Tima Miroshnichenko / Pexels
bash

Консольный справочник по тегам на Bash

Разбираем Bash-скрипт spr.sh — консольный справочник для поиска записей и фрагментов кода по нескольким тегам. Конфигурация хранится в текстовом файле, а фильтрация реализована однострочником awk.

Фото: Tima Miroshnichenko / Pexels
bash

Почему Bash-цикл зависает после grep -m1

Исследуем бесконечный Bash-цикл, канал до grep -m1 и незаметный SIGPIPE. Смотрим коды сигналов, процессы подоболочки и способы корректно остановить cat после закрытия конвейера.

Фото: Pavel Danilyuk / Pexels
services

Basic Auth в Nginx через Lua и MySQL

Реализуем расширенную Basic Auth-аутентификацию в Nginx с помощью Lua и базы MySQL. Скрипт OpenResty читает заголовок Authorization, хеширует пароль, проверяет пользователя и передаёт запрос в защищённый location.

Фото: Jakub Zerdzicki / Pexels
security

Безопасное меню команд через SSH

Ограничиваем SSH-пользователя интерактивным меню разрешённых административных команд. Bash-скрипт, ForceCommand и точечное правило sudoers дают перезапускать сервисы без полноценного доступа к серверу.

Фото: Fernando Narvaez / Pexels
bash

Как использовать heredoc в Bash

Разбираем heredoc в Bash на практических примерах с cat, sed, перенаправлением в файл и удалённым запуском команд по SSH. Показываю, как управлять подстановкой переменных и отступами.

Фото: Mikhail Nilov / Pexels
linux

Как отслеживать изменения в /etc с etckeeper

Etckeeper превращает каталог /etc в Git-репозиторий и помогает отслеживать, фиксировать и откатывать изменения конфигурации Linux. Разбираем установку, удалённый репозиторий, коммиты и автоматизацию через incron.

Фото: João Jesus / Pexels
bash

Стеганография в правах доступа Linux

Прячем ASCII-сообщение в девяти битах прав доступа Linux-файлов. На Bash разбираем сдвиги битов, восьмеричные режимы chmod и кодирование текста последовательностью файлов.

Фото: Magda Ehlers / Pexels
bash

Временная почта из консоли с tmpmail

Устанавливаем Bash-утилиту tmpmail и создаём одноразовый почтовый адрес прямо в терминале. Показываем генерацию адресов, выбор домена, просмотр входящих писем и получение последнего сообщения в текстовом виде.

Фото: cottonbro studio / Pexels
bash

Диалоговые окна в Bash с whiptail

Добавляем в Bash-скрипты терминальные окна yes/no, поля ввода, меню и прогресс-бар с помощью whiptail. На готовых примерах разбираем коды возврата и перенаправление файловых дескрипторов.

Фото: Rafael Minguet Delgado / Pexels
debug

Как найти зависание PHP-FPM с помощью strace

Практический разбор зависания PHP-FPM и ошибки 502 Bad Gateway с помощью strace и lsof. По файловому дескриптору находим недоступный Elasticsearch, из-за которого воркер перестаёт обрабатывать запросы.

Фото: Ron Lach / Pexels
bash

Как очистить конфиг от комментариев на Bash

Пишем небольшой Bash-парсер, который превращает большой php.ini в компактный шаблон без комментариев и пустых строк. Разбираем чтение файла построчно, continue и регулярные выражения в конструкции [[ =~ ]].

Фото: RDNE Stock project / Pexels
bash

Какие циклы Bash работают быстрее

Сравниваем время инициализации и выполнения разных вариантов for и while в Bash, а также цикла gawk. Тест на пяти миллионах итераций показывает влияние генерации списка, расхода памяти и содержимого тела цикла.

Фото: Giant Asparagus / Pexels
bash

Коды завершения команд в Bash

Разбираем коды завершения Linux-команд от 0 до 255 и специальную переменную $?. Учимся сохранять статус, строить обработку ошибок и завершать Bash-скрипт нужным кодом через exit.

Фото: Erik Mclean / Pexels
bash

База данных на Bash

Строим простой индекс для большого отсортированного текстового файла с помощью ассоциативного массива Bash и sed. Ограничиваем поиск диапазоном строк по первой букве и ускоряем извлечение данных без тяжёлой СУБД.

Фото: Tima Miroshnichenko / Pexels
devops

Как Docker генерирует имена контейнеров

Разбираемся, откуда берутся случайные имена Docker-контейнеров и как устроен генератор Moby с пасхалкой для Стива Возняка. В конце собираем похожий генератор на Bash и рассматриваем готовые альтернативы.

Фото: Tima Miroshnichenko / Pexels
linux

Как восстановить удалённый лог через файловый дескриптор

Воспроизводим ситуацию, когда процесс продолжает писать в удалённый лог через открытый файловый дескриптор. Восстанавливаем содержимое через /proc, а затем с помощью GDB переключаем работающий процесс на новый файл без …

Фото: Nicolas Foster / Pexels
bash

Как запускать команды параллельно в Bash

Запускаем фоновые команды в Bash через оператор &, управляем заданиями с помощью wait и jobs и получаем PID через $!. Собираем параллельный загрузчик файлов и сравниваем нативный подход с GNU Parallel.

Фото: Mehmet Turgut Kirkgoz / Pexels
bash

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

Строим взаимодействие между Bash-процессами через сигналы SIGRTMIN и trap без временных файлов. Пишем сервер-слушатель и клиент, разделяем события по индексам сигналов и разбираем порядок обработки и приоритеты.

Фото: Elina Volkova / Pexels
bash

Как передавать файлы через transfer.sh

Автоматизируем передачу файлов с сервера скриптом на Bash: проверяем размер, упаковываем крупные данные, загружаем их через curl в transfer.sh и получаем ссылку. Отдельно обсуждаем лимиты сервиса и безопасность.

Фото: Kampus Production / Pexels
bash

Как работает eval в Bash

Разбираем двойную обработку команд в Bash через eval на примерах brace expansion, косвенного раскрытия переменных и файловых дескрипторов. Показываем, почему перенаправление с переменной требует ещё одного прохода интерпретатора.

Фото: Ryleigh Gordon / Pexels
linux

Как работают нулевые байты в Linux

Экспериментируем с /dev/zero, поведением read и нулевым символом в C-строках. Затем находим смещение строки через strings и точечно патчим бинарный файл одним нулевым байтом с помощью dd.

Фото: cottonbro studio / Pexels
bash

Как ускорить find с exec и xargs

Разбираем разницу между суффиксами ; и + у find -exec, сокращаем число запускаемых процессов и подключаем xargs для параллельной обработки файлов. Практические команды помогают ускорить поиск и безопасно передавать группы …

Фото: Mehmet Turgut Kirkgoz / Pexels
linux

Типы оболочек в Linux

Разбираем interactive, non-interactive, login, non-login, restricted и другие типы оболочек Linux. Смотрим, какие файлы профиля они читают, почему скрипт работает вручную, но ломается в cron, и как определить текущий режим.

Фото: Kaboompics / Pexels
qa

Сколько стоит фреймворк автоматизации #1

Однажды я вручную гонял регресс 5 недель. Больше я так не хочу. Я построил фреймворк, который за 30 минут прогоняет то, на что раньше уходил месяц. Но главное — на этапе проектировки запросов мы нашли столько дефектов в SOAP API, …

Фото: Mikhail Nilov / Pexels
bash

Почему лишние условия убивают читаемость в Bash

Мне за 30, я видел много скриптов с дьявольскими отрицаниями, и каждый раз хотелось задушить автора. Поэтому я решил написать пост, в котором покажу как превратить кошмарную конструкцию в простой if-else без единого лишнего знака. …

Фото: Emrah Tolu / Pexels
dev

Как я скрестил WinSCP, Puttygen и CMD на старой винде

Часто слышу, что автоматизировать sftp на Windows XP‑10 невозможно без кучи сторонних утилит. На деле всё проще. Я разобрался, как затащить sftp с ключами на такие системы. Самое смешное — WinSCP пришлось настроить так, чтобы он …

Фото: Nicolas Foster / Pexels
devops

Как перейти с Docker на Podman

Вместе с Романом Шубиным, СТО и автором канала Bash Days, собрали отдельный мини-курс по Podman. Внутри — восемь материалов, которые помогут освоить инструмент с открытым исходным кодом для работы с контейнерами.

Фото: Alex Levis / Pexels
dev

Hugo за 30 секунд. Мой пайплайн на Gitea Actions

Мне надоело кормить корпоративных монстров своими данными и ждать пока их джава-скрипты прогрузятся. Gitea встала на мой дохлый сервер как родная и начала летать даже с кривым конфигом. Ты получишь тот же функционал но без слежки …

Фото: Frans van Heerden / Pexels
bash

Awk для новичков. Как автоматизировать анализ логов

Я знаю, что сейчас все гонятся за JSON, и это удобно для новичков. Но когда речь заходит о реальной работе с большими логами, я всегда возвращаюсь к awk. Мой опыт показывает, что для быстрых фильтров и обработки огромных объемов …

Фото: Alfredo Lau-Tam / Pexels
games

Браузерный киберпанк-симулятор хакера — DeepNet

Забудьте про графику, в DeepNet всё построено на терминале и командах Bash. Игра очень атмосферная, с онлайн-миром и кучей возможностей для прокачки. Я залип на ней надолго, советую всем, кто любит подобные симуляторы.

Фото: ds rexy / Pexels
dev

Безопасное управление секретами в скриптах и приложениях

Часто в скриптах приходится работать с паролями и ключами, но как не оставить их на диске? Делюсь простым приемом на Bash и более надежным вариантом на C с блокировкой памяти. Погнали!

Фото: cottonbro studio / Pexels
dev

Как разделить личные и рабочие git-конфиги без костылей

Забудь про постоянные правки git-конфига или скрипты перед пушем! Рассказываю, как настроить git, чтобы он автоматически подставлял разные user.email и user.name для личных и рабочих проектов.

Фото: Hana Brannigan / Pexels
security

Настройка Yubikey + WSL2 + SSH

Как подключить физический YubiKey к WSL2, чтобы использовать его для SSH без паролей и SMS. Разберёмся с проблемами прокидывания USB в WSL и сделаем автоматический скрипт, который решит баги с повторным подключением ключа.

Фото: Bia Sousa / Pexels
devops

Туалетная бумага по cron’у

Каждый месяц я забывал заказать туалетную бумагу, пока не написал Bash-скрипт, который делает это за меня. В этом посте расскажу, как с реверсом API и cron’ом автоматизировал рутину.

Фото: Vie Studio / Pexels
games

Легендарная Star Trek 1971 года на Bash

Вот что бывает, когда классика встречается с современным Bash! Bash Trek — это пошаговая стратегия из 70-х, ожившая в терминале. Готовься к тактическим баталиям и ностальгии.

Фото: Mikhail Nilov / Pexels
bash

Читаем файл построчно в Bash

Забудь про бесконечные циклы для чтения файлов в Bash! Показываю, как работать с mapfile, зачем нужен строгий режим и как избежать типичных ошибок в скриптах.

Фото: SHVETS production / Pexels
services

Визуальный сервис для разбора Bash/Shell команд

Рассмотрим сервис в виде веб-сервиса, который помогает понять, что делает та или иная shell-команда в Unix/Linux. Проще говоря, ты вставляешь команду, а оно разбирает её и объясняет фрагмент за фрагментом, что означает каждая …

Фото: Daniil Kondrashin / Pexels
networks

Telnet для сетевых инженеров. Автоматизация и обход логина

Если тебе надо быстро подключиться к сетевому устройству и выполнять команды — этот пост для тебя. Поделюсь рабочими скриптами для Telnet с и без логина, а также лайфхаками по парсингу ответов.

Фото: Field Engineer / Pexels
linux

CRON в первый рабочий день месяца

Сегодня будет обучать cron понимать рабочие и выходные дни. Из коробки этот функционал не работает, да и systemd тут не особо поможет. Так что, придется изобретать очередную кишку.

Фото: Edge Training / Pexels
soft

Выводим красивые нотификации средствами Bash

Давно хотел реализовать функцию на Bash, чтобы красиво выводить какие-то значимые уведомления в терминал по типу как это сделано в npm. Обычное echo уже не возбуждает, ничего не поделаешь. Да и всякие Gum тоже ставить не хочется.

Фото: cottonbro studio / Pexels
bash

Подводные камни в Bash №9

Команда if [ bar = "$foo" ]; проверяет, равны ли два значения. Тут самое важно это — пробелы, про кавычки повторять не буду, ты это уже и так знаешь. Все уши прожужал.

Фото: Chris F / Pexels
bash

Подводные камни в Bash №8

В Bash конструкция [ ... ] — не часть синтаксиса if, а отдельная команда, аналогичная test. Разбираем, как на самом деле выполняются условия и почему это важно для скриптов.

Фото: Markus Spiske / Pexels
bash

Подводные камни в Bash №7

Он считает, сколько строк в файле bar.txt содержат слово foo. Здесь главная проблема — переменная count не изменится вне цикла while, потому что в Bash каждая команда в пайплайне (|) запускается в отдельной оболочке (subshell). То …

Фото: Sergei Starostin / Pexels
bash

Подводные камни в Bash №6

Конструкция [[ ... ]] в Bash предназначена для проверки условий, но не для арифметики. Разбираем ошибочное сравнение и правильное применение (( ... )) для чисел.

Фото: Markus Spiske / Pexels
bash

Подводные камни в Bash №5

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

Фото: Chia-Ho Lin / Pexels
bash

Подводные камни в Bash №3

Когда в Bash сравниваешь две переменные, важно не про***ться с кавычками. Разбираем, что произойдёт, если переменная $foo окажется пустой.

Фото: Connor Scott McManus / Pexels
bash

Подводные камни в Bash №2

Продолжаем погружаться в Бэд-Практики! В прошлом посте мы рассмотрели файлы, которые начинаются с дефиса и то, что команда cp их может воспринимать как флаг. Ну дак вот. Предыдущие посты про Бэд-Практики ищи по тегу pitfalls Как …

Фото: Vie Studio / Pexels
bash

Подводные камни в Bash №1

Вот всё трём мы с тобой за бест-практики, но практически ничего не разбираем по бэд-практикам. Давай это исправлять в контексте Bash скриптов.

Фото: Yanming Guo / Pexels