BashTex | Linux
前往频道在 Telegram
Авторский канал для тех, кто хочет глубже погрузиться в мир Linux. Подойдет для разработчиков, системных администраторов и DevOps Реклама: @dad_admin
显示更多2 524
订阅者
-224 小时
-67 天
无数据30 天
帖子存档
2 524
Очистка репозитория от важных данных
Если случайно закоммитили пароли, токены или большие файлы, просто удалить их из последнего коммита недостаточно - они останутся в истории Git. Сегодня про то, как удалить следы своего косяка 🤒
Разберём два способа очистки истории репозитория:
1️⃣ git filter-branch – старый и медленный метод
2️⃣ BFG Repo-Cleaner – более современный и быстрый
🚮 Удаление данных с помощью git filter-branch
1️⃣ Удалить все следы файла config.yml из истории:
git filter-branch --force --index-filter \
"git rm --cached --ignore-unmatch config.yml" \
--prune-empty --tag-name-filter cat -- --all
2️⃣ Заменить текстовый секрет во всех коммитах:
git filter-branch --tree-filter \
'find . -type f -exec sed -i "s/OLD_SECRET/REDACTED/g" {} +' -- --all
❌ Минусы:
Очень медленно на больших репозиториях
Требует много оперативной памяти
Ошибки могут сломать историю
🚮 Используем BFG Repo-Cleaner (рекомендуемый способ)
1️⃣ Установите BFG:
wget https://repo1.maven.org/maven2/com/madgag/bfg/1.14.0/bfg-1.14.0.jar
2️⃣ Удалить файл config.yml из всех коммитов:
java -jar bfg-1.14.0.jar --delete-files config.yml
3️⃣ Очистить репозиторий от всех данных с API_KEY
java -jar bfg-1.14.0.jar --replace-text banned.txt
Файл banned.txt должен содержать список слов, которые нужно удалить.
▪️ Очистить файлы больше 50MB:
java -jar bfg-1.14.0.jar --strip-blobs-bigger-than 50M
4️⃣ Финальная зачистка и переписывание истории:
git reflog expire --expire=now --all && git gc --prune=now --aggressive
⤵️ Плюсы BFG:
В разы быстрее, чем filter-branch
Упрощённый синтаксис
Безопаснее для истории
BashTex 📱 #utils2 524
🐍 QuizMix — Твой личный тренер по Python!
🔥 Прокачай скиллы с ежедневными вопросами по Python: от основ до хитрых нюансов!💡 Получай задание → Выбирай ответ → Узнавай детальный разбор с объяснениями «как и почему».📈
🚀 Ты готов пройти от новичка до гуру?
👉 Жми старт → @QuizMixPythonBot
erid: 2W5zFGM7LyN
2 524
Как отслеживать изменения в файлах в реальном времени
Если нужно отслеживать изменения в файлах или каталогах в реальном времени, inotifywait - нужный инструмент.
🟢 Где полезно?
Мониторинг логов и конфигураций Обнаружение изменений в коде в dev-среде Автоматический перезапуск сервисов при изменении файлов Обнаружение нежелательных изменений (удаление файлов)⚙️ Базовое использование 1️⃣ Следить за изменениями в файле:
inotifywait -m /var/log/syslog
Флаг -m (monitor) заставляет команду работать в фоновом режиме.
2️⃣ Отслеживать изменения в каталоге:
inotifywait -m -e modify,create,delete /home/user/documents
Флаг -e указывает события, за которыми следим:
modify – изменение файла
create – создание нового файла
delete – удаление файла
3️⃣ Вывод событий в реальном времени:
inotifywait -m -r -e modify,create,delete /var/www/html
Флаг -r включает рекурсивный мониторинг всех вложенных папок.
⚙️ Применение в автоматизации
1️⃣ Автоперезапуск сервиса при изменении конфигурации
inotifywait -m -e modify /etc/nginx/nginx.conf | while read; do
systemctl restart nginx
done
Перезапускает Nginx, если конфигурация изменена.
2️⃣ Автоматическое архивирование изменённых файлов
inotifywait -m -e modify /home/user/data | while read file; do
cp "$file" "/backup/$(basename "$file").bak"
done
3️⃣ Обнаружение подозрительных изменений в /etc
inotifywait -m -r -e modify,delete /etc | while read change; do
echo "[ALERT] Изменение в /etc: $change" | mail -s "Файлы изменены!" admin@bashtex.com
done
BashTex 📱 #linux #utils2 524
Отслеживание открытых файлов и портов в реальном времени
Когда нужно выяснить, какие файлы, сокеты и устройства заняты процессами в системе,
lsof (list open files) приходит на помощь.
📌 Этот инструмент полезен для:
Диагностики зависших процессов Поиска утечек файловых дескрипторов Проверки какие порты и файлы использует приложение▪️ Быстрые примеры использования 1️⃣ Проверить, какие файлы использует процесс по PID
lsof -p 1234
2️⃣ Найти, кто использует файл
lsof /var/log/syslog
3️⃣ Какие процессы используют порт 443?
lsof -i :443
4️⃣ Найти процессы, использующие сеть
lsof -i
5️⃣ Обновлять вывод в реальном времени (-r)
lsof -r 2 -i :22
Выведет список процессов, использующих SSH-порт, обновляя данные каждые 2 секунды.
▪️ Применение для отладки и безопасности
1️⃣ Закрытый файл все еще используется? Если файл удалён, но место на диске не освободилось, ищем процессы, которые его держат:
lsof +L1
2️⃣ Поймать подозрительные соединения
lsof -i -nP | grep ESTABLISHED
Выведет все установленные сетевые соединения, без попытки разрешать IP в DNS.
3️⃣ Какие процессы пишут в лог?
lsof /var/log/auth.log
BashTex 📱 #linux #utils2 524
Автоматическая очистка старых бэкапов
Когда бэкапы копятся месяцами, место на диске неумолимо заканчивается. Сегодня рассмотрим процесс автоматизации процесса очистки старых резервных копий, чтобы всё важное сохранялось, а лишнее удалялось.
❓ Какую стратегию выбрать?
FIFO (First In, First Out) - удаление самых старых файлов GFS (Grandfather-Father-Son) - оставляем дневные, недельные, месячные По размеру диска - чистим, если занято > 80%Я использую FIFO - удаление самых старых файлов, какую выбрать Вам - зависит от вас и конкретной задачи. ▪️ Удаляем файлы старше 7 дней в /backups/
find /backups/ -type f -name "*.tar.gz" -mtime +7 -exec rm {} \;
▪️ Удаляем, если свободного места < 20%
if [[ $(df /backups --output=pcent | tail -1 | tr -d '% ') -gt 80 ]]; then
find /backups/ -type f -name "*.tar.gz" -mtime +3 -exec rm {} \;
fi
▪️ Оставляем 3 последние копии
ls -t /backups/*.tar.gz | tail -n +4 | xargs rm -f
▪️ Добавим выполнение скрипта раз в день:
0 2 * * * /usr/local/bin/cleanup_backups.sh
Не забудьте перед этим сделать cleanup_backups.sh исполняемым:
chmod +x cleanup_backups.sh
BashTex 📱 #bash #utils2 524
disown и nohup - выполнение команд после выхода из терминала
А вы знали как сделать, чтобы команды не зависели от сессии и продолжали работать даже после выхода? Для этого можно использовать
disown и nohup.
▪️ nohup - команда живёт даже после выхода. nohup позволяет запустить процесс, который не завершится, даже если вы выйдете из системы.
Пример: Запускаем длительный процесс и отправляем в фон
nohup long-running-script.sh > output.log 2>&1 &
Процесс не привязан к терминалу
Вывод пишется в output.log
Можно закрыть терминал, процесс не остановится
▪️ disown - открепление процесса от сессии. Если уже запустили команду без nohup, но хотите её сохранить:
1️⃣ Запускаем процесс в фоне
long-running-script.sh &
2️⃣ Просматриваем фоновые задачи
jobs -l
3️⃣ Открепляем процесс
disown -h %1
Теперь даже если вы выйдете из терминала, процесс останется работать.
📌 Разница между nohup и disown
Команда Когда использовать Что делает?
nohup - необходимо использовать при запуске процесса. В таком случае это делает процесс независимым
disown - работает для уже запущенных команд Открепляет процесс от сессии
🔥 Комбо: Можно использовать nohup + disown, чтобы запущенный процесс не зависел от терминала и не получал SIGHUP.
nohup ./script.sh & disown
Теперь можно спокойно выйти из SSH, процесс продолжит работать.
BashTex 📱 #linux #utils2 524
Динамическое ограничение ресурсов для процессов с cgroups
Когда процесс начинает пожирать всю CPU или RAM, система может начать тормозить. 🐢 Но есть способ держать всё под контролем -
cgroups.
📌 cgroups (Control Groups) — механизм ядра Linux, который позволяет ограничивать, учитывать и изолировать ресурсы (CPU, RAM, сеть) для процессов.
Применение:
Ограничение потребления ресурсов процессами Контроль за службами и контейнерами Создание "огороженных" сред для тестирования⚙️ Простая настройка cgroups 1️⃣ Проверяем поддержку cgroups:
mount | grep cgroup
Если вывод есть - поддержка включена
2️⃣ Создаём группу и ограничиваем процесс. Создадим новую группу и ограничим процесс по CPU и RAM:
sudo mkdir /sys/fs/cgroup/mygroup
echo $$ | sudo tee /sys/fs/cgroup/mygroup/cgroup.procs
echo 50000 | sudo tee /sys/fs/cgroup/mygroup/cpu.max
echo 100M | sudo tee /sys/fs/cgroup/mygroup/memory.max
cgroup.procs - добавляем текущий процесс
cpu.max - ограничение CPU
memory.max - ограничение RAM
🔢 Применение на практике. Допустим, у тебя есть скрипт, который загружает процессор:
while :; do :; done
Чтобы он не съел всю систему, запускаем его в cgroups:
echo $$ > /sys/fs/cgroup/mygroup/cgroup.procs
Теперь процесс работает в ограниченной среде и не забивает ресурсы.
👀 Мониторинг нагрузки. Можно проверить использование CPU и памяти группой:
cat /sys/fs/cgroup/mygroup/cpu.stat
cat /sys/fs/cgroup/mygroup/memory.current
BashTex 📱 #bash #utils2 524
Вывод списка установленных пакетов по дате
Хочешь узнать, какие пакеты и когда были установлены в системе? В Ubuntu это можно сделать с помощью
dpkg и awk.
✅ Базовый способ. Чтобы получить список всех установленных пакетов с датой их установки, используй:
grep " install " /var/log/dpkg.log
Этот лог содержит записи о каждом установленном или обновлённом пакете.
🗯 Вывод с сортировкой. Если нужен полный список с датами и сортировкой:
awk '$3 == "install" {print $1, $2}' /var/log/dpkg.log | sort
$1 - дата установки
$2 - имя пакета
sort упорядочивает по дате
Пример вывода:
2025-03-01 coreutils
2025-03-02 openssh-server
2025-03-04 htop
📌 Фильтр по определённому дню. Допустим, надо узнать, что было установлено 3 февраля 2025 года:
grep "2025-02-03" /var/log/dpkg.log | grep "install"
📂 Вывод списка недавно установленных пакетов
zgrep " install " /var/log/dpkg.log* | tail -20
BashTex 📱 #bash #utils2 524
stdbuf - отключение буферизации вывода в командах
Когда выполняешь команды в терминале, их вывод иногда задерживается из-за буферизации. Это мешает при логировании, мониторинге в реальном времени и пайпах.
stdbuf решает эту проблему, управляя буферизацией стандартного ввода, вывода и ошибок.
🚪 Как отключить буферизацию? Запустим ping, но без задержек в выводе:
stdbuf -oL ping 8.8.8.8
-oL - отключает буферизацию вывода (line-buffered mode). Теперь каждая строка появляется сразу.
❌ Для ошибок (stderr):
stdbuf -eL some_command
👀 Использование с пайпами. Некоторые команды задерживают вывод в пайпах. Например, grep в цепочке:
ping 8.8.8.8 | grep "time="
Ничего не показывает? Это из-за буферизации! Исправляем:
ping 8.8.8.8 | stdbuf -oL grep "time="
⚡️ Полезные примеры
1️⃣ Логирование в реальном времени
stdbuf -oL tail -f /var/log/syslog | grep "error"
2️⃣ Скрипт без задержек в выводе
#!/bin/bash
stdbuf -o0 my_script.sh
-o0 полностью отключает буферизацию.
3️⃣ Буферизация при вводе
stdbuf -i0 -o0 -e0 cat
Позволяет мгновенно обрабатывать ввод/вывод.
BashTex 📱 #bash #utils2 524
🚀Software Engineer C/C++ (LTE/GSM) в YADRO: получите оффер за 3 дня!
Хотите создавать технологии, без которых не работают мобильные сети?📡
В YADRO открыта вакансия Software Engineer C/C++, где вы будете разрабатывать протокольный стек LTE/GSM для базовых станций.
Что предстоит делать?
✔️ Разрабатывать решения совместно с командой от этапа исследования и прототипирования до вывода в коммерческое использование
✔️ Разрабатывать ПО для базовых станций LTE
✔️ Реализовывать полный стек протокола 3GPP для станций
Как получить оффер?
1️⃣ Оставить заявку до 9 марта
2️⃣ Пройти скрининг и техническое интервью
3️⃣ Получить оффер за 3 дня
📍 Формат работы: офис, гибрид или удалёнка (Москва, СПб, Нижний Новгород, Екатеринбург, Минск).
💡 В команде — инженеры с глубокой экспертизой и опытом 10+ лет в телеком-разработке.
Присоединяйтесь к проекту, где сможете создавать системы, которыми будут пользоваться сотни тысяч людей!
Подавайте заявку прямо сейчас — по ссылке.
2 524
Скрипт автоматического создания и удаления временных файлов
Временные файлы нужны для логов, кэша и промежуточных вычислений, но если их не удалять – они засоряют систему. Сегодня про то, как автоматизировать их создание и удаление с помощью Bash и
mktemp.
➕ Создание временных файлов и директорий. Используем mktemp:
TEMP_FILE=$(mktemp)
echo "Временный файл: $TEMP_FILE"
Или создаем временную папку:
TEMP_DIR=$(mktemp -d)
echo "Временная папка: $TEMP_DIR"
📂 Автоматическое удаление. trap удалит временные файлы при завершении скрипта:
#!/bin/bash
TEMP_FILE=$(mktemp)
trap "rm -f $TEMP_FILE" EXIT
echo "Создан временный файл: $TEMP_FILE"
sleep 5 # Эмуляция работы скрипта
trap выполняет rm -f $TEMP_FILE при завершении скрипта – даже если он аварийно прерван.
👩🎨 Скрипт для очистки старых временных файлов. Удалим файлы старше 1 дня в /tmp:
find /tmp -type f -mtime +1 -delete
Для папок:
find /tmp -type d -empty -mtime +1 -exec rmdir {} \;
🤖 Добавим в crontab ежедневную очистку /tmp:
0 3 * * * find /tmp -type f -mtime +1 -delete
В 3 часа ночи старые временные файлы будут автоматически удаляться.
BashTex 📱 #bash #utils2 524
Создание зашифрованных контейнеров с cryptsetup и LUKS
LUKS (Linux Unified Key Setup) + cryptsetup позволяют создавать зашифрованные контейнеры, доступ к которым можно получить только после ввода пароля.
📦 Что можно хранить в зашифрованном контейнере?
🔹 Личные файлы и документы
🔹 Бэкапы с конфиденциальными данными
🔹 Временные файлы, которые нужно удалять без следов
🧑💻 Создание зашифрованного контейнера
1️⃣ Создаем файл-контейнер. Допустим, нам нужен контейнер размером 1 ГБ:
dd if=/dev/zero of=secure.img bs=1M count=1024
2️⃣ Настраиваем LUKS-шифрование
cryptsetup luksFormat secure.img
⚠️ Важно: Этот шаг удалит все данные в файле!
При появлении запроса укажите сложный пароль для доступа к контейнеру.
3️⃣ Открываем зашифрованный контейнер
cryptsetup luksOpen secure.img secure_container
Теперь в системе появился виртуальный шифрованный диск /dev/mapper/secure_container.
4️⃣ Форматируем в файловую систему
mkfs.ext4 /dev/mapper/secure_container
5️⃣ Монтируем и используем
mkdir /mnt/secure
mount /dev/mapper/secure_container /mnt/secure
Теперь файлы, скопированные в /mnt/secure, будут автоматически зашифрованы.
🚫 Отключение контейнера. Чтобы отключить зашифрованный диск:
umount /mnt/secure
cryptsetup luksClose secure_container
🏠 Автоматическое подключение по паролю. Можно хранить ключ для автоматического подключения в файле:
dd if=/dev/random of=/root/luks.key bs=1 count=256
chmod 600 /root/luks.key
cryptsetup luksAddKey secure.img /root/luks.key
Теперь можно открыть контейнер без ввода пароля:
cryptsetup luksOpen secure.img secure_container --key-file /root/luks.key
BashTex 📱 #linux #security2 524
Автоматическое монтирование сетевых папок при загрузке системы
Если вам нужно подключать сетевые папки автоматически при старте системы, лучше всего использовать /etc/fstab или systemd automount. Разберем оба способа.
1️⃣ Использование /etc/fstab. Добавьте строку в
/etc/fstab, чтобы система монтировала папку при загрузке:
//192.168.1.100/share /mnt/share cifs username=user,password=pass,iocharset=utf8,_netdev 0 0
//192.168.1.100/share - путь к папке на сервере /mnt/share - локальная точка монтирования cifs - используемый протокол (для Windows/Samba) _netdev - монтирование после установки сети⚠️ После изменения /etc/fstab примените команду:
mount -a
2️⃣ Автоматическое монтирование через systemd. Создайте юнит /etc/systemd/system/mnt-share.mount:
[Unit]
Description=Автоматическое монтирование сетевой папки
After=network-online.target
[Mount]
What=//192.168.1.100/share
Where=/mnt/share
Type=cifs
Options=username=user,password=pass,iocharset=utf8
[Install]
WantedBy=multi-user.target
Затем включите монтирование:
systemctl daemon-reload
systemctl enable --now mnt-share.mount
💡 Какой способ выбрать?
fstab - если подключение постоянно и предсказуемо
systemd - если нужна гибкость и управление через systemctl
BashTex 📱 #linux #utils2 524
Подготовили список полезных инструментов для разработчиков, системных администраторов и DevOps спецов. Уверены, эти тулзы помогут вам в работе. 🐱
🌚CodiumAI – автоматическая генерация тестов и поиск ошибок в коде.
🌚Mintlify – автоматическая генерация документации на основе кода.
🌚Ansible AI – автоматизация развертывания и управления серверами с помощью ИИ.
🌚RedSeal – анализ уязвимостей инфраструктуры и прогнозирование рисков.
🌚Datadog AI – анализ метрик и логов, выявление аномалий в инфраструктуре.
🌚Harness AI – автоматизация развертывания, управления инфраструктурой и CI/CD.
Ссылки оставили в закрепе e·boot
2 524
Масштабируемое развертывание приложений с Bash и Docker
😎 Основная идея:
Проверять текущую загрузку CPU/памяти
Автоматически запускать дополнительные контейнеры при высокой нагрузке
Останавливать лишние контейнеры при снижении нагрузки
▪️ Bash-скрипт для масштабирования
#!/bin/bash
APP_NAME="myapp"
IMAGE="myapp_image"
LIMIT=70 # Порог загрузки CPU в процентах
MAX_CONTAINERS=5
# Получаем текущую загрузку CPU
CPU_LOAD=$(awk '{print $1}' <(grep 'cpu ' /proc/stat | awk '{print ($2+$4)*100/($2+$4+$5)}'))
# Получаем текущее количество запущенных контейнеров
RUNNING_CONTAINERS=$(docker ps -q -f "name=$APP_NAME" | wc -l)
if (( $(echo "$CPU_LOAD > $LIMIT" | bc -l) )); then
if (( RUNNING_CONTAINERS < MAX_CONTAINERS )); then
echo "Высокая нагрузка ($CPU_LOAD%). Запускаем новый контейнер..."
docker run -d --name "$APP_NAME-$RUNNING_CONTAINERS" $IMAGE
else
echo "Достигнут лимит контейнеров ($MAX_CONTAINERS)."
fi
else
if (( RUNNING_CONTAINERS > 1 )); then
STOP_CONTAINER=$(docker ps -q -f "name=$APP_NAME" | tail -n 1)
echo "Нагрузка низкая ($CPU_LOAD%). Останавливаем контейнер $STOP_CONTAINER..."
docker stop $STOP_CONTAINER && docker rm $STOP_CONTAINER
fi
fi
⚙️ Как использовать?
1. Сохраните скрипт, например, как autoscale.sh
2. Сделайте его исполняемым:
chmod +x autoscale.sh
3. Настройте запуск через cron (например, каждые 5 минут):
crontab -e
Добавьте строку:
*/5 * * * * /path/to/autoscale.sh >> /var/log/autoscale.log 2>&1
🏳️ Что получаем:
При нагрузке выше 70% добавляются контейнеры
При снижении нагрузки контейнеры удаляются
Управление происходит автоматически
BashTex 📱 #bash
现已上线!2025 年 Telegram 研究 — 年度关键洞察 
