uz
Feedback
BashTex | Linux

BashTex | Linux

Kanalga Telegram’da o‘tish

Авторский канал для тех, кто хочет глубже погрузиться в мир Linux. Подойдет для разработчиков, системных администраторов и DevOps Реклама: @dad_admin

Ko'proq ko'rsatish
2 524
Obunachilar
-224 soatlar
-67 kunlar
Ma'lumot yo'q30 kunlar
Postlar arxiv
Да что вы знаете о сложном выборе BashTex 📱 #юмор
Да что вы знаете о сложном выборе BashTex 📱 #юмор

Очистка репозитория от важных данных Если случайно закоммитили пароли, токены или большие файлы, просто удалить их из последнего коммита недостаточно - они останутся в истории 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 📱 #utils

🐍 QuizMix — Твой личный тренер по Python! 🔥 Прокачай скиллы с ежедневными вопросами по Python: от основ до хитрых нюансов!�
         🐍 QuizMix — Твой личный тренер по Python! 🔥 Прокачай скиллы с ежедневными вопросами по Python: от основ до хитрых нюансов!💡 Получай задание → Выбирай ответ → Узнавай детальный разбор с объяснениями «как и почему».📈            🚀 Ты готов пройти от новичка до гуру?              👉 Жми старт → @QuizMixPythonBot erid: 2W5zFGM7LyN

Как отслеживать изменения в файлах в реальном времени Если нужно отслеживать изменения в файлах или каталогах в реальном времени, 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 #utils

Отслеживание открытых файлов и портов в реальном времени Когда нужно выяснить, какие файлы, сокеты и устройства заняты процессами в системе, 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 #utils

Автоматическая очистка старых бэкапов Когда бэкапы копятся месяцами, место на диске неумолимо заканчивается. Сегодня рассмотрим процесс автоматизации процесса очистки старых резервных копий, чтобы всё важное сохранялось, а лишнее удалялось. ❓ Какую стратегию выбрать?
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 #utils

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 #utils

Динамическое ограничение ресурсов для процессов с 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 #utils

Ну мы BashTex 📱 #юмор
Ну мы BashTex 📱 #юмор

Вывод списка установленных пакетов по дате Хочешь узнать, какие пакеты и когда были установлены в системе? В 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 #utils

Ты бл#, ты сказал, что ты шаришь в этой теме.. BashTex 📱 #юмор

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 #utils

Вошли и вышли, приключение на 15 минут 🪞 BashTex 📱 #юмор
Вошли и вышли, приключение на 15 минут 🪞 BashTex 📱 #юмор

🚀Software Engineer C/C++ (LTE/GSM) в YADRO: получите оффер за 3 дня! Хотите создавать технологии, без которых не работают мо
🚀Software Engineer C/C++ (LTE/GSM) в YADRO: получите оффер за 3 дня! Хотите создавать технологии, без которых не работают мобильные сети?📡 В YADRO открыта вакансия Software Engineer C/C++, где вы будете разрабатывать протокольный стек LTE/GSM для базовых станций. Что предстоит делать? ✔️ Разрабатывать решения совместно с командой от этапа исследования и прототипирования до вывода в коммерческое использование ✔️ Разрабатывать ПО для базовых станций LTE ✔️ Реализовывать полный стек протокола 3GPP для станций Как получить оффер? 1️⃣ Оставить заявку до 9 марта 2️⃣ Пройти скрининг и техническое интервью 3️⃣ Получить оффер за 3 дня 📍 Формат работы: офис, гибрид или удалёнка (Москва, СПб, Нижний Новгород, Екатеринбург, Минск). 💡 В команде — инженеры с глубокой экспертизой и опытом 10+ лет в телеком-разработке. Присоединяйтесь к проекту, где сможете создавать системы, которыми будут пользоваться сотни тысяч людей! Подавайте заявку прямо сейчас — по ссылке.

Скрипт автоматического создания и удаления временных файлов Временные файлы нужны для логов, кэша и промежуточных вычислений, но если их не удалять – они засоряют систему. Сегодня про то, как автоматизировать их создание и удаление с помощью 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 #utils

Создание зашифрованных контейнеров с 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 #security

Автоматическое монтирование сетевых папок при загрузке системы Если вам нужно подключать сетевые папки автоматически при старте системы, лучше всего использовать /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 #utils

Подготовили список полезных инструментов для разработчиков, системных администраторов и DevOps спецов. Уверены, эти тулзы пом
Подготовили список полезных инструментов для разработчиков, системных администраторов и DevOps спецов. Уверены, эти тулзы помогут вам в работе. 🐱 🌚CodiumAI – автоматическая генерация тестов и поиск ошибок в коде. 🌚Mintlify – автоматическая генерация документации на основе кода. 🌚Ansible AI – автоматизация развертывания и управления серверами с помощью ИИ. 🌚RedSeal – анализ уязвимостей инфраструктуры и прогнозирование рисков. 🌚Datadog AI – анализ метрик и логов, выявление аномалий в инфраструктуре. 🌚Harness AI – автоматизация развертывания, управления инфраструктурой и CI/CD. Ссылки оставили в закрепе e·boot

Масштабируемое развертывание приложений с 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

Никаких Windows в этом доме! ❌ BashTex 📱 #юмор
Никаких Windows в этом доме! ❌ BashTex 📱 #юмор