Bash Советы
2.14K subscribers
74 photos
8 videos
5 links
🚀 Секреты и советы по Bash

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

💻 Прокачивай терминал вместе с нами! 👇
Download Telegram
🔐 Проверяем, у кого есть root-доступ через sudo

Иногда нужно быстро выяснить, какие пользователи могут выполнять команды от имени root через sudo. Вот простой способ это сделать:


getent group sudo | cut -d: -f4 | tr ',' '\n' | sort


📋 Что делает скрипт:

* getent group sudo — вытаскивает строку группы sudo;
* cut -d: -f4 — берёт список пользователей;
* tr ',' '\n' — превращает список в столбик;
* sort — сортирует результат.

💡 Работает в Debian/Ubuntu — для других систем группу sudo нужно заменить на wheel, например:


getent group wheel | cut -d: -f4 | tr ',' '\n' | sort


🔥 Быстрый аудит — особенно полезно при подозрении на несанкционированный доступ.

👉@bash_srv
👍73
🔄 Как узнать, какой процесс держит порт в Linux?

Часто бывает, что нужный порт уже занят, и надо быстро найти, кто его "захватил". Используем lsof и ss.

📌 Вариант 1 — через lsof:


lsof -i :<порт>


🔹 Пример:


lsof -i :80



📌 Вариант 2 — через ss:


ss -tuln | grep :<порт>


🔹 Пример:


ss -tuln | grep :443



🧠 А чтобы сразу получить PID:


fuser <порт>/tcp


🔹 Пример:


fuser 22/tcp


🔥 Идеально подходит, чтобы выяснить, что мешает стартовать nginx, apache, sshd и т.д.

👉@bash_srv
👍81
📌 Мониторинг процессов с высоким потреблением CPU

Скрипт, который покажет топ-5 процессов по загрузке CPU.


ps -eo pid,comm,%cpu --sort=-%cpu | head -n 6


🔍 Что делает этот скрипт:

⚫️ps -eo pid,comm,%cpu — выводит PID, команду и использование CPU.
⚫️--sort=-%cpu — сортирует по убыванию загрузки CPU.
⚫️head -n 6 — берёт первые 5 процессов + строка заголовков.

💡 Можно повесить это на cron или закинуть в watch, чтобы отслеживать в реальном времени:


watch -n 5 'ps -eo pid,comm,%cpu --sort=-%cpu | head -n 6'


👉@bash_srv
Please open Telegram to view this post
VIEW IN TELEGRAM
👍81🔥1
🧠 Проверка, запущен ли процесс

Иногда нужно быстро проверить, работает ли нужный процесс — например, nginx, postgres или любой другой. Вот удобная bash-функция:


check_proc() {
local PROC_NAME="$1"
if pgrep -x "$PROC_NAME" > /dev/null; then
echo " Процесс '$PROC_NAME' запущен"
else
echo " Процесс '$PROC_NAME' не найден"
fi
}


📌 Как использовать:


check_proc nginx
check_proc sshd


Добавь это в свой ~/.bashrc или ~/.bash_profile, чтобы всегда иметь под рукой 🔧

💡 Работает для процессов с точным именем. Хочешь более гибкий поиск — используй pgrep "$PROC_NAME" без -x.

👉@bash_srv
👍7
💥 Автоматическая блокировка IP при большом количестве запросов 🛡️👮‍♂️

Если на сервере замечена подозрительная активность (например, слишком много запросов от одного IP), можно автоматически блокировать таких «шумных» клиентов с помощью iptables и awk:


#!/bin/bash
# автор: https://t.iss.one/bash_srv

# Лимит запросов за минуту
LIMIT=100
# Лог файл nginx или apache
LOG_FILE="/var/log/nginx/access.log"

# Найдём IP, превысившие лимит
awk '{print $1}' "$LOG_FILE" | sort | uniq -c | sort -nr | awk -v limit="$LIMIT" '$1 > limit {print $2}' | while read ip; do
# Проверим, не заблокирован ли уже
if ! iptables -L INPUT -v -n | grep -q "$ip"; then
iptables -A INPUT -s "$ip" -j DROP
echo "$(date): Заблокирован IP $ip" >> /var/log/ip_block.log
fi
done


📌 Что делает скрипт:

- Анализирует access.log
- Находит IP с количеством запросов > LIMIT
- Блокирует их через iptables

🧠 Советы:

- Запускай раз в 5 минут через cron
- Убедись, что iptables доступен и ты не блокируешь свой IP

👉@bash_srv
👍121
⚙️ Автоматический рестарт сервиса при падении

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

Вот простой способ.


#!/bin/bash

SERVICE="nginx"

if ! systemctl is-active --quiet "$SERVICE"; then
echo "[$(date)] $SERVICE не работает. Перезапускаю..." >> /var/log/autorestart.log
systemctl restart "$SERVICE"
fi


📌 Можно добавить этот скрипт в cron:


*/5 * * * * /usr/local/bin/check_nginx.sh


Так он будет проверять состояние сервиса каждые 5 минут и перезапускать его при необходимости.

Надёжность — превыше всего 💪

👉@bash_srv
👍8🤡3🔥1💩1🖕1
⚙️ Быстрое сравнение файлов на серверах 🔁

Нужно сравнить конфиги или скрипты на двух серверах? Вместо ручного копирования — вот способ сделать это с помощью ssh и diff:


diff <(cat /etc/nginx/nginx.conf) <(ssh user@remote-server 'cat /etc/nginx/nginx.conf')


🔍 Что делает:

- Сравнивает файл на локальном сервере с файлом на удалённом
- Показывает различия, как обычный diff

💡 Удобно для:

- Проверки целостности конфигов
- Поиска отличий после миграции
- Аудита изменений

📦 Работает с любыми текстовыми файлами. Поддерживает также sudo внутри ssh:


diff <(cat /etc/fstab) <(ssh user@remote 'sudo cat /etc/fstab')


🧠 Совет: если нужно сравнивать много файлов — оберните в скрипт и перебирайте пути в цикле.

👉@bash_srv
👍72
🧠 Быстрый просмотр SSL-сертификата домена

Нужно быстро проверить срок действия SSL-сертификата у удалённого сайта без браузера?


echo | openssl s_client -servername example.com -connect example.com:443 2>/dev/null | openssl x509 -noout -dates


📌 Покажет строки вида:


notBefore=Jun 1 00:00:00 2024 GMT
notAfter=Aug 30 23:59:59 2024 GMT


🔒 Хочешь только дату окончания? Добавь | grep notAfter
📦 Убедись, что установлен openssl

💡 Подходит для мониторинга и ручной проверки валидности сертификатов.

👉@bash_srv
👍6
🧪 Проверка HTTP-статуса сайта из Bash

Небольшой скрипт, который поможет проверить доступность сайта и его HTTP-статус. Особенно полезно для мониторинга внешних ресурсов или своих веб-приложений.


#!/bin/bash
# автор: https://t.iss.one/bash_srv

URL="https://example.com"

STATUS_CODE=$(curl -s -o /dev/null -w "%{http_code}" "$URL")

if [[ "$STATUS_CODE" -eq 200 ]]; then
echo " Сайт доступен: $URL (HTTP $STATUS_CODE)"
else
echo "⚠️ Проблема с сайтом: $URL (HTTP $STATUS_CODE)"
fi


🛠 Что делает скрипт:

- Тихо запрашивает URL (-s -o /dev/null)
- Выводит только HTTP-код (-w "%{http_code}")
- Показывает статус: доступен ли сайт или нет

📌 Можно добавить в cron для регулярной проверки!

👉@bash_srv
👍62
💡 Следим за изменениями в файлах в реальном времени 👁️📂

Хочешь узнать, кто и когда правит важные файлы? Используй inotifywait из пакета inotify-tools:


inotifywait -m -e modify,create,delete /etc


🔍 Что делает команда:

-m — режим мониторинга (не завершает выполнение).
-e modify,create,delete — следит за изменениями, созданием и удалением.
/etc — каталог для наблюдения (можно заменить на любой другой).

🛠 Установка на Debian/Ubuntu:


sudo apt install inotify-tools


📋 Отличный способ держать под контролем конфиги, особенно в чувствительных зонах, вроде /etc/ssh.

👉@bash_srv
👍8🎉1
С Днём сисадмина!

Помни: без тебя всё сломается. И пусть все об этом чаще вспоминают.

👉@bash_srv
15
Очистка кэша и мусора в системе

Иногда место на сервере тает на глазах, и быстро освободить его помогает чистка кэша. Вот простой скрипт:


#!/bin/bash
# автор: https://t.iss.one/bash_srv

# Лог действий
LOGFILE="/var/log/cleanup.log"

echo "=== Очистка началась: $(date) ===" >> "$LOGFILE"

# Очистка кэша apt
apt-get clean && echo "$(date) - Очистка кэша apt" >> "$LOGFILE"

# Удаление неиспользуемых пакетов
apt-get autoremove -y && echo "$(date) - Удаление неиспользуемых пакетов" >> "$LOGFILE"

# Очистка временных файлов
rm -rf /tmp/* && echo "$(date) - Очистка /tmp" >> "$LOGFILE"

# Очистка journald (оставим только 7 дней)
journalctl --vacuum-time=7d && echo "$(date) - Очистка journald" >> "$LOGFILE"

echo "=== Очистка завершена: $(date) ===" >> "$LOGFILE"


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

1. Сохраните в /usr/local/bin/cleanup.sh.
2. Сделайте исполняемым:


chmod +x /usr/local/bin/cleanup.sh

3. Добавьте в cron, чтобы запускалось, например, раз в неделю:


0 4 * * 0 /usr/local/bin/cleanup.sh


👉@bash_srv
👍5👎21
💡 Быстрый поиск и замена в куче файлов

Нужно массово заменить строку в сотне конфигов? Вот скрипт:


#!/bin/bash
# автор: https://t.iss.one/bash_srv

# Директория для поиска
DIR="/etc/nginx"
# Что ищем
SEARCH="server_name old.example.com"
# На что меняем
REPLACE="server_name new.example.com"

# Ищем и заменяем
grep -rl "$SEARCH" "$DIR" | xargs sed -i "s|$SEARCH|$REPLACE|g"

echo " Замена '$SEARCH' на '$REPLACE' выполнена в $DIR"


Как это работает:

grep -rl — ищет файлы с нужной строкой
xargs sed -i — делает замену прямо в них

🔥 Очень удобно для правки конфигов и скриптов пачками.

👉@bash_srv
👍13
🔍 10 полезных регулярных выражений для админов

Регулярки — мощный инструмент для поиска и обработки текста в Linux.


# 1. Найти все IP-адреса в файле
grep -Eo '([0-9]{1,3}\.){3}[0-9]{1,3}' file.log

# 2. Найти строки с email-адресами
grep -E '[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}' file.txt

# 3. Удалить пустые строки
sed -i '/^$/d' file.txt

# 4. Найти строки, начинающиеся с #
grep -E '^#' file.conf

# 5. Найти строки, не содержащие слово ERROR
grep -Ev 'ERROR' file.log

# 6. Заменить все цифры на символ *
sed -E 's/[0-9]/*/g' file.txt

# 7. Удалить комментарии и пустые строки
grep -Ev '^\s*#|^\s*$' file.conf

# 8. Найти все URL
grep -Eo 'https?://[^ ]+' file.txt

# 9. Найти строки длиной больше 100 символов
grep -E '.{100,}' file.txt

# 10. Извлечь доменные имена из email
grep -Eo '@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}' file.txt


💡Тестируйте регулярки в реальном времени с grep -E или онлайн-сервисами типа regex101.com.

👉@bash_srv
👍191
🔥 Регулярки для админов


1. Быстро найти IP-адреса в логе


grep -Eo '([0-9]{1,3}\.){3}[0-9]{1,3}' /var/log/nginx/access.log


Что делает:

- Ищет шаблон “число.число.число.число” — IPv4-адрес.
- -o выводит только совпадения, без лишнего текста.


2. Удалить пустые строки и комментарии из конфигов


grep -Ev '^\s*#|^\s*$' /etc/nginx/nginx.conf


Что делает:

- ^\s*# — строки, начинающиеся с # (комментарии).
- ^\s*$ — пустые строки.


3. Найти строки с ошибками в логах


grep -Ei 'error|fail|critical' /var/log/syslog


Что делает:

- Ищет ключевые слова ошибок без учёта регистра.
- Можно расширить список слов через |.

👉@bash_srv
👍7
🔥 Регулярки для админов — Часть 2

Сегодня поговорим про замену и обработку данных с помощью sed


1. Маскирование конфиденциальных данных (пароли, токены)


sed -E 's/(password|token)=\S+/\1=***HIDDEN***/g' config.txt


Что делает:

- Находит password=что-то или token=что-то.
- Заменяет значение на ***HIDDEN***.


2. Удалить все цифры из файла


sed -E 's/[0-9]+//g' file.txt


Что делает:

- [] — диапазон символов.
- + — одно или больше вхождений.


3. Быстро поменять домен в конфиге


sed -E 's/(server_name\s+).*/\1newdomain.com/' /etc/nginx/sites-available/site.conf


Что делает:

- Захватывает server_name и всё после него.
- Заменяет домен на newdomain.com.


4. Удалить строки, содержащие определённые слова


sed -E '/(DEBUG|TRACE)/d' app.log


Что делает:

- /(...)/d — удаляет строки, содержащие DEBUG или TRACE.

👉@bash_srv
👍31
🔄 Мониторинг доступности сайта с уведомлением в Telegram

Хотите знать, когда ваш сайт «упал»? Ниже написал простой Bash-скрипт, который проверяет доступность ресурса и шлёт уведомление в Telegram.


#!/bin/bash
# автор: https://t.iss.one/bash_srv

# Настройки
URL="https://example.com"
BOT_TOKEN="123456789:ABCDEF1234567890abcdef1234567890"
CHAT_ID="987654321"

# Проверка доступности
HTTP_CODE=$(curl -s -o /dev/null -w "%{http_code}" "$URL")

if [ "$HTTP_CODE" -ne 200 ]; then
MESSAGE="⚠️ Сайт $URL недоступен! Код ответа: $HTTP_CODE"
curl -s -X POST "https://api.telegram.org/bot$BOT_TOKEN/sendMessage" \
-d chat_id="$CHAT_ID" \
-d text="$MESSAGE"
fi


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

1. Вставьте ваш BOT_TOKEN и CHAT_ID.
2. Сохраните скрипт, например, /usr/local/bin/check_site.sh.
3. Добавьте в cron (каждые 5 минут):


*/5 * * * * /usr/local/bin/check_site.sh


Теперь вы сразу узнаете, если сайт станет недоступен.

👉@bash_srv
👍64
🛜 Быстрое сканирование сети с выводом живых хостов

Иногда нужно быстро узнать, какие устройства сейчас активны в сети. Вместо тяжёлых сканеров можно использовать пару строк на bash.


#!/bin/bash
# Быстрое сканирование сети (замени 192.168.1 на свою подсеть)
# автор: https://t.iss.one/bash_srv
SUBNET="192.168.1"

for i in {1..254}; do
(
ping -c1 -W1 $SUBNET.$i &>/dev/null && echo "$SUBNET.$i доступен"
) &
done
wait


Что делает скрипт?

- Перебирает адреса от 192.168.1.1 до 192.168.1.254
- Параллельно пингует их с таймаутом 1 секунда
- Выводит только живые хосты

В 10-20 раз быстрее обычного пинга благодаря параллельному запуску!

Попробуй сохранить скрипт как scan.sh, сделать его исполняемым (chmod +x scan.sh) и запустить.

👉@bash_srv
👍12🔥3
🎯 Мониторинг занятости диска с алертом на почту 📬

Хотите, чтобы сервер сам предупреждал вас при нехватке свободного места на диске? Никидал простой bash-скрипт, который отправит письмо, если свободного места останется меньше 10%:


#!/bin/bash
# автор: https://t.iss.one/bash_srv

# Порог в % (если меньше — шлём алерт)
THRESHOLD=10
EMAIL="[email protected]"

# Получаем список всех точек монтирования
df -hP | grep -vE '^Filesystem' | while read line; do
USAGE=$(echo $line | awk '{print $5}' | tr -d '%')
MOUNT=$(echo $line | awk '{print $6}')

if [ "$USAGE" -ge $((100 - THRESHOLD)) ]; then
echo -e "На сервере $(hostname)\nМонтирование: $MOUNT\nЗанято: $USAGE%" | \
mail -s "⚠️ Мало места на диске $MOUNT" "$EMAIL"
fi
done


📌 Как использовать:

1. Убедитесь, что установлен mailx (или mail).
2. Измените переменную EMAIL на свой адрес.
3. Добавьте скрипт в cron, чтобы он выполнялся, например, каждый час.

🛡️ Так вы всегда будете в курсе, что диск переполняется, до того как сервер упадёт 🚨

👉@bash_srv
👍53
📌 Bash-скрипт для автоматического бэкапа MySQL с ротацией

Накидал пример простого скрипта для автоматического бэкапа базы, чтобы всегда была свежая копия, но при этом не захламлять диск старыми дампами.


#!/bin/bash
# Параметры
# автор: https://t.iss.one/bash_srv
DB_USER="root"
DB_PASS="password"
DB_NAME="my_database"
BACKUP_DIR="/backup/mysql"
DATE=$(date +"%Y-%m-%d_%H-%M-%S")

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

# Делаем дамп базы
mysqldump -u"$DB_USER" -p"$DB_PASS" "$DB_NAME" > "$BACKUP_DIR/${DB_NAME}_${DATE}.sql"

# Оставляем только 7 последних бэкапов, остальные удаляем
ls -1t "$BACKUP_DIR"/*.sql | tail -n +8 | xargs -r rm --

echo " Бэкап базы $DB_NAME создан: ${DB_NAME}_${DATE}.sql"


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

1. Сохраните скрипт, например в /usr/local/bin/mysql_backup.sh.
2. Дайте права на выполнение:


chmod +x /usr/local/bin/mysql_backup.sh

3. Добавьте в cron, чтобы бэкап делался каждый день в 3 ночи:


0 3 * * * /usr/local/bin/mysql_backup.sh


📦 В результате вы всегда будете иметь 7 последних бэкапов, а старые будут удаляться автоматически.

👉@bash_srv
👍61👌1