uz
Feedback
BashTex | Linux

BashTex | Linux

Kanalga Telegram’da o‘tish

Авторский канал для тех, кто хочет глубже погрузиться в мир Linux. Подойдет для разработчиков, системных администраторов и DevOps Реклама: @dad_admin

Ko'proq ko'rsatish
2 526
Obunachilar
Ma'lumot yo'q24 soatlar
-67 kunlar
+230 kunlar
Postlar arxiv
📘 На Stepik вышел курс - "Профессия DevOps-инженер" Хотите войти в DevOps или перейти на новый уровень? Этот курс — то, что
📘 На Stepik вышел курс - "Профессия DevOps-инженер" Хотите войти в DevOps или перейти на новый уровень? Этот курс — то, что нужно, чтобы освоить профессию с нуля. • Полный путь от основ до продакшна: Linux, Bash, Git, Docker, Kubernetes, Ansible, Terraform, CI/CD, Prometheus + Grafana • Практика на реальных кейсах: настраиваем серверы, пишем пайплайны, разворачиваем контейнеры, автоматизируем инфраструктуру • Интерактивные задания с автопроверкой — учитесь в браузере, в удобное время • Итоговый pet-project: рабочая инфраструктура, развёрнутая и автоматизированная вашими руками • В стоимость включено: поддержка на протяжении курса, разбор задач и вопросов, рецензирование итогового проекта, помощь в составлении резюме. 🎓 Сертификат по завершении — добавьте в резюме или LinkedIn 🚀 Скидка 45%, действует 48 часов 👉 Забрать курс со скидкой

Проверка: существует ли файл, каталог или ссылка В bash не нужно городить ls | grep. Для проверок есть встроенные тесты, более быстрые и надежные. ▪️ Обычный файл - -f

[ -f file.txt ] && echo "Файл существует"
Истина, если: файл есть и это не каталог ▪️ Каталог - -d

[ -d /etc/nginx ] && echo "Каталог существует"
Полезно перед: копированием, cd или очисткой директорий ▪️ Символическая ссылка - -L

[ -L /usr/bin/python ] && echo "Это symlink"
Работает даже если ссылка битая. ▪️ Просто что-то существует - -e

[ -e path ] || echo "Ничего нет"
Файл, каталог, ссылка - все подряд. ▪️ Шпаргалка
-f обычный файл -d каталог -L symlink -e существует
BashTex 📱 #bash #utils

Ограничение времени выполнения команды Иногда команда зависает навсегда: сетевой запрос, бэкап, скрипт. timeout - это простой способ не дать ей убить автоматизацию. ▪️ Базовое использование

timeout 5s command
Если команда не завершилась за 5 секунд, то она будет остановлена. Поддерживаемые единицы: 5s 2m 1h ▪️ В скриптах и cron. Пример с curl:

timeout 10s curl https://bashtex.com
В cron это особенно важно т.к зависшая задача может копиться часами. ▪️ Проверка результата

timeout 5s long_task
case $? in
  0) echo "OK" ;;
  124) echo "Timeout" ;;
  *) echo "Ошибка" ;;
esac
Код 124 означает, что команда была прервана по таймауту. ▪️ Жесткое завершение По умолчанию timeout шлёт SIGTERM. Если процесс игнорирует его:

timeout -k 2s 10s command
10s - мягкое завершение +2s - принудительный SIGKILL BashTex 📱 #bash #utils

Ты не выйдешь BashTex 📱 #юмор
Ты не выйдешь BashTex 📱 #юмор

Проверка, какие команды доступны через sudo Перед тем как что-то ломать или усиливать безопасность, полезно понять: что именно пользователь может запускать через sudo. ▪️ Базовая проверка

sudo -l
Показывает: от какого пользователя можно выполнять команды какие команды разрешены есть ли NOPASSWD Минус: в выводе много мусора. ▪️ Убираем лишнее. Только команды:

sudo -l | sed -n '/may run the following commands/,/^$/p'
Или короче:

sudo -l | grep -E '^\s*\('
▪️ Быстро найти опасные права Команды с NOPASSWD

sudo -l | grep NOPASSWD
Полный доступ (ALL)

sudo -l | grep '(ALL)'
Запуск shell’ов

sudo -l | grep -E 'bash|sh|zsh'
▪️ Проверка другого пользователя (root)

sudo -l -U username
BashTex 📱 #bash

Автоматическая ротация кастомных логов без logrotate Не все логи живут в /var/log. Самописные сервисы часто пишут сюда:

/opt/app/logs/
/srv/project/log/
/data/custom/*.log
Реализуем для них контролируемую ротацию на bash. 💚 Задача архивировать логи старше N дней; удалять архивы старше M дней; не ломать активный файл; не удалять то, что еще пишется. 1️⃣ Поиск логов старше N дней

LOG_DIR="/opt/app/logs"
DAYS=7

find "$LOG_DIR" -type f -name "*.log" -mtime +$DAYS
-mtime +7 - старше 7 дней. ⚠️ mtime - это время последнего изменения. 2️⃣ Архивирование с датой. Добавим gzip и текущую дату:

ARCHIVE_DIR="/opt/app/archive"
mkdir -p "$ARCHIVE_DIR"

find "$LOG_DIR" -type f -name "*.log" -mtime +7 -print0 |
while IFS= read -r -d '' file; do
    base=$(basename "$file")
    gzip -c "$file" > "$ARCHIVE_DIR/${base}_$(date +%F).gz" && rm -f "$file"
done
Здесь важно: -print0 + read -d '' - безопасно для пробелов gzip -c - сначала создаем архив && rm - удаляем только если архив создан Никаких rm до успешного gzip. 3️⃣ Защита от удаления активного лога. Если сервис продолжает писать в файл, удалять его напрямую нельзя. Проверка через lsof:

if lsof "$file" >/dev/null 2>&1; then
    echo "Файл используется, пропускаем: $file"
    continue
fi
Альтернатива: ротировать только логи, которые не менялись X часов:

-mmin +1440
4️⃣ Удаление старых архивов. Храним архивы 30 дней:

find "$ARCHIVE_DIR" -type f -name "*.gz" -mtime +30 -delete
Лучше сначала проверить:

find "$ARCHIVE_DIR" -type f -mtime +30 -print
Только потом добавлять -delete. 5️⃣ Безопасный вариант с flock (чтобы не запустить дважды)

(
flock -n 200 || exit 1

# код ротации здесь

) 200>/var/lock/custom-log-rotate.lock
Теперь крон не создаст гонку. ▪️ Пример запуска через cron

0 3 * * * /usr/local/bin/custom_rotate.sh
BashTex 📱 #bash #utils

На Stepik добавили курс «Linux с нуля» Этот курс закрывает всю обязательную Linux-базу для работы в IT. Подойдёт для: - разра
+4
На Stepik добавили курс «Linux с нуля» Этот курс закрывает всю обязательную Linux-базу для работы в IT. Подойдёт для:
- разработчиков - девопсов и админов - специалистов по данным и ML - специалистов поддержки и сопровождения - тестировщиков и безопасников
Внутри 20+ модулей: от установки Linux и работы с файлами до сетей, прав, дисков, процессов, автоматизации на Bash и многого другого. Всё сразу закрепляется на практике (200+ заданий с автопроверкой) Материал подаётся понятным языком, шаг за шагом, на реальных примерах и с наглядными схемами После прохождения вы получите сертификат, который можно добавить в резюме. В ближайшие 48ч курс доступен со скидкой 30% по промокоду «NETWORK30»: открыть курс на Stepik

Перестань оправдываться BashTex 📱 #юмор
Перестань оправдываться BashTex 📱 #юмор

Массовая проверка доступности серверов ▪️ Базовый пример. Есть файл со списком хостов: servers.txt Проверяем доступность всех сразу:

while read -r host; do
  (
    ping -c1 -W1 "$host" &>/dev/null \
      && echo "[OK]   $host" \
      || echo "[FAIL] $host"
  ) &
done < servers.txt

wait
Все ping идут параллельно, вывод появляется почти мгновенно. ▪️ Ограничение параллелизма. Чтобы не зафлудить сеть:

MAX=10
i=0

while read -r host; do
  (
    ping -c1 -W1 "$host" &>/dev/null \
      && echo "[OK]   $host" \
      || echo "[FAIL] $host"
  ) &
  ((i++))
  ((i % MAX == 0)) && wait
done < servers.txt

wait
▪️ Только упавшие хосты

ping -c1 -W1 "$host" &>/dev/null || echo "$host DOWN"
Будет полезно тем, у кого нет мониторинга, но есть 2 и более сервера. BashTex 📱 #bash #utils

Автоматический сбор логов одного сервиса в архив Бывает такое, что нужно быстро собрать логи сервиса и отправить в тикет, например. Делать это вручную - долго и неудобно. Решается одним bash-скриптом. ▪️ Базовый вариант. Собираем логи systemd-сервиса и сразу архивируем:

SERVICE=nginx
OUT="/tmp/${SERVICE}-logs-$(date +%F_%H-%M).tar.gz"

journalctl -u "$SERVICE" --no-pager > /tmp/${SERVICE}.log
tar -czf "$OUT" -C /tmp "${SERVICE}.log"
rm /tmp/${SERVICE}.log
Результат: один .tar.gz с логами сервиса за все время. ▪️ Ограничение по времени. Чаще нужны не все логи, а, например, последние сутки:

journalctl -u nginx --since "24 hours ago" --no-pager > nginx.log
tar -czf nginx-logs.tar.gz nginx.log
Можно и точнее:

--since "2026-01-20 10:00" --until "2026-01-20 12:00"
▪️ Полезные флаги -o short-iso - удобный формат времени -p err - только ошибки --boot - текущая загрузка Пример:

journalctl -u nginx -p err --since today -o short-iso
BashTex 📱 #bash

Разница между "$@" и "$*", и почему это ломает скрипты Оба варианта выглядят почти одинаково, но ведут себя принципиально по-разному, особенно если в аргументах есть пробелы. Предположим, скрипт запущен так:

./script.sh "file one.txt" "file two.txt"
▪️ "$@" - правильный вариант

for arg in "$@"; do
  echo "[$arg]"
done
Вывод:

[file one.txt]
[file two.txt]
Каждый аргумент сохраняется как отдельная сущность. Это то, чего вы ожидаете в 99% скриптов. ▪️ "$*" - частая ловушка

for arg in "$*"; do
  echo "[$arg]"
done
Вывод:

[file one.txt file two.txt]
Все аргументы склеены в одну строку через IFS (по умолчанию пробел). ▪️ Почему это ломает скрипты Передача аргументов дальше:

rm "$*"
rm получает один путь, которого не существует. Обработка файлов:

cp "$*" /backup
копирование падает или ведет себя странно. Работа с пробелами: один аргумент = несколько файлов (по мнению bash). BashTex 📱 #bash #utils

Прекрасное чувство, прям камень с души BashTex 📱 #юмор

📘 На Stepik вышел курс — «основы DevOps» Хотите автоматизировать деплой, управлять инфраструктурой как кодом и выстраивать н
📘 На Stepik вышел курс — «основы DevOps» Хотите автоматизировать деплой, управлять инфраструктурой как кодом и выстраивать надёжные CI/CD процессы? Этот курс — полный путь DevOps-инженера. • CI/CD: Jenkins, GitLab CI/CD, GitHub Actions, стратегии развёртывания (Blue-Green, Canary), rollback • Контейнеризация: Docker, Podman, оптимизация и безопасность контейнеров • Kubernetes: архитектура, Pods, Services, Deployments, Helm, RBAC, Service Mesh (Istio/Linkerd) • Infrastructure as Code: Terraform, Ansible (playbooks, vault), Packer, ArgoCD и Flux для GitOps • Облака: AWS (EC2, EKS, Lambda), GCP, Azure, Yandex Cloud, cost optimization• Мониторинг: Prometheus, Grafana, ELK Stack, Jaeger, OpenTelemetry, SLI/SLO/SLA 🎓 Сертификат — добавьте в резюме или LinkedIn 🚀 Скидка 25%, действует 48 часов 👉 Пройти курс на Stepik

Поиск пользователей без пароля и с заблокированным shell Со временем в системе накапливаются сервисные, забытые или некорректные аккаунты. Часть из них может быть: без пароля, с истекшим паролем или с заблокированным shell. Быстрый аудит можно сделать обычным bash. ▪️ Пользователи без пароля. Пароль хранится в /etc/shadow, но факт его отсутствия легко проверить:

sudo awk -F: '($2==""){print $1}' /etc/shadow
Если вывод не пустой - это повод проверить, зачем аккаунт существует. ▪️ Пользователи с заблокированным паролем

sudo awk -F: '($2 ~ /^!|^\*/){print $1}' /etc/shadow
! или * в поле пароля значит, что вход запрещен Обычно это нормально для сервисных аккаунтов. ▪️ Пользователи с отключенным shell

awk -F: '($7 ~ /(nologin|false)$/){print $1, $7}' /etc/passwd
Типично для: www-data nginx backup Если обычный пользователь с таким shell - стоит проверить. ▪️ Проверка статуса пароля через chage

sudo chage -l username
Полезно для поиска: истекших паролей; аккаунтов без политики смены. ▪️ Массово:

for u in $(cut -d: -f1 /etc/passwd); do
  chage -l "$u" 2>/dev/null | grep -q "never" && echo "$u"
done
▪️ Быстрый отчет:

awk -F: '{print $1 ":" $7}' /etc/passwd
BashTex 📱 #bash #utils

Чтение файлов построчно без потери спецсимволов Чтение файла строка за строкой в bash кажется простым… пока не начинают теряться символы. ▪️ Классическая ошибка

while read line; do
  echo "$line"
done < file.txt
Проблемы: \ - пропадает начальные/конечные пробелы обрезаются строки с \n, \t, \\ читаются некорректно Для конфигов, путей и логов это критично. ▪️ Правильный способ

while IFS= read -r line; do
  echo "$line"
done < file.txt
Это канонический вариант чтения строк. ▪️ Что здесь происходит IFS= отключает разделение по пробелам и табам; сохраняет все пробелы в начале и конце строки. read -r запрещает интерпретацию \ как escape; строка читается как есть. ▪️ Пример проблемы Файл:

  path=C:\Program Files\App\
Без -r:

path=C:Program FilesApp
С IFS= read -r:

  path=C:\Program Files\App\
▪️ Чтение с обработкой строк

while IFS= read -r line; do
  [[ "$line" =~ ^#|^$ ]] && continue
  echo "Обработка: $line"
done < config.conf
▪️ Альтернатива: mapfile

mapfile -t lines < file.txt
Но есть один минус - mapfile загружает весь файл в память BashTex 📱 #bash #utils

Зато ты можешь разбудить меня в любое время и я моментально выйду из Vim 😎 BashTex 📱 #юмор
Зато ты можешь разбудить меня в любое время и я моментально выйду из Vim 😎 BashTex 📱 #юмор

Безопасная работа с rm rm - одна из самых опасных команд в linux ввиду отсутствия корзины. Ошибся путем, переменной или шаблоном и данные ушли навсегда. Но есть простые приемы, которые делают работу с удалением безопасной. ▪️ Простой способ - ls

ls -ld /path/to/delete/*
Если вывод выглядит корректно только потом:

rm -rf /path/to/delete/*
▪️Проверка через echo. Отлично работает со сложными шаблонами:

echo rm -rf /data/tmp/*
Пока есть echo - ничего не удалится. ▪️ Проверка через find

find /logs -type f -mtime +7 -print
Проверили список -> заменили -print на -delete:

find /logs -type f -mtime +7 -delete
▪️ Подтверждение перед удалением. Встроенный интерактивный режим

rm -ri /important/data
-i - спрашивает подтверждение -r - рекурсивно ▪️ Свой безопасный wrapper

safe_rm() {
  echo "Будут удалены:"
  ls -ld "$@"
  read -p "Продолжить? [y/N] " ans
  [[ "$ans" == "y" ]] && rm -rf "$@"
}
Использование:

safe_rm /path/to/delete
▪️ Проверка на пустые переменные (обязательно!) Опасно:

rm -rf "$DIR"
Безопасно:

[[ -n "$DIR" ]] && rm -rf "$DIR"
BashTex 📱 #bash #utils

Работа с датами и временем Дата и время в bash нужны постоянно: бэкапы, логи, ротация, отчеты, cron и т.д. Хорошая новость - date умеет почти все, если знать приемы. ▪️ Форматированный вывод даты:

date +"%Y-%m-%d %H:%M:%S"
▪️ Типовые форматы: %Y - год %m - месяц %d - день %H:%M:%S - время %s - Unix timestamp

now=$(date +"%F_%H-%M-%S")
▪️ Вчера / завтра

date -d "yesterday"
date -d "tomorrow"
С форматированием:

date -d "yesterday" +"%Y-%m-%d"
▪️ Смещение на N дней

date -d "+3 days"
date -d "-7 days"
Пример для бэкапов:

backup_date=$(date -d "+1 day" +"%F")
▪️ Часы, минуты, секунды

date -d "+2 hours"
date -d "-15 minutes"
date -d "+30 seconds"
Комбинирование:

date -d "+1 day +2 hours"
▪️ Начало и конец дня

date -d "today 00:00"
date -d "today 23:59:59"
Вчерашний день целиком:

date -d "yesterday 00:00"
date -d "yesterday 23:59:59"
▪️ Unix timestamp в человекочитаемо

date -d @1700000000
Обратно:

date +%s
▪️ Имена файлов и каталогов

logfile="app_$(date +%F).log"

mkdir "backup_$(date +%Y%m%d)"
▪️ Проверка возраста файлов (совместно с date)

file_ts=$(stat -c %Y file.txt)
now_ts=$(date +%s)

(( now_ts - file_ts > 86400 )) && echo "Файл старше суток"
BashTex 📱 #bash #utils

Прости, мне очень жаль..Так надо BashTex 📱 #юмор

Поиск файлов, измененных за последние 24 часа Простая задача, которая регулярно спасает время: быстро найти, что именно менялось на системе за сутки - конфиги, логи, скрипты, данные. ▪️ Базовый вариант
find /path -type f -mtime -1
-mtime -1 - файлы, измененные менее суток назад. Работает по времени изменения содержимого (mtime) ▪️ Только конфиги или нужные расширения
find /etc -type f -mtime -1 \( -name "*.conf" -o -name "*.cfg" \)
Удобно после апдейтов или ручных правок. ▪️ С деталями (размер, дата, путь)
find /var/log -type f -mtime -1 -exec ls -lh {} +
Или аккуратнее через stat:
find . -type f -mtime -1 -exec stat --format '%y %s %n' {} +
▪️ Исключаем лишнее
find / -type f -mtime -1 \
  ! -path "/proc/*" \
  ! -path "/sys/*" \
  ! -path "/dev/*"
Актуально для системного аудита. ▪️ За последние N часов (точнее суток)
find /home -type f -mmin -1440
-mmin работает с минутами BashTex 📱 #bash #utils