ar
Feedback
BashTex | Linux

BashTex | Linux

الذهاب إلى القناة على Telegram

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

إظهار المزيد
2 524
المشتركون
لا توجد بيانات24 ساعات
-67 أيام
+230 أيام
أرشيف المشاركات
Открыл книгу, а закрыть не получается.. BashTex 📱 #юмор
Открыл книгу, а закрыть не получается.. BashTex 📱 #юмор

Встраивание мини-HTTP-сервера на netcat + bash (для локальных API) Иногда хочется быстро поднять легковесный API без Nginx/Apache, чтобы протестировать интеграцию или выдавать системные данные в JSON. Для этого достаточно bash + netcat.
Общая идея такова: 📍netcat слушает порт (например, 8080); 📍bash скрипт парсит запрос и отвечает заголовками + данными; 📍результат можно использовать для локальных API-запросов (например, мониторинг).
🛠 Минимальный пример

#!/bin/bash
PORT=8080

while true; do
  # Принимаем одно соединение
  { 
    # Читаем первую строку HTTP-запроса
    read request
    echo ">>> $request"

    # Отправляем HTTP-ответ
    echo -e "HTTP/1.1 200 OK\r"
    echo -e "Content-Type: application/json\r"
    echo -e "\r"
    echo -e '{"status": "ok", "time": "'$(date +%T)'"}'
  } | nc -l -p $PORT -q 1
done
▪️ Запуск

chmod +x mini-http.sh
./mini-http.sh
Теперь можно открыть в браузере: http://localhost:8080 ▪️ Возможности 📍отдавать системные метрики:

echo -e '{"load": "'$(uptime | awk "{print \$10}")'"}'
📍простой healthcheck для Docker: curl localhost:8080/health 📍мини-API для локальных скриптов (например, статус бэкапа). Такой подход позволяет собрать сверхлегкий REST-like API прямо из bash - без сторонних веб-фреймворков. BashTex 📱 #bash #utils

⚡️ На Stepik вышел курс по Linux Внутри 20+ модулей: от установки Linux и работы с файлами до сетей, прав, дисков, процессов, автоматизации на Bash и многого другого. Всё сразу закрепляется на практике (200+ заданий с автопроверкой). Материал подаётся понятным языком, шаг за шагом, на реальных примерах и с наглядными схемами. После прохождения вы получите сертификат, который можно добавить в резюме. Есть бесплатные демо-уроки для ознакомления. В ближайшие 48ч курс доступен со скидкой 20% по промокоду «LINUX_ADMIN»: открыть курс на Stepik

Использование coproc для работы с асинхронными потоками Многие знают про & и wait, но есть куда более элегантный инструмент для асинхронной работы - coproc. Это встроенная команда, которая запускает процесс в фоне и автоматически подключает к нему двусторонний канал (pipe).
Как это работает coproc создает процесс, у которого: stdin доступен через дескриптор ${COPROC[1]} (запись в процесс); stdout доступен через ${COPROC[0]} (чтение из процесса); имя coproc можно задавать, чтобы управлять несколькими одновременно.
▪️ Простейший пример

#!/bin/bash

# Запускаем фоновый bc как "асинхронный калькулятор"
coproc CALC { bc -l; }

# Отправляем в stdin команды
echo "2+3" >&"${CALC[1]}"
echo "s(1)" >&"${CALC[1]}"

# Читаем ответы из stdout
read -u "${CALC[0]}" result1
read -u "${CALC[0]}" result2

echo "Результат 1: $result1"
echo "Результат 2: $result2"
Процесс bc живет, пока вы его не закроете. То есть можно посылать команды и читать ответы несколько раз. ▪️ Практические кейсы 📍 Асинхронные задачи с обратной связью. Можно запускать ping, tcpdump или tail -f в coproc, а потом считывать поток строк построчно:

coproc PINGER { ping -O 8.8.8.8; }
while read -ru "${PINGER[0]}" line; do
    echo "PING: $line"
done
📍 Фоновый обработчик. Например, пишем строки в процессинг-скрипт:

coproc HANDLER { while read line; do echo ">> $line"; done; }
echo "Hello" >&"${HANDLER[1]}"
echo "World" >&"${HANDLER[1]}"
📍 Несколько процессов. Coproc можно называть:

coproc P1 { ping -c2 8.8.8.8; }
coproc P2 { ping -c2 1.1.1.1; }
▪️ Подводные камни Каналы буферизуются, иногда нужно sleep или stdbuf -oL для построчной работы. Закрывайте дескрипторы exec {fd}>&-, иначе процесс может висеть. coproc работает только в bash ≥ 4.
BashTex 📱 #bash #utils

👩‍💻 LinuxCamp — канал системного разработчика, который поможет тебе освоить Linux и DevOps на профессиональном уровне! — Ун
+4
👩‍💻 LinuxCamp — канал системного разработчика, который поможет тебе освоить Linux и DevOps на профессиональном уровне! — Уникальные гайды по администрированию Linux Продвинутые техники и рекомендации по работе в Bash Подробные статьи о внутреннем устройстве операционных систем Подписывайся: @linuxcamp_tg

Скрипт для массового обновления SSH-ключей пользователей на кластере Когда у вас десятки серверов и несколько пользователей, ручное обновление ~/.ssh/authorized_keys превращается в кошмар. Чтобы централизованно обновить ключи (например, при ротации), скрипт может взять все под контроль.
Наш скрипт будет: 📍Хранить эталонные ключи пользователей в центральном репозитории (например, /srv/ssh-keys/ или в Git). 📍Проходить по списку хостов и обновлять authorized_keys. 📍Логировать успехи и ошибки.
🛠 Пример скрипта

#!/bin/bash

HOSTS="hosts.txt"        # список серверов: один hostname/ip на строку
USERS="users.txt"        # список пользователей: один user на строку
KEYDIR="/srv/ssh-keys"   # где лежат эталонные ключи (user.pub)
LOGFILE="ssh_update.log"

while read -r host; do
  echo "[*] Обновляем ключи на $host"
  for user in $(cat "$USERS"); do
    keyfile="$KEYDIR/$user.pub"
    if [[ -f "$keyfile" ]]; then
      ssh "$host" "mkdir -p /home/$user/.ssh && \
                   chmod 700 /home/$user/.ssh && \
                   cat > /home/$user/.ssh/authorized_keys && \
                   chmod 600 /home/$user/.ssh/authorized_keys && \
                   chown -R $user:$user /home/$user/.ssh" \
      < "$keyfile"

      if [[ $? -eq 0 ]]; then
        echo "$(date '+%F %T') OK $user@$host" >> "$LOGFILE"
      else
        echo "$(date '+%F %T') FAIL $user@$host" >> "$LOGFILE"
      fi
    else
      echo "Нет ключа для $user"
    fi
  done
done < "$HOSTS"
▪️ Что делает скрипт 📍перебирает все хосты из hosts.txt; 📍для каждого пользователя заливает новый authorized_keys; 📍выставляет правильные права (700 для .ssh, 600 для ключа); 📍пишет лог успешных и неудачных обновлений. BashTex 📱 #bash

Бесплатный урок по Apache Kafka⭐️ Учим работать с реальными исходными данными, а не на теоретических примерах. ✅Расскажем про
Бесплатный урок по Apache Kafka⭐️ Учим работать с реальными исходными данными, а не на теоретических примерах. ✅Расскажем про язык Кафки: топики, партиции, продюсеры-консьюмеры, кластер, ноды.  ✅Рассмотрим: как работают очереди сообщений, сколько должно быть консьюмеров для эффективной вычитки, как повысить надёжность кластера с помощью репликации данных. ✅Покажем, как развернуть кластер Кафки на своём ПК с 3 нодами, schema-registry и авторизацией. Обычно в инструкциях кластер из 1 ноды, зукипера и 1 брокера, но это не наш путь, смотрим сразу на практике. Забрать урок👉🏻 в боте

Автоматическое формирование changelog из git-истории Любой проект со временем обрастает десятками коммитов. Но превращать историю git log в читаемый changelog руками - занятие неблагодарное. Bash и git позволяют автоматизировать это в пару строк. 🛠 Базовый скрипт

#!/bin/bash
# gen-changelog.sh

OUTFILE="CHANGELOG.md"

{
  echo "# Changelog"
  echo

  # Перебираем теги в обратном порядке
  for tag in $(git tag --sort=-creatordate); do
    prev=$(git describe --tags --abbrev=0 "$tag"^ 2>/dev/null || echo "")
    echo "## $tag"
    echo

    if [[ -n "$prev" ]]; then
      range="$prev..$tag"
    else
      range="$tag"
    fi

    git log --pretty=format:"- %s (%an)" "$range"
    echo -e "\n"
  done
} > "$OUTFILE"

echo "Changelog обновлен: $OUTFILE"
▪️ Пример вывода

# Changelog

## v2.2.0
- Добавлены новые баги (Ivan)
- Исправлен баг с путями (Anna)

## v2.1.0
- Рефакторинг логики загрузки (Ivan)
- Улучшена работа с сетью (Petr)
▪️ Можно также добавить: 📍добавить дату релиза: --date=short --pretty=format:"- %s (%an, %ad)"; 📍разделить по типам коммитов (feat, fix, docs) с помощью grep; 📍генерировать changelog только для новых коммитов с последнего релиза. BashTex 📱 #bash

Одновременный запуск команд на нескольких хостах Иногда нужно быстро выполнить одну и ту же команду на нескольких серверах. Удобные тулзы для этого есть (например, pssh, ansible), но что если хочется сделать это в чистом bash, без сторонних зависимостей? Попробуем реализовать, основная идея такова: 📍список хостов хранится в текстовом файле; 📍скрипт пробегает по ним циклом и запускает команду через ssh; 📍чтобы все шло параллельно - используем background (&) и ограничитель числа потоков. 🛠 Пример скрипта

#!/bin/bash
# parallel-ssh.sh
# Одновременное выполнение команд на хостах

HOSTFILE="hosts.txt"
CMD="$*"
MAX_PARALLEL=5   # ограничение параллельных подключений

if [[ -z "$CMD" ]]; then
    echo "Использование: $0 'команда для выполнения'"
    exit 1
fi

sem=0
while read -r host; do
    [[ -z "$host" || "$host" =~ ^# ]] && continue

    {
        echo ">>> [$host]"
        ssh -o BatchMode=yes -o ConnectTimeout=5 "$host" "$CMD" 2>&1 | sed "s/^/[$host] /"
    } &

    ((sem++))
    if (( sem >= MAX_PARALLEL )); then
        wait -n
        ((sem--))
    fi
done < "$HOSTFILE"

wait
▪️ Пример hosts.txt

server1
192.168.1.12
192.168.1.15
▪️ Запуск

./parallel-ssh.sh "uptime"
Вывод будет помечен [host], чтобы не путались строки. BashTex 📱 #bash

🐧 BashTex 📱 #юмор

Создание оффлайн инсталлятора из .deb зависимостей Иногда сервер или рабочая машина не имеет прямого доступа в интернет. Но поставить нужный софт все же нужно. Решение: собрать локальный оффлайн инсталлятор из уже установленных пакетов и их зависимостей. ▪️ Установка dpkg-repack. На машине с интернетом:

sudo apt install dpkg-repack
▪️ Репак пакета в .deb. Если пакет уже стоит в системе:

dpkg-repack htop
# создаст htop_3.0.5-1_amd64.deb
▪️ Репак с зависимостями. Чтобы вытащить пакет + его зависимости:

mkdir offline-installer && cd offline-installer

# пример для nginx
for pkg in $(apt-cache depends --recurse --no-recommends --no-suggests \
             --no-conflicts --no-breaks --no-replaces --no-enhances \
             nginx | grep "^\w"); do
    dpkg-repack "$pkg"
done
▪️ Итог - "папка-инсталлятор". В каталоге будут все нужные .deb:

ls *.deb
nginx_1.24.0-1_amd64.deb
libpcre3_2:8.39-13_amd64.deb
libssl1.1_1.1.1n-0+deb11u5_amd64.deb
...
▪️ Установка на оффлайн серваке. Переносим папку, потом:

sudo dpkg -i *.deb
sudo apt -f install   # подтянет зависимости из локальных .deb
Можно превратить папку в локальный APT-репозиторий:

dpkg-scanpackages . /dev/null | gzip -9c > Packages.gz
и подключить его через sources.list. BashTex 📱 #bash #utils

Хотите получить оффер за 5 дней и стать частью YADRO? ➡️ Присоединяйтесь к команде информационной безопасности! 1️⃣ Оставьте
Хотите получить оффер за 5 дней и стать частью YADRO? ➡️ Присоединяйтесь к команде информационной безопасности! 1️⃣ Оставьте заявку до 28 сентября и пройдите HR-скрининг 2️⃣ Пройдите техническое и менеджерское интервью 3️⃣ Получите оффер за 5 дней О команде: В YADRO специалисты по безопасности интегрируют защиту во все процессы — от разработки и CI/CD до инфраструктуры и телеком-решений. Инженеры исследуют новые векторы атак, выявляют уязвимости и внедряют практики SSDLC и DevSecOps, чтобы продукты были надежными и устойчивыми к угрозам. Направления, которым вы нужны: 🚀 Application Security: анализ кода, моделирование угроз, PoC решений 🚀 DevSecOps: проектирование безопасной архитектуры CI/CD, автоматизация процессов, внедрение security-инструментов 💙 Станьте частью масштабных проектов YADRO и внесите свой вклад в создание безопасных технологий будущего!

Бинарные флаги и побитовые операции Bash - не только про строки. В нtм легко использовать побитовую арифметику (&, |, ^, ~, <<, >>) для управления флагами, что бывает полезно в админских скриптах. ▪️ Базовая логика. Каждый бит числа можно трактовать как флаг (0 - выключено, 1 - включено):

FLAG_READ=1      # 0001
FLAG_WRITE=2     # 0010
FLAG_EXEC=4      # 0100
FLAG_DELETE=8    # 1000
▪️ Установка флага (OR |)

rights=0
rights=$(( rights | FLAG_READ | FLAG_WRITE ))
echo $rights   # 3 (0001 + 0010 = 0011)
▪️ Проверка флага (AND &)

if (( rights & FLAG_WRITE )); then
    echo "Есть право записи"
fi
▪️ Сброс флага (AND + NOT &~)

rights=$(( rights & ~FLAG_READ ))
echo $rights   # теперь без read
▪️ Инверсия (XOR ^)

rights=$(( rights ^ FLAG_EXEC ))  # переключение: если был - уберется, если не был - включится
▪️ Практические кейсы 1️⃣ Система разрешений в скриптах. Можно задавать доступ к операциям через биты вместо кучи if:

if (( user_flags & FLAG_DELETE )); then
    rm "$file"
fi
2️⃣ Упаковка нескольких состояний в одно число. Например, код статуса сервиса:

STATUS_RUNNING=1
STATUS_RESTARTING=2
STATUS_FAILED=4

status=$(( STATUS_RUNNING | STATUS_RESTARTING ))

(( status & STATUS_FAILED )) && echo "Ошибка!"
3️⃣ Быстрые флаги для CLI-опций

OPT_VERBOSE=1
OPT_DRYRUN=2
OPT_FORCE=4

opts=0
[[ $1 == "-v" ]] && opts=$(( opts | OPT_VERBOSE ))
[[ $1 == "-f" ]] && opts=$(( opts | OPT_FORCE ))

(( opts & OPT_VERBOSE )) && echo "[VERBOSE MODE]"
4️⃣ Флаги как компактная замена массивов. Вместо массива enabled_features=(...) можно хранить все в одной переменной. Это особенно ценно при передаче значений между процессами. BashTex 📱 #bash #utils

🔫🔫🔫 день, а это означает, что пора поздравлять вас с днём программиста! Желаю вам, чтобы Ваша зп росла быстрее, чем количе
🔫🔫🔫 день, а это означает, что пора поздравлять вас с днём программиста! Желаю вам, чтобы Ваша зп росла быстрее, чем количество тасок. И пусть в жизни, как в коде, всегда находится правильный алгоритм! 🔫 BashTex 📱

Однострочники: меньше кода - быстрее результат. Часть 2 Продолжение верхнего поста, но с более харкорными фишками. 1️⃣ Параллельное выполнение задач

seq 1 10 | xargs -n1 -P4 bash -c 'echo "Job $0"; sleep 2'
Выполняет 4 задачи одновременно, распределяя их по входным данным. 2️⃣ Автосоздание многоуровневых JSON из списка

awk -F= '{gsub(/ /,"",$1); printf "\"%s\":\"%s\",\n",$1,$2}' vars.txt | sed '$ s/,$//; 1s/^/{/; $s/$/}/'
Превращает key=value в JSON-структуру без jq. 3️⃣ Замена текста в пачке файлов с сохранением даты

grep -rl "oldtext" . | xargs -I{} touch -r {} {}.ts && \
grep -rl "oldtext" . | xargs sed -i 's/oldtext/newtext/g' && \
for f in *.ts; do touch -r "$f" "${f%.ts}"; rm "$f"; done
Меняет текст, но оставляет оригинальные метки времени. 4️⃣ Потоковая упаковка только изменённых файлов

find /src -type f -newermt "2025-09-12" -print0 | tar --null -T - -czf patch.tar.gz
Создает архив только с файлами новее указанной даты. 5️⃣ «Ловля» пакетов через tcpdump с фильтром и автопарсингом

tcpdump -l -i eth0 "tcp port 80" | stdbuf -oL awk '/Host:/{print $2}'
В реальном времени выводит посещаемые хосты. 6️⃣ Горячее редактирование конфигов на удаленке

ssh user@server "sed -i '/^#MaxAuthTries/s/^#//' /etc/ssh/sshd_config && systemctl restart sshd"
Меняет параметр в конфиге и перезапускает сервис без SCP. 7️⃣ Наблюдение за PID и его автокилл

while pidof myproc >/dev/null; do sleep 1; done && echo "Process died"
Ждет завершения процесса и реагирует. 8️⃣ Объединение нескольких логов в один с отметкой источника

tail -F app1.log | sed 's/^/[APP1] /' & \
tail -F app2.log | sed 's/^/[APP2] /' & wait
В реальном времени сливает логи с пометками. 9️⃣ Лайв-диагностика сети с графиком

ping -i 0.2 8.8.8.8 | awk -F'=' '/time=/{print $NF}' | gnuplot -p -e "plot '<cat' with lines"
Пинг с живой отрисовкой графика без промежуточных файлов. 1️⃣0️⃣ «Самообновляющийся» скрипт

curl -s https://bashtex.com/myscript.sh -o "$0" && exec bash "$0" "$@"
Обновляет себя и перезапускается. BashTex 📱 #bash

Хочешь изучать DevOps? Но не знаешь где взять информацию и четкий план? 💪 Тогда лови бесплатный мета-курс Devops Roadmap - э
Хочешь изучать DevOps? Но не знаешь где взять информацию и четкий план? 💪 Тогда лови бесплатный мета-курс Devops Roadmap - это расширенный чек-лист, который поможет вам сориентироваться в мире DevOps и стать крутым спецом. 👀 В мета-курсе перечислены все основные разделы и навыки, которыми должен обладать DevOps инженер: от Linux до программирования. ✔️А еще он будет полезен при подготовке к собеседованиям. 👽 Кстати, бонусом крутой канал о девопс. Там тоже самые свежие IT-новости, полезные советы от DevOps-инженера с 20-летним стажем, эксклюзивные материалы, релизы топовых инструментов, обзоры вакансий и личный взгляд на девопс-сферу.

Однострочники: меньше кода - быстрее результат Bash прекрасен тем, что может решить массу задач буквально одной строкой. Подборка полезных шаблонов, которые легко адаптировать под себя. 1️⃣ Быстрый поиск файла по имени

find / -type f -name "*.log" 2>/dev/null
Ищет .log файлы в системе, игнорируя ошибки доступа. 2️⃣ Топ-10 самых больших файлов

du -ah /path | sort -rh | head -n 10
Показывает, что занимает место. 3️⃣ Проверка доступности сайта

curl -Is https://bashtex.com | head -n1
Отдаёт HTTP-статус (200 OK, 404 Not Found и т.д.). 4️⃣ Массовое переименование файлов

for f in *.txt; do mv "$f" "${f%.txt}.bak"; done
Меняет расширение .txt на .bak у всех файлов в папке. 5️⃣ Замер времени выполнения команды

time tar -czf backup.tar.gz /data
Показывает, сколько заняла команда. 6️⃣ Быстрый бэкап с датой

tar -czf backup-$(date +%F).tar.gz /path/to/dir
Файл будет называться backup-2025-09-11.tar.gz. 7️⃣ Мониторинг нагрузки в реальном времени

watch -n 1 "df -h / && free -m"
Каждую секунду показывает дисковое и RAM-состояние. 8️⃣ Удаление файлов старше N дней

find /tmp -type f -mtime +7 -delete
Чистит /tmp от старых файлов. 9️⃣ Загрузка и распаковка архива

curl -L https://site.ru/file.tar.gz | tar -xz
Скачивает и сразу распаковывает. 1️⃣0️⃣ Поиск текста в файлах

grep -R "ERROR" /var/log/
Находит все упоминания ERROR в логах. BashTex 📱 #bash

Когда я установлю Linux, я никому не скажу, но знаки будут BashTex 📱 #юмор
Когда я установлю Linux, я никому не скажу, но знаки будут BashTex 📱 #юмор

⚡️ RECURA — один из лучших каналов для разработчиков и программистов. Канал ведёт практикующий DevOps-инженер, который ежедне
⚡️ RECURA — один из лучших каналов для разработчиков и программистов. Канал ведёт практикующий DevOps-инженер, который ежедневно публикует: • код, повышающий эффективность разработкилайфхаки и полезные трюки для Bash и Linuxготовые решения для Docker и Kubernetesинструменты и утилиты для автоматизации полезные материалы и советы по информационной безопасности Подпишись, чтобы быть востребованным специалистом.

Автонастройка нового сервера по шаблону Один скрипт - и свежий VPS готов к работе. Скрипт будет: 📍Создать нового пользователя с sudo; 📍Настраивать SSH-ключи и запрещать парольный вход; 📍Отключать root-доступ; 📍Настраивать базовый firewall (ufw); 📍Обновлять пакеты 🛠 Сам скрипт:

#!/bin/bash
set -e

# --- Конфиг ---
NEW_USER="deploy"
SSH_KEY_URL="https://bashtex.com/id_rsa.pub"
ALLOW_PORTS=(22 80 443)
TIMEZONE="Europe/Moscow"

# --- 1. Обновление системы ---
apt update && apt upgrade -y

# --- 2. Создание пользователя ---
if ! id "$NEW_USER" &>/dev/null; then
    adduser --disabled-password --gecos "" "$NEW_USER"
    usermod -aG sudo "$NEW_USER"
fi

# --- 3. Установка SSH-ключа ---
mkdir -p /home/$NEW_USER/.ssh
curl -fsSL "$SSH_KEY_URL" -o /home/$NEW_USER/.ssh/authorized_keys
chmod 700 /home/$NEW_USER/.ssh
chmod 600 /home/$NEW_USER/.ssh/authorized_keys
chown -R $NEW_USER:$NEW_USER /home/$NEW_USER/.ssh

# --- 4. Настройка SSH ---
sed -i 's/^#\?PermitRootLogin .*/PermitRootLogin no/' /etc/ssh/sshd_config
sed -i 's/^#\?PasswordAuthentication .*/PasswordAuthentication no/' /etc/ssh/sshd_config
systemctl restart sshd

# --- 5. Настройка UFW ---
apt install -y ufw
ufw default deny incoming
ufw default allow outgoing
for port in "${ALLOW_PORTS[@]}"; do
    ufw allow "$port"
done
ufw --force enable

# --- 6. Часовой пояс ---
timedatectl set-timezone "$TIMEZONE"

echo "[OK] Сервер настроен!"
▪️ Как использовать. Скопировать скрипт на новый сервер:

scp setup_server.sh root@IP:/root/
Запустить:

ssh root@IP 'bash /root/setup_server.sh'
Готово. Теперь можно заходить по SSH ключом под $NEW_USER. BashTex 📱 #bash