Bash и математика
Это почти несовместимо, но стоит подключить утилиту
▪️ Пример: базовые вычисления
По умолчанию дробные числа - без знаков после запятой. Поэтому:
▪️ Переменные и выражения
Или сохранить результат:
Флаг -l включает математическую библиотеку с поддержкой sqrt(), s(), c(), l(), e() и т.д.
▪️ Условия и логика
▪️ Пример: вычисление средней загрузки из логов CPU
🌟 Когда использовать bc:
📍 скрипты мониторинга;
📍 фин. расчёты в bash;
📍 работа с датчиками (температура, напряжение);
📍 вычисление геометрических величин, преобразование координат
BashTex📱 #bash #utils
Это почти несовместимо, но стоит подключить утилиту
bc - и ты получаешь калькулятор в консоли, поддерживающий: дробные числа, логические выражения, условные операторы, возведение в степень и функции.
echo "3.14 * 2.5" | bc
# → 7.85
По умолчанию дробные числа - без знаков после запятой. Поэтому:
echo "scale=4; 10 / 3" | bc
# → 3.3333
a=5.7
b=3.2
echo "scale=2; $a + $b" | bc
# → 8.9
Или сохранить результат:
result=$(echo "scale=3; ($a^2 + $b^2)^0.5" | bc -l)
Флаг -l включает математическую библиотеку с поддержкой sqrt(), s(), c(), l(), e() и т.д.
x=2.5
y=4.1
if [[ $(echo "$x < $y" | bc) -eq 1 ]]; then
echo "$x меньше $y"
fi
total=0
count=0
for val in 1.2 0.8 2.5 1.9; do
total=$(echo "$total + $val" | bc)
count=$((count + 1))
done
avg=$(echo "scale=2; $total / $count" | bc)
echo "Средняя нагрузка: $avg"
BashTex
Please open Telegram to view this post
VIEW IN TELEGRAM
👍18
Сканирование домашнего каталога на наличие SSH-ключей и приватных файлов
SSH-ключи и приватные файлы часто забывают почистить после миграций, тестов и копирований. Но забытый id_rsa в чужом $HOME - это потенциальная дыра в безопасности.
Сегодня про то, как быстро просканировать все домашние каталоги на сервере на наличие:
приватных ключей (id_rsa, *.pem, *.key)
конфигураций с доступами (.ssh/config, known_hosts)
подозрительных backup-файлов (*.bak, *.old, *~)
🛠 Скрипт: поиск чувствительных файлов
⭐️ Расширенная версия: с владельцем и правами
▪️ Это поможет заметить, если:
📍 приватный ключ лежит с правами 644 - плохо
📍 файл принадлежит не тому пользователю
📍 ключи забыли в общем ~/Downloads/ или ~/Desktop/
BashTex📱 #bash #security
SSH-ключи и приватные файлы часто забывают почистить после миграций, тестов и копирований. Но забытый id_rsa в чужом $HOME - это потенциальная дыра в безопасности.
Сегодня про то, как быстро просканировать все домашние каталоги на сервере на наличие:
приватных ключей (id_rsa, *.pem, *.key)
конфигураций с доступами (.ssh/config, known_hosts)
подозрительных backup-файлов (*.bak, *.old, *~)
#!/bin/bash
echo "[*] Поиск приватных SSH-ключей и чувствительных файлов в /home/*"
find /home /root \
-type f \
\( -name "id_rsa" -o -name "*.pem" -o -name "*.key" -o -name "*.bak" -o -name "*.old" -o -name "*~" \) \
-exec ls -lh {} \; 2>/dev/null
find /home /root \
-type f \
\( -name "id_rsa" -o -name "*.key" -o -name "*.pem" -o -name "*.gpg" \) \
-printf "%M %u %p\n" 2>/dev/null | sort
BashTex
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6👨💻2🔥1
Выявление SUID-бинарей и контроль их изменений
🌟 SUID-файлы в Linux - это потенциальная зона риска. Если злоумышленник сможет изменить или подменить такой бинарник, он может получить права root. Поэтому важно не только найти такие файлы, но и отслеживать их изменения.
SUID (Set User ID) - бит прав, при котором программа выполняется с правами владельца файла, а не вызывающего пользователя.
Типичный пример:
SUID-бит (s вместо x) на позиции владельца.
1️⃣ Поиск всех SUID-файлов в системе
Добавим форматированный вывод с размером и датой:
2️⃣ Контроль изменений через контрольные суммы. Создадим базовый снимок:
А теперь проверим изменения:
Все, что отличается от baseline, будет отображено.
▪️ Добавить cron-задачу:
И сам suid_check.sh:
BashTex📱 #bash #security
SUID (Set User ID) - бит прав, при котором программа выполняется с правами владельца файла, а не вызывающего пользователя.
Типичный пример:
ls -l /usr/bin/passwd
-rwsr-xr-x 1 root root 54256 /usr/bin/passwd
SUID-бит (s вместо x) на позиции владельца.
find / -perm -4000 -type f 2>/dev/null
Добавим форматированный вывод с размером и датой:
find / -perm -4000 -type f -exec ls -lh {} \; 2>/dev/null
find / -perm -4000 -type f -exec sha256sum {} \; 2>/dev/null > /var/log/suid_baseline.sha
А теперь проверим изменения:
sha256sum -c /var/log/suid_baseline.sha 2>/dev/null | grep -v ': OK'
Все, что отличается от baseline, будет отображено.
@daily root /usr/local/bin/suid_check.sh >> /var/log/suid_monitor.log
И сам suid_check.sh:
#!/bin/bash
BASELINE="/var/log/suid_baseline.sha"
TMP="/tmp/suid_check.$$"
find / -perm -4000 -type f -exec sha256sum {} \; 2>/dev/null > "$TMP"
diff -u "$BASELINE" "$TMP" && cp "$TMP" "$BASELINE"
rm "$TMP"
BashTex
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9
Запуск команд от имени другого пользователя через su/sudo без пароля
Иногда нужно запустить команду от другого пользователя - без постоянного ввода пароля. Например:
от имени сервисного пользователя без логина;
в скриптах автоматизации;
при делегировании задач.
Используем sudo с NOPASSWD и su с передачей команды.
1️⃣ Способ: sudo без пароля. Для этого отредактируем sudoers через:
Добавим строку:
Теперь можно запускать:
Или сразу выполнять произвольную команду:
2️⃣ Способ: su без пароля (через sudo-права). Если sudo уже доступен, можно делать:
Это полезно, если нужна изоляция окружения (su - сбрасывает переменные).
▪️ Пример в скрипте:
Обязательно ограничь sudo на конкретную команду в sudoers, чтобы избежать эскалации.
🌟 Безопасность:
📍 Не давай NOPASSWD на ALL!
📍 Всегда указывай полный путь к команде
📍 Используй visudo, чтобы не сломать конфигурацию
BashTex📱 #bash #utils
Иногда нужно запустить команду от другого пользователя - без постоянного ввода пароля. Например:
от имени сервисного пользователя без логина;
в скриптах автоматизации;
при делегировании задач.
Используем sudo с NOPASSWD и su с передачей команды.
sudo visudo
Добавим строку:
myuser ALL=(targetuser) NOPASSWD: /usr/bin/systemctl restart my-service
Теперь можно запускать:
sudo -u targetuser /usr/bin/systemctl restart my-service
Или сразу выполнять произвольную команду:
sudo -u deployuser /home/deployuser/noscripts/deploy.sh
sudo su - otheruser -c 'echo $HOME'
Это полезно, если нужна изоляция окружения (su - сбрасывает переменные).
#!/bin/bash
USER=deploy
CMD="/opt/app/update.sh"
sudo -u "$USER" bash -c "$CMD"
Обязательно ограничь sudo на конкретную команду в sudoers, чтобы избежать эскалации.
BashTex
Please open Telegram to view this post
VIEW IN TELEGRAM
👍11
Эмуляция очереди и стека в Bash: играем с массивами как в CS101
В bash можно не только писать условия и циклы, но и реализовать базовые структуры данных. Сегодня - очередь (FIFO) и стек (LIFO) - с помощью обычных массивов.
▪️ Стек (LIFO). Последним пришел - первым ушел.
После этого в стеке остается только "первый".
▪️ Очередь (FIFO). Первым пришел - первым ушел.
Мы просто “срезаем” массив начиная с элемента 1.
▪️ Пример: обработка задач в очереди
▪️ Условно реальный стек
С bash версии 4+ можно использовать [-1] для получения последнего элемента.
🌟 Минусы:
📍 Нет указателей, только пересоздание массива;
📍 Производительность не сравнима с языками типа Python, но работает.
BashTex📱 #bash #utils
В bash можно не только писать условия и циклы, но и реализовать базовые структуры данных. Сегодня - очередь (FIFO) и стек (LIFO) - с помощью обычных массивов.
stack=()
# push
stack+=("первый")
stack+=("второй")
# pop
last_index=$(( ${#stack[@]} - 1 ))
echo "POP: ${stack[$last_index]}"
unset 'stack[$last_index]'
После этого в стеке остается только "первый".
queue=()
# enqueue
queue+=("alpha")
queue+=("beta")
# dequeue
echo "DEQUEUE: ${queue[0]}"
queue=("${queue[@]:1}")
Мы просто “срезаем” массив начиная с элемента 1.
queue=("job1" "job2" "job3")
while [[ ${#queue[@]} -gt 0 ]]; do
task="${queue[0]}"
echo "Processing $task"
queue=("${queue[@]:1}")
done
push() { stack+=("$1"); }
pop() { echo "${stack[-1]}"; unset 'stack[-1]'; }
peek() { echo "${stack[-1]}"; }
С bash версии 4+ можно использовать [-1] для получения последнего элемента.
BashTex
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8
Парсим YAML и TOML в bash без внешних зависимостей
YAML и TOML - популярные форматы конфигураций. Но в чистом bash их разбирать - задача нетривиальная. Особенно если не хочешь тащить yq, shyaml, python и toml-cli.
Разберемся, как выжать максимум из awk, grep, IFS и других стандартных средств.
▪️ YAML (только простые key: value)
Пример:
Вызов:
Не поддерживает вложенные уровни и массивы - только flat YAML.
▪️ TOML (ключ=значение)
Пример:
Вызов:
🟩 Преимущества
📍 Легко встраивается в скрипты
📍 Не требует ничего, кроме POSIX-инструментов
📍 Можно логировать значения или сохранять в массивы
🔲 Ограничения
📍 Нет поддержки массивов, вложенных таблиц, якорей
📍 YAML с отступами, списками и вложениями - не обработается
BashTex📱 #bash
YAML и TOML - популярные форматы конфигураций. Но в чистом bash их разбирать - задача нетривиальная. Особенно если не хочешь тащить yq, shyaml, python и toml-cli.
Разберемся, как выжать максимум из awk, grep, IFS и других стандартных средств.
parse_yaml() {
grep '^[^#[:space:]].*:' "$1" | awk -F': ' '
NF == 2 { gsub(/"/, "", $2); print $1 "=" $2 }
'
}
Пример:
# config.yaml
port: 8080
host: localhost
debug: true
Вызов:
eval $(parse_yaml config.yaml)
echo "$host:$port" # → localhost:8080
Не поддерживает вложенные уровни и массивы - только flat YAML.
parse_toml() {
grep -v '^\s*#' "$1" | grep '=' | while IFS='=' read -r key val; do
key=$(echo "$key" | xargs)
val=$(echo "$val" | sed -E 's/^["'\'']//; s/["'\'']$//' | xargs)
echo "$key=$val"
done
}
Пример:
# config.toml
user = "admin"
port = 9000
Вызов:
eval $(parse_toml config.toml)
echo "$user:$port" # → admin:9000
BashTex
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6
Please open Telegram to view this post
VIEW IN TELEGRAM
😁15🗿3
Асинхронное логирование bash-скриптов с метками времени
Когда скрипт выполняет много команд, хочется: видеть вывод в реальном времени, сохранить лог в файл, добавить метки времени и не тормозить скрипт тяжелым tee в цикле.
Вот асинхронный способ, как это сделать.
▪️ Подход: через mkfifo и фоновый логгер
🌟 Что получаем:
Файл noscript.log будет без меток времени - идеально для машинной обработки
На экране - человекочитаемый лог
BashTex📱 #bash #utils
Когда скрипт выполняет много команд, хочется: видеть вывод в реальном времени, сохранить лог в файл, добавить метки времени и не тормозить скрипт тяжелым tee в цикле.
Вот асинхронный способ, как это сделать.
#!/bin/bash
LOG_FILE="noscript.log"
PIPE="/tmp/pipe.$$"
# создаем именованный канал
mkfifo "$PIPE"
# логгер: читает из канала, добавляет таймштамп и пишет в файл
tee "$LOG_FILE" < "$PIPE" |
while IFS= read -r line; do
echo "[$(date '+%Y-%m-%d %H:%M:%S')] $line"
done &
# перенаправим stdout и stderr скрипта в канал
exec > "$PIPE" 2>&1
# ———————————————
echo "Скрипт стартовал"
sleep 1
echo "Работаем..."
ls /nonexistent/path
echo "Завершено"
# ———————————————
wait
rm "$PIPE"
📍 Вывод в терминале с метками времени📍 Лог сохраняется в файл без stdout-мусора📍 Работает асинхронно: скрипт не ждёт tee/while📍 Поддерживает stderr
Файл noscript.log будет без меток времени - идеально для машинной обработки
На экране - человекочитаемый лог
BashTex
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥12
Self-test для скриптов: проверка зависимостей, путей и прав доступа перед выполнением
Self-test в начале скрипта - это мини-проверка, которая убеждается, что все окружение готово: утилиты установлены, пути доступны, директории пишутся. Без этого легко получить «тихий фэйл». Добавим в скрипт проверку еще до основной логики.
🛠 Пример базового self-test блока
❓ Что еще можно проверять?
📍 Наличие переменных окружения
📍 Работу с удаленными API (curl --silent --fail)
📍 Целостность файлов настроек
📍 Доступность сервисов (systemctl is-active)
BashTex📱 #bash
Self-test в начале скрипта - это мини-проверка, которая убеждается, что все окружение готово: утилиты установлены, пути доступны, директории пишутся. Без этого легко получить «тихий фэйл». Добавим в скрипт проверку еще до основной логики.
#!/bin/bash
# 💥 Включаем строгий режим
set -euo pipefail
#Список зависимостей
REQUIRED_CMDS=("curl" "jq" "awk")
#Каталоги, которые должны существовать и быть доступны
REQUIRED_DIRS=("/var/log/myapp" "/etc/myapp")
#Проверка утилит
for cmd in "${REQUIRED_CMDS[@]}"; do
command -v "$cmd" >/dev/null 2>&1 || {
echo "Требуется утилита '$cmd', но она не найдена"
exit 1
}
done
#Проверка директорий
for dir in "${REQUIRED_DIRS[@]}"; do
[[ -d "$dir" ]] || {
echo "Каталог $dir не существует"
exit 1
}
[[ -w "$dir" ]] || {
echo "Нет прав на запись в $dir"
exit 1
}
done
#Проверка прав запуска от root (если нужно)
if [[ $EUID -ne 0 ]]; then
echo "Скрипт должен быть запущен от root"
exit 1
fi
echo "Self-test пройден успешно. Продолжаем выполнение..."
BashTex
Please open Telegram to view this post
VIEW IN TELEGRAM
👍10
Bash-сборка .deb пакета из локального проекта с автогенерацией changelog
Хочешь упаковать свой скрипт, бинарник или мини-сервис в .deb, не лезя в dh-make и ручное правописание changelog? Делается это всего за пару минут с bash-автоматизацией.
▪️ Структура проекта. Пример для утилиты mytool:
▪️ DEBIAN/control (пример)
▪️ Генерация changelog из git
▪️ Сборка .deb
▪️ Автоматизация в bash
Теперь можно установить пакет через
BashTex📱 #bash #utils
Хочешь упаковать свой скрипт, бинарник или мини-сервис в .deb, не лезя в dh-make и ручное правописание changelog? Делается это всего за пару минут с bash-автоматизацией.
mytool/
├── usr/
│ └── local/
│ └── bin/
│ └── mytool
└── DEBIAN/
└── control
Package: mytool
Version: 1.0.0
Section: utils
Priority: optional
Architecture: all
Maintainer: You <admin@bashtex.ru>
Denoscription: Утилита для всего
generate_changelog() {
git log -n 10 --pretty=" * %s (%h)" > changelog.txt
echo "mytool (1.0.0) stable; urgency=low" | cat - changelog.txt > DEBIAN/changelog
rm changelog.txt
}
build_deb() {
chmod -R 755 mytool/DEBIAN
dpkg-deb --build mytool
}
#!/bin/bash
set -e
PKG_DIR="mytool"
VERSION="1.0.0"
PKG_NAME="mytool_${VERSION}.deb"
generate_changelog() {
git log -n 10 --pretty=" * %s (%h)" > "$PKG_DIR/DEBIAN/changelog"
}
build_deb() {
chmod -R 755 "$PKG_DIR/DEBIAN"
dpkg-deb --build "$PKG_DIR" "$PKG_NAME"
echo "Пакет создан: $PKG_NAME"
}
generate_changelog
build_deb
Теперь можно установить пакет через
dpkg -i mytool_1.0.0.deb, а в /usr/local/bin/ появится твой скрипт.BashTex
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8🔥2
Симуляция транзакций в Bash
В bash нет настоящих транзакций. Но что, если тебе нужно выполнить серию изменений, и в случае ошибки все откатить обратно? Это возможно - через копии, trap, проверку ошибок и откат действий вручную.
▪️ Пример: изменение конфигов с возможностью отмены
▪️ Объяснение:
📍
📍
📍 Копия - это наша "точка восстановления"
📍 После успешного выполнения - копия удаляется
▪️ Применение:
Это простая, но классная техника: bash-транзакции как ручной аналог ACID.
BashTex📱 #bash #utils
В bash нет настоящих транзакций. Но что, если тебе нужно выполнить серию изменений, и в случае ошибки все откатить обратно? Это возможно - через копии, trap, проверку ошибок и откат действий вручную.
#!/bin/bash
set -euo pipefail
CONFIG="/etc/myapp/config.conf"
BACKUP="/tmp/config.conf.bak.$RANDOM"
# Создаём резервную копию
cp "$CONFIG" "$BACKUP"
# Обработчик при ошибке
rollback() {
echo "Ошибка! Откатываем изменения..."
cp "$BACKUP" "$CONFIG"
echo "Конфиг восстановлен."
}
trap rollback ERR
echo "Обновляем конфиг..."
# Имитация изменения
echo "enable_feature=true" >> "$CONFIG"
# Имитация ошибки
false # или команда, которая может упасть
echo "Конфиг успешно обновлён"
rm "$BACKUP"
trap rollback ERR - ловит любую ошибку set -euo pipefail - строгий режим, ошибки не скрываютсяОбновление конфигов
Копирование и изменение сервисных файлов
Манипуляции с crontab, systemd, hosts, fstab
Авторазвертывание с откатом при сбое
Это простая, но классная техника: bash-транзакции как ручной аналог ACID.
BashTex
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥11🫡1
Запрет доступа к конфигурационным файлам через AppArmor
Даже если у вас настроены права доступа на конфиги (
1️⃣ Базовый профиль AppArmor. Пример для блокировки доступа к
Разрешаем запуск всего в
▪️ Активация профиля
Профиль будет применен сразу.
Проверка:
2️⃣ Анализ логов AppArmor. Все попытки нарушения будут фиксироваться в
Пример:
3️⃣ Скрипт для анализа и алерта
Можно запустить через cron или systemd-timer.
❓ Зачем это нужно:
📍 Ужесточение защиты конфигов от неожиданных процессов;
📍 Мониторинг попыток обхода прав через утилиты;
📍 Интеграция с TG или почтой для оповещений
BashTex📱 #bash #security
Даже если у вас настроены права доступа на конфиги (
/etc/shadow, /etc/ssh/sshd_config, /etc/fstab), это не исключает попыток обхода через эксплойты или скомпрометированные процессы. Решение: AppArmor + аудит + реакция.sshd_config сторонними процессами:
# /etc/apparmor.d/usr.local.block-ssh-access
#include <tunables/global>
/usr/local/bin/* {
deny /etc/ssh/sshd_config r,
}
Разрешаем запуск всего в
/usr/local/bin, но явно запрещаем доступ к sshd_config.
sudo apparmor_parser -r /etc/apparmor.d/usr.local.block-ssh-access
Профиль будет применен сразу.
Проверка:
aa-status
dmesg или /var/log/kern.log / /var/log/syslog:Пример:
audit: type=1400 audit(…): apparmor="DENIED" operation="open" profile="/usr/local/bin/mynoscript" name="/etc/ssh/sshd_config"
#!/bin/bash
LOG="/var/log/syslog"
ALERT="/var/log/apparmor_violations.log"
grep "apparmor=\"DENIED\"" "$LOG" | grep "/etc/ssh/sshd_config" >> "$ALERT"
if [[ -s $ALERT ]]; then
echo "[ALERT] Попытка доступа к sshd_config:"
cat "$ALERT"
> "$ALERT" # Очистка после отчёта
fi
Можно запустить через cron или systemd-timer.
BashTex
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥9
Сегодня не будет познавательных постов, но будет не менее важное - поздравление! Сегодня - день тех, кто всегда остается за кулисами, но без кого не работает ничего. Это вы начинающие или уже опытные - волшебники командной строки, мастера uptime и защитники серверов от хаоса.
Именно Вы держите на плаву сети, базы данных, почту, бэкапы, мониторинг, безопасность и еще тысячу вещей, о которых никто не догадывается... пока все не сломается, ну или им не покажется, что все сломалось..
Буду короток: пусть в логах будет чисто, аптайм радует глаз, а пользователи не беспокоят в пятницу вечером. А еще - стабильных обновлений, бесшумных серверов и свободного времени для себя.
За вас, сисадмины! С праздником!
BashTex
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥15🫡4
Скрытые сенсоры системы в скриптах
Когда bash-скрипт работает в продакшене, важно понимать окружение: доступные ресурсы, нагрузку, ограничения. Знакомимся:
▪️ getconf: узнать параметры системы
Можно использовать перед запуском ресурсоемких команд, чтобы адаптировать размер батчей, буферов и т.д.
▪️ ulimit: узнать и задать ограничения
Полезно перед форком процессов: не дайте скрипту уронить систему из-за 10000 открытых файлов.
▪️ vmstat: мониторинг памяти и нагрузки
Используй для самодиагностики скриптов: если скрипт замечает, что система в swap - можно приостановить запуск тяжелых задач.
▪️ iostat: здоровье диска
Если util% > 90 - диск перегружен. Скрипт может решить подождать или отложить копирование.
▪️ Пример: скрипт отложенного запуска при перегрузке
Скрипты могут быть "умными", если читают данные от системы: не запускай, если ресурсов нет, не ломай лимиты.
BashTex📱 #bash #utils
Когда bash-скрипт работает в продакшене, важно понимать окружение: доступные ресурсы, нагрузку, ограничения. Знакомимся:
getconf, ulimit, vmstat, iostat - системные команды, которые можно встраивать прямо в bash для более "умных" решений.
echo "Page size: $(getconf PAGESIZE)"
echo "Максимум аргументов в командной строке: $(getconf ARG_MAX)"
Можно использовать перед запуском ресурсоемких команд, чтобы адаптировать размер батчей, буферов и т.д.
echo "Открытых файлов можно: $(ulimit -n)"
ulimit -c 0 # Запретить core dumps
Полезно перед форком процессов: не дайте скрипту уронить систему из-за 10000 открытых файлов.
vmstat 1 2 | tail -1 | awk '{print "Свободная память: " $4 " KB, ожидание I/O: " $16}'
Используй для самодиагностики скриптов: если скрипт замечает, что система в swap - можно приостановить запуск тяжелых задач.
iostat -dx 1 2 | grep sda | tail -1 | awk '{print "IO util: " $NF "%"}'
Если util% > 90 - диск перегружен. Скрипт может решить подождать или отложить копирование.
wait_for_idle() {
while :; do
util=$(iostat -dx 1 2 | awk '/sda/ {u=$NF} END{print int(u)}')
[[ $util -lt 50 ]] && break
echo "Диск занят ($util%), ждём..."
sleep 5
done
}
Скрипты могут быть "умными", если читают данные от системы: не запускай, если ресурсов нет, не ломай лимиты.
BashTex
Please open Telegram to view this post
VIEW IN TELEGRAM
👍10
Автоматическое обновление /etc/hosts из внешнего списка блокировки рекламы
Хотите заблокировать рекламу, трекеры и телеметрию на уровне всей системы, без прокси и сторонних приложений? Достаточно обновлять
🛠 Скрипт обновления /etc/hosts
▪️ Автоматизация через cron. Добавим задачу раз в неделю:
➕ Преимущества:
Блокировка на уровне ОС - работает в браузерах, терминале, приложениях;
Никаких прокси, VPN, расширений;
Работает даже в headless-системах.
🌟 Редактирование
BashTex📱 #bash #utils
Хотите заблокировать рекламу, трекеры и телеметрию на уровне всей системы, без прокси и сторонних приложений? Достаточно обновлять
/etc/hosts из надежных источников, таких как someonewhocares.org или StevenBlack. И все это можно автоматизировать с bash.
#!/bin/bash
set -euo pipefail
# Источник обновленного hosts-файла
URL="https://someonewhocares.org/hosts/hosts"
# Временный файл
TMP="/tmp/hosts_blocklist"
# Бэкап текущего hosts
cp /etc/hosts "/etc/hosts.bak.$(date +%s)"
# Скачиваем и фильтруем список
curl -s "$URL" | grep -vE '^#|^$' > "$TMP"
# Объединяем с локальной частью
{
grep -E "^127\.0\.0\.1|^::1" /etc/hosts.bak.* | head -n 2
echo -e "\n# 🔒 AdBlock entries:"
cat "$TMP"
} > /etc/hosts
echo "/etc/hosts обновлен. Всего $(wc -l < "$TMP") заблокированных адресов."
(crontab -l; echo "0 4 * * 0 /usr/local/bin/update-hosts.sh") | crontab -
Блокировка на уровне ОС - работает в браузерах, терминале, приложениях;
Никаких прокси, VPN, расширений;
Работает даже в headless-системах.
/etc/hosts требует root-прав, а некоторые адреса могут ломать нужные функции (whitelist нужно продумывать).BashTex
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7🔥2
Управление псевдотерминалами
Псевдотерминалы (PTY) - это то, что позволяет запускать оболочки, эмулировать сессии и автоматизировать взаимодействие с CLI-программами, которые ждут ввода. В linux есть несколько инструментов, которые можно использовать для работы с ними.
▪️ noscript - захват сессии в PTY
Команда выполнится в псевдотерминале, а весь вывод будет сохранен, как будто это была обычная интерактивная сессия.
Полезно: для логгирования; обхода нестандартного поведения программ без TTY.
▪️ socat - соединение PTY с чем угодно. Создание виртуальной пары PTY-устройств:
Это выведет два устройства
Применения: имитация COM-портов; отладка CLI-программ; организация проброса ввода/вывода.
▪️ expect - автоматизация интерактивных CLI
expect ждет определенный вывод и отправляет нужный ввод. Это незаменимо, когда скрипт должен работать с программой, которая не поддерживает аргументы, только ручной ввод.
❓ Когда это нужно?
📍 автоматизация SCP, FTP, SSH при отсутствии ключей;
📍 создание тестов CLI-интерфейсов;
📍 запуск GUI-оберток над TUI-программами;
📍 обход "упрямых" команд, требующих TTY (sudo, passwd, mysql, и др.);
BashTex📱 #bash #utils
Псевдотерминалы (PTY) - это то, что позволяет запускать оболочки, эмулировать сессии и автоматизировать взаимодействие с CLI-программами, которые ждут ввода. В linux есть несколько инструментов, которые можно использовать для работы с ними.
noscript -q -c "top -n 1" session.log
Команда выполнится в псевдотерминале, а весь вывод будет сохранен, как будто это была обычная интерактивная сессия.
Полезно: для логгирования; обхода нестандартного поведения программ без TTY.
socat -d -d pty,raw,echo=0 pty,raw,echo=0
Это выведет два устройства
/dev/pts/X и /dev/pts/Y, которые можно использовать, например, чтобы связать скрипт и программу, как будто они "болтают" друг с другом.Применения: имитация COM-портов; отладка CLI-программ; организация проброса ввода/вывода.
#!/usr/bin/expect -f
spawn ssh user@host
expect "password:"
send "supersecret\r"
interact
expect ждет определенный вывод и отправляет нужный ввод. Это незаменимо, когда скрипт должен работать с программой, которая не поддерживает аргументы, только ручной ввод.
BashTex
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7
Создание honeypot-директории с мониторингом через inotify
Honeypot-директория - это ловушка для злоумышленников: специальная папка, куда никто не должен лазить, но если вдруг кто-то туда сунулся - ты узнаешь первым. С помощью inotifywait и bash можно создать простую систему наблюдения за такими "приманками".
1️⃣ Создаем honeypot-директорию
Можно добавить туда пару "интересных" файлов: passwords.txt, backup.tar.gz.
2️⃣ Скрипт для мониторинга
Этот скрипт не завершится, пока не остановлен вручную - запускай как systemd-сервис или в screen/tmux.
➕ Почему это полезно?
📍 Выявление локальных злоумышленников или скомпрометированных процессов;
📍 Алерт при попытке доступа даже от root, если забыли, что это ловушка;
📍 Возможность записывать все действия, включая дату, время и тип события;
BashTex📱 #bash #security
Honeypot-директория - это ловушка для злоумышленников: специальная папка, куда никто не должен лазить, но если вдруг кто-то туда сунулся - ты узнаешь первым. С помощью inotifywait и bash можно создать простую систему наблюдения за такими "приманками".
mkdir -p /opt/.honeypot
chmod 700 /opt/.honeypot
Можно добавить туда пару "интересных" файлов: passwords.txt, backup.tar.gz.
#!/bin/bash
WATCH_DIR="/opt/.honeypot"
LOG="/var/log/honeypot_access.log"
inotifywait -m -e access,modify,create,delete "$WATCH_DIR" --format '%T %w %f %e' --timefmt '%F %T' |
while read event; do
echo "[ALERT] $event" >> "$LOG"
echo "[ALERT] Honeypot accessed: $event"
# Можно добавить: уведомление в TG, systemd-notify и т.д.
done
Этот скрипт не завершится, пока не остановлен вручную - запускай как systemd-сервис или в screen/tmux.
BashTex
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6
Please open Telegram to view this post
VIEW IN TELEGRAM
😁13🔥5
Рекурсивная замена в файлах через sed без temp-файлов
Иногда нужно заменить строку или шаблон во всех файлах директории, но без создания временных файлов, лишнего мусора и *.bak. Обычно
▪️ Один-liner: заменить http:// на https:// во всех .conf файлах
-i делает замену на месте.
{} - текущий файл, + - запускает sed с пакетами файлов (быстрее, чем по одному).
❓ А если sed без -i (например, BSD/macOS)? Тогда делаем замену через perl:
Работает без временных файлов и .bak.
▪️ Хочешь dry-run? Добавь -print в find и убери -i:
▪️ Рекурсивная замена с маской и шаблоном
⭐️ Можно применять для:
📍 массовая правка конфигов;
📍 удаление старых ссылок;
📍 миграция путей или параметров;
📍 зачистка TODO/DEBUG в исходниках.
BashTex📱 #bash #utils
Иногда нужно заменить строку или шаблон во всех файлах директории, но без создания временных файлов, лишнего мусора и *.bak. Обычно
sed -i решает задачу, но как это сделать рекурсивно, да еще и аккуратно?
find . -type f -name "*.conf" -exec sed -i 's|http://|https://|g' {} +
-i делает замену на месте.
{} - текущий файл, + - запускает sed с пакетами файлов (быстрее, чем по одному).
find . -type f -name "*.conf" -exec perl -pi -e 's|http://|https://|g' {} +
Работает без временных файлов и .bak.
find . -type f -name "*.conf" -print -exec grep -H 'http://' {} \;
PATTERN="TODO"
REPLACE="Done"
find ./src -type f -name "*.txt" -exec sed -i "s/${PATTERN}/${REPLACE}/g" {} +
BashTex
Please open Telegram to view this post
VIEW IN TELEGRAM
👍11
Ротация логов с датой и размером: гибридный подход
Стандартные утилиты вроде
Создаем лог-файл вида: myapp_YYYYMMDD.log, и если он >100M - переименовываем с суффиксом _overflow.
🛠 Пример скрипта:
▪️ Где использовать? В cron, например:
В systemd timer для более точного контроля
🌟 В итоге получается, что скрипт не ждет полуночи - реагирует на объем, при этом логи всегда по дате и простой, не требует logrotate.conf
BashTex📱 #bash #utils
Стандартные утилиты вроде
logrotate умеют ротацию по времени или по размеру, но что если нужно оба условия? Например: хочешь сохранять логи по дате, но если они перевалили за 100 МБ - сразу ротация, не дожидаясь полночи.Создаем лог-файл вида: myapp_YYYYMMDD.log, и если он >100M - переименовываем с суффиксом _overflow.
#!/bin/bash
LOG_DIR="/var/log/myapp"
MAX_SIZE=$((100 * 1024 * 1024)) # 100 MB
TODAY=$(date +%Y%m%d)
LOG_FILE="${LOG_DIR}/myapp_${TODAY}.log"
mkdir -p "$LOG_DIR"
touch "$LOG_FILE"
# Проверка размера
if [[ -f "$LOG_FILE" ]]; then
FILE_SIZE=$(stat -c%s "$LOG_FILE")
if (( FILE_SIZE > MAX_SIZE )); then
TS=$(date +%H%M%S)
mv "$LOG_FILE" "${LOG_FILE%.log}_overflow_${TS}.log"
touch "$LOG_FILE"
echo "[INFO] Перемещен переполненный лог-файл: ${LOG_FILE%.log}_overflow_${TS}.log"
fi
fi
*/10 * * * * /usr/local/bin/rotate-mixed.sh
В systemd timer для более точного контроля
BashTex
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8