ru
Feedback
Bash Советы

Bash Советы

Открыть в Telegram

🚀 Секреты и советы по Bash 🔹 Полезные трюки, хитрые однострочники и лайфхаки для работы в терминале. 🔹 Автоматизация, скрипты и оптимизация работы в Linux. 🔹 Стать мастером Bash легко – просто подпишись! По всем вопросам @evgenycarter

Больше
2 750
Подписчики
Нет данных24 часа
+27 дней
-1130 день
Архив постов
🚀 Полезный Bash-скрипт для архивации старых логов 🚀 Иногда логи на сервере растут быстрее, чем хочется, и начинают занимать
🚀 Полезный Bash-скрипт для архивации старых логов 🚀 Иногда логи на сервере растут быстрее, чем хочется, и начинают занимать всё свободное место. Предлагаю простой скрипт, который: 1. Находит файлы с расширением .log, изменённые более чем N дней назад. 2. Архивирует их в тарболл с датой. 3. Удаляет оригиналы после успешного архива.

#!/usr/bin/env bash
#
# Архивация старых логов >7 дней
# Сохраняет в /var/backups/logs/YYYY-MM-DD_logs.tar.gz

# Настройки
LOG_DIR="/var/log"              # Каталог с логами
BACKUP_DIR="/var/backups/logs"  # Куда складывать архивы
DAYS_OLD=7                      # Возраст файлов в днях

# Создаём папку для бэкапов, если нет
mkdir -p "$BACKUP_DIR"

# Текущая дата
DATE=$(date '+%Y-%m-%d')

# Найти *.log старше N дней и упаковать в архив
find "$LOG_DIR" -type f -regextype posix-extended -regex ".*/[a-zA-Z0-9_-]+\.log$" \
    -mtime +"$DAYS_OLD" -print0 | \
  tar --null -czf "$BACKUP_DIR/${DATE}_logs.tar.gz" --files-from -

# Проверка успешности и удаление исходников
if [[ $? -eq 0 ]]; then
  echo "✅ Архив создан: $BACKUP_DIR/${DATE}_logs.tar.gz"
  # Удаляем старые логи
  find "$LOG_DIR" -type f -regextype posix-extended -regex ".*/[a-zA-Z0-9_-]+\.log$" \
      -mtime +"$DAYS_OLD" -delete
  echo "🗑️ Оригиналы удалены."
else
  echo "❌ Ошибка при создании архива!"
  exit 1
fi
Как это работает ▪️find … -regextype posix-extended -regex ".*/[a-zA-Z0-9_-]+\.log$" Использует регулярное выражение, чтобы найти все файлы с именами, состоящими из букв, цифр, подчёркиваний или дефисов, и оканчивающиеся на .log. ▪️Опция -mtime +7 выбирает файлы старше 7 дней. ▪️tar --null --files-from - позволяет безопасно работать с именами, содержащими пробелы. ▪️При успешном создании архива исходные файлы удаляются командой -delete в find. ❓ Совет: Добавьте этот скрипт в cron, чтобы он выполнялся автоматически, например, каждый день в 2:00:

0 2 * * * /usr/local/bin/archive_logs.sh >> /var/log/archive_logs_cron.log 2>&1
👍 Надеюсь, пригодится! 📲 Мы в MAX 👉@bash_srv

✨ Извлечение уникальных IP-адресов из логов Apache ✨ Иногда нужно быстро получить список всех клиентов, обращавшихся к вашему
Извлечение уникальных IP-адресов из логов Apache ✨ Иногда нужно быстро получить список всех клиентов, обращавшихся к вашему веб-серверу. Мини-скрипт на Bash с регулярным выражением поможет вытащить и сохранить все уникальные IP-адреса:

#!/usr/bin/env bash

# 📁 Файл логов Apache
LOG_FILE="/var/log/apache2/access.log"

# 📄 Файл для сохранения уникальных IP
OUT_FILE="/var/log/unique_ips_$(date +%F).txt"

# 🛠️ Извлекаем все IPv4, сортируем и убираем дубликаты
grep -Eo '([0-9]{1,3}\.){3}[0-9]{1,3}' "$LOG_FILE" \
  | sort \
  | uniq > "$OUT_FILE"

echo "✅ Список уникальных IP-адресов сохранён в $OUT_FILE"
Как это работает 1. grep -Eo '([0-9]{1,3}\.){3}[0-9]{1,3}' — опция -E включает расширенные регулярки, -o выводит только совпадения. Регулярка ищет четыре числа от 0 до 999 через точки. 2. sort упорядочивает адреса для корректной работы uniq. 3. uniq удаляет повторяющиеся строки, оставляя только уникальные IP. Совет по автоматизации Если вы хотите ежедневно обновлять этот список, добавьте задачу в cron:

0 1 * * * /usr/local/bin/extract_ips.sh >> /var/log/extract_ips_cron.log 2>&1
Это запустит скрипт каждый день в 1:00 и сохранит результат с датой в имени файла. 📲 Мы в MAX 👉@bash_srv

🗑️ Bash-совет дня: safe_rm - «корзина» для удаляемых файлов Сколько раз вы случайно удаляли важный конфиг? Давайте сделаем r
🗑️ Bash-совет дня: safe_rm - «корзина» для удаляемых файлов Сколько раз вы случайно удаляли важный конфиг? Давайте сделаем rm более дружелюбным — вместо мгновенного уничтожения файлы будут складываться в «корзину» и автоматически очищаться спустя 30 дней.

#!/usr/bin/env bash
# safe_rm — перемещает удаляемые файлы в локальную «корзину»

TRASH_DIR="$HOME/.local/share/Trash/files"   # куда складываем
mkdir -p "$TRASH_DIR"

stamp=$(date +%Y-%m-%d_%H-%M-%S)

for item in "$@"; do
  if [[ ! -e $item ]]; then
    printf '⚠️  %s: no such file or directory\n' "$item" >&2
    continue
  fi
  mv -- "$item" "$TRASH_DIR/$(basename "$item")_$stamp"
done

# авто-очистка файлов, которым больше 30 дней
find "$TRASH_DIR" -type f -mtime +30 -delete 2>/dev/null
Быстрый старт

sudo install -m 755 safe_rm /usr/local/bin/
echo "alias rm='safe_rm'" >> ~/.bashrc && source ~/.bashrc
Проверяем

touch important.cfg
rm important.cfg
ls ~/.local/share/Trash/files     # Файл на месте 🎉
> Лайфхак: > Хотите разные сроки хранения? Меняйте -mtime +30 на нужное количество дней. > Регулярные выражения в find позволяют тоньше выбирать, что чистить (например, только логи *_$(date +%Y-%m-*)). Спасайте нервы и конфиги! 😉 📲 Мы в MAX 👉@bash_srv

⚙️ Bash: Мониторинг пользователей в системе в реальном времени Иногда нужно понять, кто из пользователей сейчас в системе и ч
⚙️ Bash: Мониторинг пользователей в системе в реальном времени Иногда нужно понять, кто из пользователей сейчас в системе и что они делают. Встречай удобную команду на базе watch и w:

watch -n 2 w
📌 Что делает эта команда: * watch -n 2 — каждые 2 секунды выполняет указанную команду * w — показывает, кто залогинен, откуда, сколько времени в системе и что выполняет 👀 Отлично подходит для ситуаций: * Отладка скриптов, когда нужно смотреть, кто подключается * Мониторинг активности сотрудников или админов * Выявление подозрительных сессий SSH 💡 А если хочешь видеть только логины, без подробностей:

watch -n 2 who
Полезно держать на втором экране или в отдельной вкладке терминала 🧠 📲 Мы в MAX 👉@bash_srv

Проверка открытых портов без использования netstat Утилита netstat считается устаревшей (deprecated). В современных дистрибутивах Linux стандартом для диагностики сокетов является ss (socket statistics). Она работает быстрее и потребляет меньше ресурсов ядра. Команда:

ss -tulpn

Ключи: -t: TCP сокеты. -u: UDP сокеты. -l: Только слушающие (listening) сокеты. -p: Показать процесс, использующий сокет (требует sudo). -n: Не преобразовывать IP и порты в имена (выводит числа), что значительно ускоряет работу. #network #ss #security 📲 Мы в MAX 👉@bash_srv

Быстрая очистка содержимого файла без его удаления Частая задача при администрировании это обнулить логи или конфигурационные файлы, сохранив права доступа и дескрипторы, если файл занят процессом. Команда:

> filename.log

Или альтернативный вариант:

true > filename.log

Техническое пояснение: Оператор > перенаправляет stdout в файл. Так как левая часть команды отсутствует (или равна true), в файл записывается пустая строка, что приводит к усечению файла до нулевого размера (truncate). Это безопаснее, чем удаление и создание файла заново, так как не меняется inode. 📲 Мы в MAX 👉@bash_srv

Использование «Strict Mode» в Bash-скриптах По умолчанию Bash не останавливает выполнение скрипта при возникновении ошибок, ч
Использование «Strict Mode» в Bash-скриптах По умолчанию Bash не останавливает выполнение скрипта при возникновении ошибок, что может привести к непредсказуемым последствиям в цепочках команд. Для повышения надежности скриптов рекомендуется начинать их со следующей конструкции. Код:

#!/bin/bash
set -euo pipefail

Разбор параметров: - set -e: Останавливает скрипт, если любая команда завершилась с ошибкой (код возврата не 0). - set -u: Считает обращение к несуществующей переменной ошибкой и останавливает скрипт. - set -o pipefail: Возвращает код ошибки, если хотя бы одна команда в конвейере (pipe) завершилась неудачно (по умолчанию Bash берет код возврата только последней команды). 📲 Мы в MAX 👉@bash_srv

🔁 Как перезапускать сервис только если он завис? Иногда не хочется перезапускать сервис "на всякий случай", но вот если он р
🔁 Как перезапускать сервис только если он завис? Иногда не хочется перезапускать сервис "на всякий случай", но вот если он реально завис — другое дело. Вот простой способ проверять, активен ли сервис, и перезапускать его при зависании:

#!/bin/bash

SERVICE="nginx"

if ! systemctl is-active --quiet "$SERVICE"; then
    echo "$(date): $SERVICE не активен, пробую перезапустить..." >> /var/log/service_monitor.log
    systemctl restart "$SERVICE"
else
    echo "$(date): $SERVICE работает нормально" >> /var/log/service_monitor.log
fi
🛠 Можно добавить в крон, например, проверку каждые 5 минут:

*/5 * * * * /usr/local/bin/check_nginx.sh
📁 Не забудь сделать скрипт исполняемым:

chmod +x /usr/local/bin/check_nginx.sh
💡 Можно заменить nginx на любой другой системный сервис. 📲 Мы в MAX 👉@bash_srv

Всех с Новым Годом!!!

🔥 Bash-фишка дня: замена строк в файле без sed и awk Иногда хочется быстро заменить строку в файле без сложных конструкций.
🔥 Bash-фишка дня: замена строк в файле без sed и awk Иногда хочется быстро заменить строку в файле без сложных конструкций. Вот способ сделать это с чистым Bash и while read: 🛠 Скрипт: заменить слово в файле

#!/bin/bash

INPUT="config.txt"
OUTPUT="config_new.txt"
SEARCH="localhost"
REPLACE="127.0.0.1"

while IFS= read -r line; do
    echo "${line//$SEARCH/$REPLACE}"
done < "$INPUT" > "$OUTPUT"
📌 Что тут происходит: - IFS= read -r line — читаем файл построчно, без обрезки пробелов. - ${line//$SEARCH/$REPLACE} — заменяем все вхождения $SEARCH на $REPLACE. - Результат сохраняем в новый файл. ⚡️ Подходит, когда sed недоступен (да, бывает) или нужна более понятная логика замены. 📲 Мы в MAX 👉@bash_srv

🕵️ Ищем процессы, которые используют удалённые (удалённые, но не освобождённые) файлы Бывает, что ты удаляешь лог или большо
🕵️ Ищем процессы, которые используют удалённые (удалённые, но не освобождённые) файлы Бывает, что ты удаляешь лог или большой файл, а место на диске не освобождается? Это потому, что файл всё ещё открыт каким-то процессом! Вот скрипт, который найдёт таких «виновников»:

#!/bin/bash

echo "🔍 Ищем процессы, держащие открытые удалённые файлы..."
lsof | grep '(deleted)' | awk '{print $2}' | sort -u | while read -r pid; do
    echo "PID: $pid | Команда: $(ps -p $pid -o comm=)"
done
📌 Как использовать:

chmod +x find_deleted.sh
./find_deleted.sh
💡 Подсказка: иногда помогает systemctl restart соответствующего сервиса, чтобы освободить место. 📲 Мы в MAX 👉@bash_srv

🧠 Bash совет дня - Отслеживаем подозрительные sudo-команды в реальном времени 🕵️ Хочешь знать, кто и что запускает через su
🧠 Bash совет дня - Отслеживаем подозрительные sudo-команды в реальном времени 🕵️ Хочешь знать, кто и что запускает через sudo прямо сейчас? Настроим простой мониторинг:

#!/bin/bash

logfile="/var/log/auth.log"

tail -F "$logfile" | grep --line-buffered "sudo" | while read line; do
  echo "[ALERT] 🔐 $(date): $line"
done
📌 Что делает: - Следит за /var/log/auth.log в реальном времени. - Отфильтровывает строки, связанные с sudo. - Выводит каждое срабатывание с пометкой времени. 🔥 Пример вывода:
[ALERT] 🔐 2025-05-15 10:23:42: user1 : TTY=pts/0 ; PWD=/home/user1 ; USER=root ; COMMAND=/bin/bash
💡 Используй для: - Мониторинга активности админов или подозрительных действий. - Настройки моментального оповещения (можно расширить, чтобы слать в Telegram, Slack и т.д.). 📦 Можно оформить как systemd-сервис, чтобы монитор запускался автоматически. 📲 Мы в MAX 👉@bash_srv

🚀 Bash-совет дня: Быстрое сканирование открытых портов с помощью bash и /dev/tcp Зачем ставить nmap, если можно быстро проск
🚀 Bash-совет дня: Быстрое сканирование открытых портов с помощью bash и /dev/tcp Зачем ставить nmap, если можно быстро просканировать порты встроенными средствами bash? Вот простой однострочный скрипт:

for port in {20..1024}; do
  (echo > /dev/tcp/127.0.0.1/$port) >/dev/null 2>&1 && echo "Порт $port открыт"
done
📌 Что делает скрипт: * Использует встроенную возможность Bash подключаться к TCP-портам через псевдофайлы /dev/tcp/host/port. * Проверяет диапазон портов от 20 до 1024 на локальной машине. * Если порт доступен — выводит сообщение, что он открыт. 🔒 Можно заменить 127.0.0.1 на любой IP-адрес сервера в сети. 💡 Отличный способ быстро проверить, что открыто, когда нет доступа к полноценным утилитам. 📲 Мы в MAX 👉@bash_srv

🧠 Bash-совет дня: Проверка скорости интернет-соединения прямо из терминала Если тебе нужно быстро проверить скорость интерне
🧠 Bash-совет дня: Проверка скорости интернет-соединения прямо из терминала Если тебе нужно быстро проверить скорость интернета на сервере (например, VPS), не устанавливая громоздкие GUI-программы — вот решение:

#!/bin/bash

# Проверяем наличие speedtest-cli
if ! command -v speedtest &> /dev/null; then
    echo "⏳ Устанавливаем speedtest-cli..."
    apt update && apt install -y speedtest-cli  # Для Debian/Ubuntu
    # yum install -y speedtest-cli              # Для RHEL/CentOS
fi

# Запускаем тест скорости
echo "🚀 Проверяем скорость интернет-соединения..."
speedtest
📝 Альтернатива без установки — через curl:

curl -s https://raw.githubusercontent.com/sivel/speedtest-cli/master/speedtest.py | python3 -
📊 Удобно использовать при диагностике проблем с сетью, особенно на серверах в разных дата-центрах. 📲 Мы в MAX 👉@bash_srv

🔥 Открытый урок «Принцип DRY в GitLab CI: как избавиться от дублирования и навести порядок в пайплайнах». 🗓 18 декабря в 20
🔥 Открытый урок «Принцип DRY в GitLab CI: как избавиться от дублирования и навести порядок в пайплайнах». 🗓 18 декабря в 20:00 МСК 🆓 Бесплатно. Урок в рамках старта курса «CI/CD на основе GitLab». На вебинаре разберем: ✔️Что такое DRY в контексте CI/CD и зачем его применять. ✔️Организация пайплайнов: как структурировать .gitlab-ci.yml, чтобы не утонуть в дублировании. ✔️Include и extends — мощные механизмы переиспользования кода. ✔️ Как создать единые шаблоны пайплайнов для нескольких проектов. ✔️Антипаттерны: что ломает читаемость и поддерживаемость CI-конфигураций. После вебинара вы сможете: - Навести порядок в .gitlab-ci.yml и убрать дублирование шагов. - Создавать гибкие, масштабируемые пайплайны для разных проектов. - Стандартизировать CI/CD-процессы в команде без потери гибкости. 🔗 Ссылка на регистрацию: https://vk.cc/cSsnZr Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576

🎯 Проверка доступности списка хостов с цветным 🎨 выводом Иногда нужно быстро проверить, какие сервера "живые", а какие — не
🎯 Проверка доступности списка хостов с цветным 🎨 выводом Иногда нужно быстро проверить, какие сервера "живые", а какие — нет. Ниже написал удобный Bash-скрипт с цветным выводом в терминале 🖥️.

#!/bin/bash

# Список хостов
hosts=("192.168.0.1" "google.com" "yandex.ru" "192.168.0.100")

# Цвета
GREEN="\e[32m"
RED="\e[31m"
NC="\e[0m" # No Color

for host in "${hosts[@]}"; do
    if ping -c 1 -W 1 "$host" &> /dev/null; then
        echo -e "${GREEN}[UP]   $host${NC}"
    else
        echo -e "${RED}[DOWN] $host${NC}"
    fi
done
🔧 Просто добавь нужные IP или домены в массив hosts, и запусти. Удобно и наглядно! 📲 Мы в MAX 👉@bash_srv

🧠 Bash: Проверка доступности нескольких хостов одним скриптом Следишь за парком серверов? Этот скрипт покажет, какие машины
🧠 Bash: Проверка доступности нескольких хостов одним скриптом Следишь за парком серверов? Этот скрипт покажет, какие машины "живы", а какие — нет 🖥️❌

#!/bin/bash

# Список IP или хостнеймов
HOSTS=("192.168.0.1" "google.com" "server.local")

for HOST in "${HOSTS[@]}"; do
  if ping -c 1 -W 1 "$HOST" &> /dev/null; then
    echo "[✅] $HOST доступен"
  else
    echo "[❌] $HOST недоступен"
  fi
done
📌 Что делает: * ping -c 1 -W 1 — один пинг с таймаутом в 1 секунду * Выводит результат по каждому хосту 🔥 Можно запускать по крону или вручную, если нужно быстро понять, где беда. 📲 Мы в MAX 👉@bash_srv

🔥Проверка статуса нескольких сервисов systemd за один раз Когда нужно быстро проверить, работают ли нужные сервисы - этот од
🔥Проверка статуса нескольких сервисов systemd за один раз Когда нужно быстро проверить, работают ли нужные сервисы - этот однострочник спасёт:

for svc in nginx mysql sshd; do systemctl is-active --quiet $svc && echo "$svc ✅" || echo "$svc ❌"; done
📌 Замените nginx mysql sshd на нужные вам сервисы. Скрипт выведет статус каждого: * ✅ — сервис активен * ❌ — сервис не работает 🚀 Удобно засунуть в alias или в мониторинг! 📲 Мы в MAX 👉@bash_srv

💡 Bash-совет дня: Мониторинг открытых портов с выводом в Telegram Автоматизируй контроль за безопасностью своего сервера! Эт
💡 Bash-совет дня: Мониторинг открытых портов с выводом в Telegram Автоматизируй контроль за безопасностью своего сервера! Этот простой bash-скрипт проверяет изменения в открытых портах и шлёт уведомление в Telegram, если появились новые или исчезли старые порты.

#!/bin/bash

# Настройки
TG_TOKEN="your_bot_token"
TG_CHAT_ID="your_chat_id"
PORTS_FILE="/var/tmp/open_ports_last.txt"

# Получаем текущие открытые порты
ss -tuln | awk 'NR>1 {print $5}' | cut -d: -f2 | sort -n | uniq > /tmp/open_ports_now.txt

# Если нет предыдущего файла — создаём
if [ ! -f "$PORTS_FILE" ]; then
    cp /tmp/open_ports_now.txt "$PORTS_FILE"
    exit 0
fi

# Сравниваем с предыдущим состоянием
DIFF=$(diff -u "$PORTS_FILE" /tmp/open_ports_now.txt)

# Если есть изменения — шлём в Telegram
if [ -n "$DIFF" ]; then
    MESSAGE="⚠️ Обнаружены изменения в открытых портах:\n\`\`\`\n$DIFF\n\`\`\`"
    curl -s -X POST "https://api.telegram.org/bot$TG_TOKEN/sendMessage" \
        -d chat_id="$TG_CHAT_ID" \
        -d parse_mode="Markdown" \
        -d text="$MESSAGE"

    cp /tmp/open_ports_now.txt "$PORTS_FILE"
fi

# Уборка
rm -f /tmp/open_ports_now.txt
📌 Как использовать: 1. Замените your_bot_token и your_chat_id на свои значения. 2. Добавьте в cron, чтобы проверять, например, каждые 10 минут:

*/10 * * * * /path/to/script.sh
🔒 Будьте в курсе неожиданных открытий портов на своих серверах! 📲 Мы в MAX 👉@bash_srv

🔐 Как найти файлы с открытыми правами (777) - быстро и просто! Иногда на сервере появляются файлы и каталоги с правами 777,
🔐 Как найти файлы с открытыми правами (777) - быстро и просто! Иногда на сервере появляются файлы и каталоги с правами 777, что представляет угрозу безопасности. Найдём их одной командой:

find / -type f -perm 0777 2>/dev/null
📁 А если нужно проверить директории:

find / -type d -perm 0777 2>/dev/null
🔍 Пояснение: / - путь, где искать (можно заменить на /var, /home и т.д.) -type f / -type d — искать только файлы или директории -perm 0777 - права доступа 2>/dev/null - убираем лишние ошибки (например, от Permission denied) 💡 Лучше запускать от root для полной картины. 📲 Мы в MAX 👉@bash_srv