macOS (Security): Аудит LaunchAgents/Daemons на «подозрительные» пути и неподписанные бинарники
Боль: Пользователь жалуется на фантомные процессы. В ~/Library/LaunchAgents лежит «что-то», что перезапускается после удаления.
Реакция админа: «Снесём руками».
Реакция архитектора: «Сначала найдём источник автозапуска и оценим риски.»
Скрипт (Bash). Ищет .plist с исполняемыми из пользовательских/временных директорий, помеченные quarantine или неподписанные бинарники.
Взгляд архитектора: Постоянство (persistence) — базовая TTP вредоносов. Мы валидируем автозапуски против критериев доверия пути/подписи/карантина, а не «по чувствам».
#macos #security #incident_response #forensics #bash #скрипты
Боль: Пользователь жалуется на фантомные процессы. В ~/Library/LaunchAgents лежит «что-то», что перезапускается после удаления.
Реакция админа: «Снесём руками».
Реакция архитектора: «Сначала найдём источник автозапуска и оценим риски.»
Скрипт (Bash). Ищет .plist с исполняемыми из пользовательских/временных директорий, помеченные quarantine или неподписанные бинарники.
#!/usr/bin/env bash
# --- macOS LaunchAgents/Daemons Audit ---
set -euo pipefail
echo "--- Начинаю аудит LaunchAgents/Daemons ---"
dirs=( "$HOME/Library/LaunchAgents" "/Library/LaunchAgents" "/Library/LaunchDaemons" )
for d in "${dirs[@]}"; do
[ -d "$d" ] || continue
while IFS= read -r -d '' plist; do
program=$(/usr/libexec/PlistBuddy -c 'Print :Program' "$plist" 2>/dev/null || true)
if [ -z "${program:-}" ]; then
program=$(/usr/libexec/PlistBuddy -c 'Print :ProgramArguments:0' "$plist" 2>/dev/null || true)
fi
suspicious=""
unsigned=""
quarantine=""
if [ -n "${program:-}" ]; then
dir=$(dirname "$program")
# Подозрительные пути: пользовательские/временные директории
if [[ "$program" =~ ^/Users/ ]] || [[ "$program" =~ ^/tmp/ ]] || [[ "$program" =~ ^/private/tmp/ ]]; then
if [ -w "$dir" ]; then suspicious="user-writable"; fi
fi
# quarantine-атрибут
if [ -f "$program" ] && xattr -p com.apple.quarantine "$program" >/dev/null 2>&1; then
quarantine="quarantined"
fi
# неподписанность
if [ -f "$program" ]; then
if ! codesign -dv "$program" >/dev/null 2>&1; then unsigned="unsigned"; fi
fi
fi
if [ -n "$suspicious$quarantine$unsigned" ]; then
echo "plist: $plist"
echo " Program: ${program:-<none>}"
echo " Flags: $suspicious $quarantine $unsigned"
echo "----------------------------------------"
fi
done < <(find "$d" -name '*.plist' -print0 2>/dev/null)
done
echo "--- Аудит завершен ---"
echo "Рекомендация: бэкапнуть plist и бинарь, затем удалить через launchctl (disable/unload), проверить персистентность."
Взгляд архитектора: Постоянство (persistence) — базовая TTP вредоносов. Мы валидируем автозапуски против критериев доверия пути/подписи/карантина, а не «по чувствам».
#macos #security #incident_response #forensics #bash #скрипты
🔥3
☣️ Security (Full-Stack): "Я скачал файл. Он 'чистый'?"
Боль: Вам прислали driver_update.zip или вы скачали .iso с "зеркала". Как убедиться, что это оригинальный файл, а не malware, подсунутый хакером?
Реакция админа: "Проверю антивирусом". (Бесполезно, если это 0-day).
Реакция архитектора: "Я сверю хэш-сумму".
Хэш (SHA-256) — это "цифровой отпечаток" файла. Если хоть 1 бит в файле изменен, хэш будет совершенно другим.
Как проверить:
В Linux (или git-bash):
Bash
В Windows (PowerShell):
PowerShell
Результат (на обеих ОС): E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855
Сравните эту строку с той, что обязательно должна быть на сайте разработчика.
Взгляд архитектора: Это "Гигиена 0-го уровня" (Supply Chain Security 101). Вы никогда не доверяете бинарникам из интернета. Вы верифицируете их.
#security #windows #linux #powershell #bash #sysadmin #чеклисты
Боль: Вам прислали driver_update.zip или вы скачали .iso с "зеркала". Как убедиться, что это оригинальный файл, а не malware, подсунутый хакером?
Реакция админа: "Проверю антивирусом". (Бесполезно, если это 0-day).
Реакция архитектора: "Я сверю хэш-сумму".
Хэш (SHA-256) — это "цифровой отпечаток" файла. Если хоть 1 бит в файле изменен, хэш будет совершенно другим.
Как проверить:
В Linux (или git-bash):
Bash
sha256sum driver_update.zip
В Windows (PowerShell):
PowerShell
Get-FileHash driver_update.zip -Algorithm SHA256
Результат (на обеих ОС): E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855
Сравните эту строку с той, что обязательно должна быть на сайте разработчика.
Взгляд архитектора: Это "Гигиена 0-го уровня" (Supply Chain Security 101). Вы никогда не доверяете бинарникам из интернета. Вы верифицируете их.
#security #windows #linux #powershell #bash #sysadmin #чеклисты
🔬 Linux: Скрипт "Аудит открытых портов" (Сравнение с "Эталоном")
Боль: Вы думаете, что на вашем веб-сервере открыты только порты 22, 80, 443. Но разработчик "для теста" запустил python -m http.server 8000 на 0.0.0.0 и забыл.
Реакция админа: "Я проверю ss -tuln вручную, когда будет инцидент".
Реакция архитектора: "У меня есть cron-скрипт, который автоматически сверяет 'что есть' с 'что должно быть'".
Этот Bash-скрипт — ваш аудитор безопасности.
Код скрипта:
Взгляд архитектора: Это "Compliance as Code". Вы не "проверяете", вы валидируете вашу политику безопасности. Этот скрипт — основа для автоматического алерта в Zabbix или Prometheus (Alertmanager).
#linux #bash #security #networking #audit #скрипты #sre
Боль: Вы думаете, что на вашем веб-сервере открыты только порты 22, 80, 443. Но разработчик "для теста" запустил python -m http.server 8000 на 0.0.0.0 и забыл.
Реакция админа: "Я проверю ss -tuln вручную, когда будет инцидент".
Реакция архитектора: "У меня есть cron-скрипт, который автоматически сверяет 'что есть' с 'что должно быть'".
Этот Bash-скрипт — ваш аудитор безопасности.
Код скрипта:
#!/bin/bash
# --- Скрипт аудита "лишних" TCP-портов ---
# 1. ЭТАЛОН: Порты, которые ДОЛЖНЫ быть открыты (на 0.0.0.0)
# (Используйте 'ssh' или номер '22')
ALLOWED_PORTS=(
"ssh"
"http"
"httpsA"
)
# 2. ФАКТ: Получаем все, что слушает на 0.0.0.0 (IPv4)
# `ss -tuln`: TCP, UDP, Listening, Numeric
# `awk ...`: Вытаскиваем только номер порта
CURRENT_PORTS=$(ss -tuln | grep 'LISTEN.*0.0.0.0:' | awk '{print $5}' | sed 's/.*://' | sort -u)
# 3. СРАВНЕНИЕ:
# `comm -13`: Показывает строки, которые есть только во втором файле (CURRENT_PORTS)
# (т.е. "лишние" порты)
UNAUTHORIZED_PORTS=$(comm -13 <(printf "%s\n" "${ALLOWED_PORTS[@]}" | sort -u) <(echo "$CURRENT_PORTS"))
if [ -n "$UNAUTHORIZED_PORTS" ]; then
echo "[!!!] ОБНАРУЖЕНЫ НЕСАНКЦИОНИРОВАННЫЕ ОТКРЫТЫЕ ПОРТЫ:"
echo "$UNAUTHORIZED_PORTS"
exit 1
else
echo "[OK] Все порты соответствуют эталону."
exit 0
fi
Взгляд архитектора: Это "Compliance as Code". Вы не "проверяете", вы валидируете вашу политику безопасности. Этот скрипт — основа для автоматического алерта в Zabbix или Prometheus (Alertmanager).
#linux #bash #security #networking #audit #скрипты #sre
🔬 Linux: Скрипт "Аудит dmesg". Ищем аппаратные ошибки
Боль: Сервер "тормозит", но htop и iotop — "зеленые". Приложение "вылетает" с Segfault.
Причина: Вы не видите аппаратных проблем. Отказ диска, "битая" RAM, проблемы с CPU — всё это логируется ядром в dmesg.
Реакция админа: "Проблемы с софтом, буду чинить приложение".
Реакция SRE: "Сначала проверю dmesg".
Этот Bash-скрипт — ваш "аппаратный аудитор". Он парсит dmesg и ищет "красные флаги".
Код скрипта:
Взгляд архитектора: Это проактивный мониторинг "железа". Вы не ждете, пока smartd (диск) или EDAC (RAM) "покраснеют". Вы валидируете здоровье сервера на уровне ядра.
#linux #sre #diagnostics #bash #dmesg #скрипты #sysadmin
Боль: Сервер "тормозит", но htop и iotop — "зеленые". Приложение "вылетает" с Segfault.
Причина: Вы не видите аппаратных проблем. Отказ диска, "битая" RAM, проблемы с CPU — всё это логируется ядром в dmesg.
Реакция админа: "Проблемы с софтом, буду чинить приложение".
Реакция SRE: "Сначала проверю dmesg".
Этот Bash-скрипт — ваш "аппаратный аудитор". Он парсит dmesg и ищет "красные флаги".
Код скрипта:
#!/bin/bash
# --- Скрипт-аудитор 'dmesg' на ошибки ---
echo "--- Ищу 'красные флаги' в логах ядра (dmesg)... ---"
# -T: (Timestamps) Показать человеческое время
# --level=err,warn: Показать ТОЛЬКО ошибки и предупреждения
# (segfault, EDAC, I/O error, memory error...)
CRITICAL_ERRORS=$(dmesg -T --level=err,warn)
if [ -n "$CRITICAL_ERRORS" ]; then
echo "[!!!] ОБНАРУЖЕНЫ КРИТИЧЕСКИЕ СОБЫТИЯ ЯДРА:"
echo "$CRITICAL_ERRORS" | tail -n 20
echo "--- Рекомендация: Немедленно проверьте I/O, EDAC (RAM) и CPU. ---"
else
echo "[OK] Критических ошибок в dmesg не найдено."
fi
Взгляд архитектора: Это проактивный мониторинг "железа". Вы не ждете, пока smartd (диск) или EDAC (RAM) "покраснеют". Вы валидируете здоровье сервера на уровне ядра.
#linux #sre #diagnostics #bash #dmesg #скрипты #sysadmin
🔒 Linux: Скрипт-аудит "неизменяемых" (immutable) файлов
Боль: Команда chattr +i (immutable) — это и "оружие", и "щит".
Хакеры используют ее, чтобы "зацементировать" свой rootkit (его не может удалить даже root).
Админы используют ее, чтобы защитить /etc/hosts или sshd_config от случайных изменений.
Проблема: Как найти все "неизменяемые" файлы в системе?
Реакция админа: "Надеюсь, их нет".
Реакция архитектора: "Я запущу аудит".
Этот Bash-скрипт использует lsattr для рекурсивного сканирования системы.
Код скрипта:
Взгляд архитектора: Это — аудит целостности (Integrity Audit). Вы должны знать о каждом файле, который "заморожен". Если вы видите ----i- на /tmp/x.sh — у вас огромные проблемы. Если на sshd_config — это ваша (или чужая) работа.
#linux #bash #security #audit #forensics #скрипты #гайд
Боль: Команда chattr +i (immutable) — это и "оружие", и "щит".
Хакеры используют ее, чтобы "зацементировать" свой rootkit (его не может удалить даже root).
Админы используют ее, чтобы защитить /etc/hosts или sshd_config от случайных изменений.
Проблема: Как найти все "неизменяемые" файлы в системе?
Реакция админа: "Надеюсь, их нет".
Реакция архитектора: "Я запущу аудит".
Этот Bash-скрипт использует lsattr для рекурсивного сканирования системы.
Код скрипта:
#!/bin/bash
# --- Поиск 'immutable' файлов (атрибут 'i') ---
echo "--- Начинаю поиск 'неизменяемых' файлов (chattr +i)... ---"
echo "Это может занять много времени."
# -R: Рекурсивно
# /: Начиная с корня
# 2>/dev/null: Игнорируем ошибки (типа 'Permission denied' для /proc)
# grep '----i-': Ищем ТОЛЬКО файлы, где установлен 'i' (immutable)
lsattr -R / 2>/dev/null | grep '----i-'
echo "--- Поиск завершен ---"
Взгляд архитектора: Это — аудит целостности (Integrity Audit). Вы должны знать о каждом файле, который "заморожен". Если вы видите ----i- на /tmp/x.sh — у вас огромные проблемы. Если на sshd_config — это ваша (или чужая) работа.
#linux #bash #security #audit #forensics #скрипты #гайд
🗑 Bash: Правильная ротация бэкапов
Сделать бэкап легко. Сложно сделать так, чтобы через полгода диск не забился старыми архивами. Многие пишут сложные скрипты на Python, но старый добрый find умеет это делать одной строкой.
Задача:
Оставить бэкапы за последние 7 дней.
Всё, что старше — удалить.
Скрипт (cleanup.sh):
🔥 Pro-Tip: Перед тем как ставить флаг -delete в cron, запустите команду без него (просто с -print), чтобы убедиться, что find нашел именно то, что вы хотите удалить. rm в Linux не прощает ошибок.
#linux #bash #backup #scripting #automation #чеклисты
Сделать бэкап легко. Сложно сделать так, чтобы через полгода диск не забился старыми архивами. Многие пишут сложные скрипты на Python, но старый добрый find умеет это делать одной строкой.
Задача:
Оставить бэкапы за последние 7 дней.
Всё, что старше — удалить.
Скрипт (cleanup.sh):
#!/bin/bash
BACKUP_DIR="/var/backups/db"
DAYS_TO_KEEP=7
# Проверяем, что директория существует (защита от дурака)
if [ -d "$BACKUP_DIR" ]; then
echo "🧹 Очистка старых бэкапов в $BACKUP_DIR..."
# Находим файлы старше N дней и удаляем
# -mtime +$DAYS_TO_KEEP -> старше дней
# -name "*.gz" -> только архивы (чтобы не удалить лишнее!)
# -delete -> удаляет без вопросов
find "$BACKUP_DIR" -type f -name "*.tar.gz" -mtime +$DAYS_TO_KEEP -print -delete
echo "✅ Готово."
else
echo "❌ Ошибка: Директория $BACKUP_DIR не найдена."
exit 1
fi
🔥 Pro-Tip: Перед тем как ставить флаг -delete в cron, запустите команду без него (просто с -print), чтобы убедиться, что find нашел именно то, что вы хотите удалить. rm в Linux не прощает ошибок.
#linux #bash #backup #scripting #automation #чеклисты
👍2
💣 Bash: Защита от «Ой, я запустил это на Проде»
У вас есть скрипт cleanup.sh или reset-db.sh. Однажды вы, уставший, случайно запустите его не на тестовом сервере, а на srv-prod-01.
Добавьте этот Safety Check в начало любого опасного скрипта. Он спасет вам карьеру.
Этот простой if заставляет мозг проснуться перед тем, как нажать Enter.
#bash #scripting #safety #production #failsafe #devops
У вас есть скрипт cleanup.sh или reset-db.sh. Однажды вы, уставший, случайно запустите его не на тестовом сервере, а на srv-prod-01.
Добавьте этот Safety Check в начало любого опасного скрипта. Он спасет вам карьеру.
#!/bin/bash
# 1. Получаем имя хоста
CURRENT_HOST=$(hostname)
# 2. Проверяем, есть ли "prod" в имени
if [[ "$CURRENT_HOST" == *"prod"* ]]; then
echo "⚠️ ВНИМАНИЕ! Вы запускаете опасный скрипт на ПРОДАКШЕНЕ ($CURRENT_HOST)!"
echo "Введите 'YES', чтобы продолжить, или что угодно для отмены:"
read -r CONFIRM
if [ "$CONFIRM" != "YES" ]; then
echo "❌ Отмена операции."
exit 1
fi
fi
echo "🚀 Поехали..."
# Дальше идет ваша логика
Этот простой if заставляет мозг проснуться перед тем, как нажать Enter.
#bash #scripting #safety #production #failsafe #devops
🐧 Linux: Правильная очистка логов (без перезагрузки)
Многие новички удаляют раздутый лог командой
Результат: Место на диске не освобождается.
Причина: Процесс (Nginx) продолжает писать в удаленный дескриптор файла. Помогает только рестарт сервиса.
Решение Архитектора (truncate): Обнуляем содержимое файла, сохраняя сам файл и его дескриптор. Сервис продолжает писать в него с нуля, рестарт не нужен.
Команда:
Скрипт для Cron (обнулять все логи старше 7 дней, если logrotate не настроен):
#linux #logs #truncate #maintenance #bash
Многие новички удаляют раздутый лог командой
rm /var/log/nginx/access.log .Результат: Место на диске не освобождается.
Причина: Процесс (Nginx) продолжает писать в удаленный дескриптор файла. Помогает только рестарт сервиса.
Решение Архитектора (truncate): Обнуляем содержимое файла, сохраняя сам файл и его дескриптор. Сервис продолжает писать в него с нуля, рестарт не нужен.
Команда:
# Обнулить конкретный файл
truncate -s 0 /var/log/nginx/access.log
# Или через редирект (работает в большинстве шеллов)
> /var/log/nginx/access.log
Скрипт для Cron (обнулять все логи старше 7 дней, если logrotate не настроен):
find /var/log/myapp -name "*.log" -type f -mtime +7 -exec truncate -s 0 {} \;
#linux #logs #truncate #maintenance #bash
🔥2👍1
🕵️♂️ Linux: Читаем логи как Профи (grep -C)
Когда вы грепаете лог по слову
Используйте флаги контекста в
🔹 -B 5 (Before): Показать 5 строк до совпадения.
🔹 -A 5 (After): Показать 5 строк после совпадения.
🔹 -C 5 (Context): Показать 5 строк вокруг.
Команда:
Результат:
Вы сразу видите историю:
"User logged in"
➡️"Executed command"
➡️ 🔥 ERROR.
Причина становится ясна мгновенно.
#linux #grep #logs #troubleshooting #cli #bash #tips
Когда вы грепаете лог по слову
Error , вы видите строку ошибки, но не видите, что привело к ней. Обычно админы открывают vim и листают вручную. Это долго и неудобно.Используйте флаги контекста в
grep . Это киллер-фича!🔹 -B 5 (Before): Показать 5 строк до совпадения.
🔹 -A 5 (After): Показать 5 строк после совпадения.
🔹 -C 5 (Context): Показать 5 строк вокруг.
Команда:
# Найти "Error" и показать 5 строк ДО и ПОСЛЕ
grep -C 5 "Error" /var/log/syslog
Результат:
Вы сразу видите историю:
"User logged in"
➡️"Executed command"
➡️ 🔥 ERROR.
Причина становится ясна мгновенно.
#linux #grep #logs #troubleshooting #cli #bash #tips
🧠 Terminal: Вспоминаем, что делали в прошлом году (Ctrl+R + fzf)
После отпуска сложно вспомнить: "Какой там был длинный ключ у той команды для Docker?".
Обычный поиск в истории (Ctrl+R) неудобен — он показывает только одно совпадение.
Сделайте себе подарок на 2026 год — поставьте fzf (Fuzzy Finder).
Зачем: Он превращает поиск по истории (Ctrl+R) в интерактивный список.
Вы пишете "dock", и видите все команды с этим словом, можете выбрать стрелочками и запустить.
Установка (Linux/macOS):
Использование: Просто нажмите Ctrl+R в терминале.
Ваша продуктивность вырастет в разы.
Вы перестанете набирать одни и те же команды вручную.
#tools #fzf #productivity #terminal #cli #bash #zsh
После отпуска сложно вспомнить: "Какой там был длинный ключ у той команды для Docker?".
Обычный поиск в истории (Ctrl+R) неудобен — он показывает только одно совпадение.
Сделайте себе подарок на 2026 год — поставьте fzf (Fuzzy Finder).
Зачем: Он превращает поиск по истории (Ctrl+R) в интерактивный список.
Вы пишете "dock", и видите все команды с этим словом, можете выбрать стрелочками и запустить.
Установка (Linux/macOS):
git clone --depth 1 https://github.com/junegunn/fzf.git ~/.fzf
~/.fzf/install
Использование: Просто нажмите Ctrl+R в терминале.
Ваша продуктивность вырастет в разы.
Вы перестанете набирать одни и те же команды вручную.
#tools #fzf #productivity #terminal #cli #bash #zsh
GitHub
GitHub - junegunn/fzf: :cherry_blossom: A command-line fuzzy finder
:cherry_blossom: A command-line fuzzy finder. Contribute to junegunn/fzf development by creating an account on GitHub.
🕵️♂️ Linux: Кто ломился в дверь, пока мы спали?
Пока вы доедали оливье, боты продолжали брутфорсить ваши SSH-порты.
Работа у них такая.
Полезно узнать, с каких IP идет основная атака, чтобы забанить подсети целиком, а не по одному.
Обычный
Команда (Магия AWK):
(Для CentOS/RHEL замените файл на /var/log/secure и поле $(NF-3) на $11, так как формат лога чуть другой).
Результат: Вы увидите четкий список: 5421 192.168.x.x 1200 10.0.x.x
Если видите тысячи попыток с одного IP — это не забывчивый коллега. Это ботнет. В бан его! 🚫
#linux #security #logs #awk #bash #hardening #defense
Пока вы доедали оливье, боты продолжали брутфорсить ваши SSH-порты.
Работа у них такая.
Полезно узнать, с каких IP идет основная атака, чтобы забанить подсети целиком, а не по одному.
Обычный
lastb показывает слишком много мусора. Вытащим только "Топ-10" негодяев одной строкой.Команда (Магия AWK):
# Для Debian/Ubuntu
grep "Failed password" /var/log/auth.log | awk '{print $(NF-3)}' | sort | uniq -c | sort -nr | head -10
(Для CentOS/RHEL замените файл на /var/log/secure и поле $(NF-3) на $11, так как формат лога чуть другой).
Результат: Вы увидите четкий список: 5421 192.168.x.x 1200 10.0.x.x
Если видите тысячи попыток с одного IP — это не забывчивый коллега. Это ботнет. В бан его! 🚫
#linux #security #logs #awk #bash #hardening #defense
⌨️ Bash: Магия восклицательного знака (!)
Вы только что набрали длинную команду, но забыли sudo. Или создали папку и хотите сразу в неё зайти. Не нажимайте "Вверх" и не правьте курсором. Используйте History Expansion.
Это экономит тысячи нажатий клавиш в год.
🔹 Забыл sudo?
🔹 Использовать аргумент из прошлой команды?
🔹 Найти последнюю команду, начинающуюся на...
Маленькие трюки для большой скорости. 🏎
#linux #bash #cli #productivity #tips #shortcuts
Вы только что набрали длинную команду, но забыли sudo. Или создали папку и хотите сразу в неё зайти. Не нажимайте "Вверх" и не правьте курсором. Используйте History Expansion.
Это экономит тысячи нажатий клавиш в год.
🔹 Забыл sudo?
apt update
# Error: Permission denied
sudo !!
# Bash сам подставит последнюю команду: sudo apt update
🔹 Использовать аргумент из прошлой команды?
mkdir /var/www/html/project_x
cd !$
# Bash подставит последний аргумент: cd /var/www/html/project_x
🔹 Найти последнюю команду, начинающуюся на...
!vim
# Запустит последнюю команду, которая начиналась с "vim"
Маленькие трюки для большой скорости. 🏎
#linux #bash #cli #productivity #tips #shortcuts
🐧 Sed: Хирург для твоих конфигов
Вам нужно поменять порт в конфиге Nginx на 50 серверах. Заходить на каждый и открывать
Синтаксис:
Примеры из жизни:
1. Заменить слово во всем файле (безопасно):
2. Раскомментировать строку (удалить # в начале):
3. Удалить пустые строки (чистка мусора):
Освойте
#linux #sed #bash #automation #config #cli
Вам нужно поменять порт в конфиге Nginx на 50 серверах. Заходить на каждый и открывать
nano ? Нет. Используйте sed (Stream Editor). Он умеет находить и заменять текст прямо в файлах.Синтаксис:
s/что_искать/на_что_менять/gПримеры из жизни:
1. Заменить слово во всем файле (безопасно):
# Создаст бэкап config.conf.bak перед изменением
sed -i.bak 's/DEBUG=true/DEBUG=false/g' config.conf
2. Раскомментировать строку (удалить # в начале):
sed -i 's/^#PermitRootLogin/PermitRootLogin/' /etc/ssh/sshd_config
3. Удалить пустые строки (чистка мусора):
sed -i '/^$/d' filename.txt
Освойте
sed , и Ansible вам станет понятнее, а скрипты — мощнее.#linux #sed #bash #automation #config #cli
🐚 Bash: Шаблон «Пуленепробиваемого» скрипта
90% админских скриптов падают молча.
Например, cd /wrong/path не сработал, а следующая команда rm -rf * удалила всё в корне (утрирую, но суть ясна). В 2026 году мы используем Bash Strict Mode и Traps.
Код для начала любого скрипта:
Разбор магии:
1. set -e: Скрипт умрет сразу, если любая команда вернет ошибку.
2. set -u: Запрещает использовать пустые переменные (спасает от rm -rf /$UNDEFINED_VAR).
3. set -o pipefail: Ловит ошибки даже в середине конвейера (grep | awk).
4. trap: Гарантированно выполнит функцию cleanup, даже если скрипт упадет с ошибкой.
Это база. Не пишите в прод без этого хедера.
#linux #bash #scripting #devops #bestpractices #automation
90% админских скриптов падают молча.
Например, cd /wrong/path не сработал, а следующая команда rm -rf * удалила всё в корне (утрирую, но суть ясна). В 2026 году мы используем Bash Strict Mode и Traps.
Код для начала любого скрипта:
#!/bin/bash
set -euo pipefail
IFS=$'\n\t'
# Функция очистки при выходе (даже аварийном)
cleanup() {
echo "🧹 Убираем мусор..."
rm -f /tmp/temp_*.txt
}
# Trap ловит сигналы выхода (EXIT, ошибка, Ctrl+C)
trap cleanup EXIT
echo "🚀 Начинаем работу..."
# Ваш код
Разбор магии:
1. set -e: Скрипт умрет сразу, если любая команда вернет ошибку.
2. set -u: Запрещает использовать пустые переменные (спасает от rm -rf /$UNDEFINED_VAR).
3. set -o pipefail: Ловит ошибки даже в середине конвейера (grep | awk).
4. trap: Гарантированно выполнит функцию cleanup, даже если скрипт упадет с ошибкой.
Это база. Не пишите в прод без этого хедера.
#linux #bash #scripting #devops #bestpractices #automation
🧠 Skill: JSON — универсальный клей админа
Раньше мы грепали текст (grep | awk).
В 2026 году, когда вокруг Docker, Kubernetes и REST API, вывод почти всегда можно получить в JSON.
Парсить JSON как текст — это путь к ошибкам.
Учимся работать с объектами, а не строками:
🐧 Linux (jq): Не делайте grep "status", делайте:
(Выведет имена только упавших сервисов).
🪟 PowerShell: Здесь JSON становится родным объектом .NET автоматически:
Совет: Если консольная утилита имеет флаг --json (как kubectl, aws cli, docker), всегда используйте его для скриптов. Это делает вашу автоматизацию неубиваемой при смене форматирования вывода разработчиками.
#skills #json #jq #powershell #bash #devops #api
Раньше мы грепали текст (grep | awk).
В 2026 году, когда вокруг Docker, Kubernetes и REST API, вывод почти всегда можно получить в JSON.
Парсить JSON как текст — это путь к ошибкам.
Учимся работать с объектами, а не строками:
🐧 Linux (jq): Не делайте grep "status", делайте:
curl -s https://api.site.com/health | jq '.services[] | select(.status=="down") | .name'
(Выведет имена только упавших сервисов).
🪟 PowerShell: Здесь JSON становится родным объектом .NET автоматически:
$data = curl https://api.site.com/health | ConvertFrom-Json $data.services | Where-Object { $_.status -eq 'down' } | Select-Object name
Совет: Если консольная утилита имеет флаг --json (как kubectl, aws cli, docker), всегда используйте его для скриптов. Это делает вашу автоматизацию неубиваемой при смене форматирования вывода разработчиками.
#skills #json #jq #powershell #bash #devops #api
👍2🔥2👏1
🐧 Bash: Умная очистка логов без риска убить систему
Частая ошибка админа — удалять логи командой rm. Если сервис продолжает писать в файл, место на диске не освободится (файл останется "призраком"), пока сервис не рестартанут. 👻 Правильный путь — обнуление через перенаправление.
Скрипт-однострочник для безопасной очистки:
Почему это OK:
1. > "{}" — очищает содержимое файла, но оставляет сам файл на месте.
2. Сервис (nginx, mysql) не теряет связь с файлом и продолжает писать в него без рестарта.
3. Система мгновенно видит свободное место. 📦
#linux #bash #sysadmin #automation #storage #server_cleanup 🛠️
Частая ошибка админа — удалять логи командой rm. Если сервис продолжает писать в файл, место на диске не освободится (файл останется "призраком"), пока сервис не рестартанут. 👻 Правильный путь — обнуление через перенаправление.
Скрипт-однострочник для безопасной очистки:
#!/bin/bash
# Находим все логи больше 500Мб в /var/log и обнуляем их содержимое
find /var/log -type f -name "*.log" -size +500M -exec sh -c '> "{}"' \;
echo "✅ Тяжелые логи обнулены, дескрипторы сохранены!"
Почему это OK:
1. > "{}" — очищает содержимое файла, но оставляет сам файл на месте.
2. Сервис (nginx, mysql) не теряет связь с файлом и продолжает писать в него без рестарта.
3. Система мгновенно видит свободное место. 📦
#linux #bash #sysadmin #automation #storage #server_cleanup 🛠️
❤1
🐧 Bash: Параллельный запуск задач без боли и GNU Parallel
Многие админы не знают, что для параллельного выполнения задач в скриптах не обязательно ставить тяжелые утилиты. В Bash есть встроенный механизм управления фоновыми процессами через wait. Это маст-хэв, когда нужно, например, одновременно проверить доступность 50 хостов или сжать 20 папок с логами. 📦
Пример «умного» скрипта:
Почему это OK:
1. Скорость: Скрипт выполняется за время самого долгого пинга, а не по очереди.
2. Простота: Никаких лишних зависимостей.
3. Контроль: Команда wait гарантирует, что скрипт не пойдет дальше, пока все «хвосты» не закроются.
#linux #bash #automation #sysadmin #performance #scripting 🛠️
Многие админы не знают, что для параллельного выполнения задач в скриптах не обязательно ставить тяжелые утилиты. В Bash есть встроенный механизм управления фоновыми процессами через wait. Это маст-хэв, когда нужно, например, одновременно проверить доступность 50 хостов или сжать 20 папок с логами. 📦
Пример «умного» скрипта:
#!/bin/bash
targets=("192.168.1.1" "192.168.1.2" "192.168.1.3") # и так далее
for ip in "${targets[@]}"; do
(
if ping -c 1 -W 1 "$ip" > /dev/null; then
echo "✅ $ip доступен"
else
echo "❌ $ip лежит"
fi
) & # Запуск в фоне
done
wait # Ждем завершения всех фоновых задач
echo "🎯 Все проверки завершены!"
Почему это OK:
1. Скорость: Скрипт выполняется за время самого долгого пинга, а не по очереди.
2. Простота: Никаких лишних зависимостей.
3. Контроль: Команда wait гарантирует, что скрипт не пойдет дальше, пока все «хвосты» не закроются.
#linux #bash #automation #sysadmin #performance #scripting 🛠️
🐧 Bash: Проверка SSL-сертификатов до того, как они «протухнут»
Пятница — идеальный день, чтобы проверить, не отвалится ли какой-нибудь домен в субботу утром. 📉 Вместо того чтобы заходить на сайты руками, напишем скрипт, который массово проверяет даты истечения через openssl.
Полезный скрипт для списка доменов:
Почему это маст-хэв: Этот скрипт можно легко обернуть в телеграм-бота, чтобы получать алерты, если до истечения осталось меньше 10 дней. Безопасность — это когда всё работает тихо. 🤫
#linux #bash #ssl #security #automation #sysadmin #devops 🔐
Пятница — идеальный день, чтобы проверить, не отвалится ли какой-нибудь домен в субботу утром. 📉 Вместо того чтобы заходить на сайты руками, напишем скрипт, который массово проверяет даты истечения через openssl.
Полезный скрипт для списка доменов:
#!/bin/bash
# Список доменов для проверки
DOMAINS=("google.com" "github.com" "my-company.ru")
echo "⏳ Проверка сертификатов..."
for domain in "${DOMAINS[@]}"; do
expiration_date=$(echo | openssl s_client -servername "$domain" -connect "$domain":443 2>/dev/null | openssl x509 -noout -enddate | cut -d= -f2)
# Переводим в формат timestamp для сравнения
exp_epoch=$(date -d "$expiration_date" +%s)
now_epoch=$(date +%s)
days_left=$(( ($exp_epoch - $now_epoch) / 86400 ))
if [ $days_left -lt 7 ]; then
echo "🚨 $domain: ОСТАЛОСЬ ВСЕГО $days_left ДНЕЙ!"
else
echo "✅ $domain: еще $days_left дней"
fi
done
Почему это маст-хэв: Этот скрипт можно легко обернуть в телеграм-бота, чтобы получать алерты, если до истечения осталось меньше 10 дней. Безопасность — это когда всё работает тихо. 🤫
#linux #bash #ssl #security #automation #sysadmin #devops 🔐
🐧 Linux: Как оживить сервер, если /bin/bash случайно удален 😱
Классический кошмар: ты (или скрипт) случайно удалил bash или критическую библиотеку libc.so, и теперь ни одна команда не работает.
SSH-сессия еще жива, но на любое действие система отвечает:
```
command not found
```
Решение: Используй встроенные возможности самого SSH и командной оболочки, которая еще в памяти.
Если у тебя открыта сессия, ты можешь использовать Zsh или Dash (который часто является /bin/sh), чтобы восстановить файлы.
Если же нет ничего, помни: busybox — твой лучший друг.
Хак: Восстановление через копирование по сети без scp: Если на сервере нет ничего, но жив cat:
На своей машине:
На сервере (через вызов загрузчика):
Совет: Всегда держи установленным пакет busybox-static. Он содержит всё необходимое в одном бинарнике и не зависит от внешних библиотек.
#linux #troubleshooting #sysadmin #bash #recovery #server_rescue 🛠️
Классический кошмар: ты (или скрипт) случайно удалил bash или критическую библиотеку libc.so, и теперь ни одна команда не работает.
SSH-сессия еще жива, но на любое действие система отвечает:
```
command not found
```
Решение: Используй встроенные возможности самого SSH и командной оболочки, которая еще в памяти.
Если у тебя открыта сессия, ты можешь использовать Zsh или Dash (который часто является /bin/sh), чтобы восстановить файлы.
Если же нет ничего, помни: busybox — твой лучший друг.
Хак: Восстановление через копирование по сети без scp: Если на сервере нет ничего, но жив cat:
На своей машине:
cat /bin/bash | ssh user@server "cat > /tmp/bash"
На сервере (через вызов загрузчика):
/lib64/ld-linux-x86-64.so.2 /tmp/bash
Совет: Всегда держи установленным пакет busybox-static. Он содержит всё необходимое в одном бинарнике и не зависит от внешних библиотек.
#linux #troubleshooting #sysadmin #bash #recovery #server_rescue 🛠️
👏1
🧠 Skills: Rust coreutils добрались до
Коллеги, навык выходного дня — короткий и полезный.
📌 ФАКТЫ
В Ubuntu 26.04 LTS большинство утилит coreutils уже работает на uutils (переписаны на Rust)
В 26.10 к ним добавились самые «опасные» в скриптах:
Цель Canonical — безопасность памяти. Но любая переписанная утилита может по-другому обрабатывать редкие флаги, сообщения об ошибках и граничные случаи
🛠 ЧЬИ У ВАС УТИЛИТЫ
Bash
🛠 ПРОГОН СКРИПТОВ В КОНТЕЙНЕРЕ
Bash
⚠️ НА ЧТО СМОТРЕТЬ
Парсинг вывода
Проверки по тексту ошибок (
Редкие флаги
💡 В ЧЁМ СУТЬ
#skills #linux #bash #ubuntu #rust #coreutils #sysadmin #admin_future
cp, mv и rm. Как проверить, что ваши скрипты не сломаютсяКоллеги, навык выходного дня — короткий и полезный.
📌 ФАКТЫ
В Ubuntu 26.04 LTS большинство утилит coreutils уже работает на uutils (переписаны на Rust)
В 26.10 к ним добавились самые «опасные» в скриптах:
cp, mv, rmЦель Canonical — безопасность памяти. Но любая переписанная утилита может по-другому обрабатывать редкие флаги, сообщения об ошибках и граничные случаи
🛠 ЧЬИ У ВАС УТИЛИТЫ
Bash
cp --version | head -1 # «uutils coreutils» или «GNU coreutils»
ls -l "$(command -v cp)" # куда ведёт бинарь
🛠 ПРОГОН СКРИПТОВ В КОНТЕЙНЕРЕ
Bash
# Чистая 26.10 рядом, ничего не ломая на сервере
docker run --rm -it -v "$PWD/scripts:/scripts:ro" ubuntu:26.10 bash
# внутри: прогоняем скрипты на тестовых данных
bash -x /scripts/backup.sh
⚠️ НА ЧТО СМОТРЕТЬ
Парсинг вывода
ls, df, du, stat через awk/cut — формат может отличатьсяПроверки по тексту ошибок (
grep 'No such file')Редкие флаги
cp (--reflink, --preserve=..., --sparse)💡 В ЧЁМ СУТЬ
Хороший скрипт проверяет код возврата, а не текст в выводе. Если скрипт ломается от смены реализации
ls, значит, он и так был хрупким. Повод переписать его на
find -printfили
stat -cс явным форматом.
#skills #linux #bash #ubuntu #rust #coreutils #sysadmin #admin_future