Please open Telegram to view this post
VIEW IN TELEGRAM
👍18😁5🫡1
Выполнение команд с ограничением по времени
Иногда нужно запустить команду, но ограничить её время выполнения. Например, если программа зависла или работает слишком долго. Для этого используется команда
▪️ Простой пример. Запустим команду sleep на 5 секунд, но прервём её через 2 секунды:
Через 2 секунды процесс будет завершён.
▪️ Прерывание долгих команд. Если вы хотите ограничить время выполнения скрипта:
Если скрипт не завершится за 10 секунд, timeout его принудительно остановит.
▪️ Игнорирование SIGTERM. Некоторые команды игнорируют сигнал SIGTERM. В таком случае можно использовать -k для отправки SIGKILL:
Сначала timeout подождёт 30 секунд, затем отправит SIGTERM.
Если процесс не завершится через 5 секунд, отправится SIGKILL.
▪️ Использование с ping. Ограничим ping 5 секундами:
Через 5 секунд ping остановится автоматически.
▪️ Вывод кода завершения
Если команда успела завершиться - timeout передаст её код возврата.
Если команда была принудительно остановлена - код возврата будет 124.
Проверим:
BashTex📱 #linux #utils
Иногда нужно запустить команду, но ограничить её время выполнения. Например, если программа зависла или работает слишком долго. Для этого используется команда
timeout.
timeout 2s sleep 5
Через 2 секунды процесс будет завершён.
timeout 10s ./долгий_скрипт.sh
Если скрипт не завершится за 10 секунд, timeout его принудительно остановит.
timeout -k 5s 30s ./непослушный_процесс
Сначала timeout подождёт 30 секунд, затем отправит SIGTERM.
Если процесс не завершится через 5 секунд, отправится SIGKILL.
timeout 5s ping 8.8.8.8
Через 5 секунд ping остановится автоматически.
Если команда успела завершиться - timeout передаст её код возврата.
Если команда была принудительно остановлена - код возврата будет 124.
Проверим:
timeout 2s sleep 5
echo $? # Выведет 124
BashTex
Please open Telegram to view this post
VIEW IN TELEGRAM
👍10🔥2
Сжатие логов в реальном времени
Логи быстро накапливаются и могут занимать гигабайты дискового пространства. Вместо того чтобы ждать ротации логов, можно сжимать их в реальном времени без потери данных, используя
1️⃣ Перехват логов и их сжатие на лету. Если процесс пишет логи в stdout, можно сразу сжимать их:
tee дублирует вывод в сжатый файл, при этом логи остаются видимыми в консоли.
Для zstd (он быстрее, чем gzip):
2️⃣ Сжатие логов nginx в реальном времени. Добавляем gzip в конфигурацию logrotate:
Логи будут сжиматься автоматически после ротации.
3️⃣ Прямая передача логов в сжатый файл. Если приложение пишет в файл, можно использовать именованный канал:
Логи идут в gzip, при этом процесс не знает, что его вывод сжимается.
4️⃣ Использование systemd-journald для сжатия. Если система использует journald, включаем сжатие в конфиге:
Затем перезапускаем службу:
Логи будут автоматически сжаты, освобождая место.
BashTex📱 #bash #utils
Логи быстро накапливаются и могут занимать гигабайты дискового пространства. Вместо того чтобы ждать ротации логов, можно сжимать их в реальном времени без потери данных, используя
gzip или zstd в связке с tee и systemd.
some_command 2>&1 | tee >(gzip -c > logs.gz)
tee дублирует вывод в сжатый файл, при этом логи остаются видимыми в консоли.
Для zstd (он быстрее, чем gzip):
some_command 2>&1 | tee >(zstd > logs.zst)
/var/log/nginx/*.log {
daily
rotate 7
compress
delaycompress
missingok
notifempty
}
Логи будут сжиматься автоматически после ротации.
mkfifo /tmp/logpipe
gzip -c < /tmp/logpipe > /var/log/app.log.gz &
some_command > /tmp/logpipe 2>&1
Логи идут в gzip, при этом процесс не знает, что его вывод сжимается.
[Journal]
Compress=yes
SystemMaxUse=500M
Затем перезапускаем службу:
systemctl restart systemd-journald
Логи будут автоматически сжаты, освобождая место.
BashTex
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8
Настройка удалённого аудита логов с rsyslog
1️⃣ Настройка сервера (приём логов). На сервере, который будет принимать логи, включаем поддержку удалённых сообщений:
Редактируем конфиг
UDP - быстрее, но ненадёжно.
TCP - более надёжно, но может вызывать задержки.
Перезапускаем rsyslog:
И не забываем открыть порт в firewalld или iptables:
2️⃣ Настройка клиента (отправка логов). На сервере-отправителе редактируем /etc/rsyslog.conf и добавляем в конец:
Где 192.168.1.100 - IP сервера сбора логов.
Перезапускаем rsyslog:
Проверяем отправку тестового сообщения:
3️⃣ Фильтрация и хранение логов. Можно настроить rsyslog на приём и сортировку логов по папкам:
Теперь логи будут храниться по серверам и сервисам в
4️⃣ Шифрование логов (TLS). Открытые логи могут содержать чувствительные данные. Для безопасной передачи можно включить TLS.
Добавляем в
И на клиенте:
➕ rsyslog позволяет собирать логи с разных серверов в одном месте.
➕ Можно использовать фильтрацию и сортировку логов по сервисам.
➕ Для безопасности передача логов может быть зашифрована через TLS.
BashTex📱 #linux #utils
rsyslog позволяет пересылать логи с серверов на удалённый лог-агрегатор, обеспечивая удобный аудит и хранение.Редактируем конфиг
/etc/rsyslog.conf. Добавляем:
# Разрешаем приём логов по TCP и UDP
$ModLoad imudp
$UDPServerRun 514
$ModLoad imtcp
$InputTCPServerRun 514
UDP - быстрее, но ненадёжно.
TCP - более надёжно, но может вызывать задержки.
Перезапускаем rsyslog:
systemctl restart rsyslog
И не забываем открыть порт в firewalld или iptables:
firewall-cmd --permanent --add-port=514/udp
firewall-cmd --permanent --add-port=514/tcp
firewall-cmd --reload
*.* @192.168.1.100:514 # Отправка по UDP
# *.* @@192.168.1.100:514 # Для TCP — две @
Где 192.168.1.100 - IP сервера сбора логов.
Перезапускаем rsyslog:
systemctl restart rsyslog
Проверяем отправку тестового сообщения:
logger "Тестовая запись в удалённые логи"
$template RemoteLogs,"/var/log/remote/%HOSTNAME%/%PROGRAMNAME%.log"
*.* ?RemoteLogs
& stop
Теперь логи будут храниться по серверам и сервисам в
/var/log/remote/.Добавляем в
/etc/rsyslog.conf на сервере:
$DefaultNetstreamDriverCAFile /etc/rsyslog.d/ca.pem
$DefaultNetstreamDriverCertFile /etc/rsyslog.d/server-cert.pem
$DefaultNetstreamDriverKeyFile /etc/rsyslog.d/server-key.pem
$ModLoad imtcp
$InputTCPServerStreamDriverMode 1
$InputTCPServerStreamDriverAuthMode anon
$InputTCPServerRun 6514
И на клиенте:
$DefaultNetstreamDriverCAFile /etc/rsyslog.d/ca.pem
$DefaultNetstreamDriverCertFile /etc/rsyslog.d/client-cert.pem
$DefaultNetstreamDriverKeyFile /etc/rsyslog.d/client-key.pem
*.* @@(overtls)192.168.1.100:6514
BashTex
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8
Создание собственных горячих клавиш в терминале
Хотите сделать работу в терминале удобнее и быстрее? Используйте
▪️ Простейший пример: привязываем Ctrl+T для вывода текущей даты и времени:
Теперь при нажатии Ctrl+T в терминале будет отображаться текущая дата
▪️ Практические примеры
1️⃣ Быстрое переключение между папками. Допустим, вы часто переходите в каталог /var/log. Назначим для этого Ctrl+L:
Теперь при нажатии Ctrl+L вас мгновенно перебросит в /var/log и покажет содержимое.
2️⃣ Очистка экрана командой Ctrl+K. Вместо ввода clear вручную:
3️⃣ Открытие htop на Ctrl+H. Мониторинг процессов без лишних команд:
4️⃣ Быстрый выход из терминала (Ctrl+Q). Чтобы не писать exit:
▪️ Как сохранить бинды навсегда? Добавьте их в ~/.bashrc и выполните:
Теперь ваши горячие клавиши будут работать при каждом запуске терминала.
BashTex📱 #bash #utils
Хотите сделать работу в терминале удобнее и быстрее? Используйте
bind -x для создания горячих клавиш, которые выполняют команды прямо в командной строке. Команда bind -x позволяет привязать сочетание клавиш к выполнению произвольного bash-скрипта.
bind -x '"\C-t": "echo $(date)"'
Теперь при нажатии Ctrl+T в терминале будет отображаться текущая дата
bind -x '"\C-l": "cd /var/log; ls"'
Теперь при нажатии Ctrl+L вас мгновенно перебросит в /var/log и покажет содержимое.
bind -x '"\C-k": "clear"'
bind -x '"\C-h": "htop"'
bind -x '"\C-q": "exit"'
source ~/.bashrc
Теперь ваши горячие клавиши будут работать при каждом запуске терминала.
BashTex
Please open Telegram to view this post
VIEW IN TELEGRAM
👍14
Please open Telegram to view this post
VIEW IN TELEGRAM
😁9🫡2
Настройка Failover-интерфейсов для отказоустойчивости сети
При сбое основного сетевого интерфейса система может автоматически переключаться на резервный интерфейс, обеспечивая бесперебойное сетевое соединение. Это особенно важно для серверов и критически важных сервисов.
Разберём, как настроить failover-интерфейсы в Linux с помощью bonding и keepalived.
▪️ Метод 1: Используем bonding. Он позволяет объединять два интерфейса в один логический и автоматически переключаться на рабочий при отказе основного.
1️⃣ Установите модуль bonding:
2️⃣ Настроим интерфейсы (пример для Ubuntu/Debian в /etc/netplan/01-netcfg.yaml):
Режим active-backup: Используется eth0, если он работает. Если eth0 выходит из строя, подключается eth1.
3️⃣ Применяем настройки:
Проверяем статус:
▪️ Метод 2: Используем keepalived для виртуального IP. Этот метод позволяет создать виртуальный IP (VIP), который будет переключаться между интерфейсами при отказе.
1️⃣ Установите keepalived:
2️⃣ Настроим keepalived (файл
3️⃣ Запускаем сервис:
Проверяем виртуальный IP:
▪️ Итоги:
bonding: объединяет интерфейсы в один и автоматически переключается между ними.
keepalived: создаёт виртуальный IP, который "переезжает" на другой интерфейс при отказе основного.
BashTex📱 #linux #networks
При сбое основного сетевого интерфейса система может автоматически переключаться на резервный интерфейс, обеспечивая бесперебойное сетевое соединение. Это особенно важно для серверов и критически важных сервисов.
Разберём, как настроить failover-интерфейсы в Linux с помощью bonding и keepalived.
sudo modprobe bonding
network:
version: 2
renderer: networkd
ethernets:
eth0:
dhcp4: no
eth1:
dhcp4: no
bonds:
bond0:
interfaces: [eth0, eth1]
parameters:
mode: active-backup
primary: eth0
Режим active-backup: Используется eth0, если он работает. Если eth0 выходит из строя, подключается eth1.
sudo netplan apply
Проверяем статус:
cat /proc/net/bonding/bond0
sudo apt install keepalived -y
/etc/keepalived/keepalived.conf):
vrrp_instance FAILOVER {
state MASTER
interface eth0
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass secret
}
virtual_ipaddress {
192.168.1.100/24
}
}
sudo systemctl enable --now keepalived
Проверяем виртуальный IP:
ip a show eth0
bonding: объединяет интерфейсы в один и автоматически переключается между ними.
keepalived: создаёт виртуальный IP, который "переезжает" на другой интерфейс при отказе основного.
BashTex
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8
Редактирование и повторный запуск команд из истории
Часто ли бывает, что нужно повторить или поправить команду из истории? Да. Вместо того чтобы пролистывать её через history, можно использовать
▪️ Открыть последнюю команду в редакторе (по умолчанию nano или vim):
После редактирования и сохранения команда будет выполнена
▪️ Выбрать команду по номеру (history показывает номера):
▪️ Повторить предыдущую команду без изменений:
▪️ Заменить аргумент в последней команде и выполнить её снова:
Пример:
▪️ Расширенные возможности
1️⃣ Просмотр истории команд с номерами
2️⃣ Фильтрация по последним N командам
3️⃣ Редактирование определённого диапазона команд
4️⃣ Выбрать редактор вручную
▪️ Почему fc удобнее history?
BashTex📱 #linux #utils
Часто ли бывает, что нужно повторить или поправить команду из истории? Да. Вместо того чтобы пролистывать её через history, можно использовать
fc. Команда fc (fix command) позволяет открыть последнюю команду в редакторе, изменить её и выполнить повторно.
fc
После редактирования и сохранения команда будет выполнена
fc 123
fc -s
fc -s old=new
Пример:
$ grep "error" log.txt
$ fc -s error=warning # Выполнится grep "warning" log.txt
fc -l
fc -l -10 # Вывести последние 10 команд
fc 100 105 # Открыть команды 100-105 в редакторе
FCEDIT=nano fc
Мгновенное редактирование и выполнение
Гибкость в выборе команд
Быстрое исправление ошибок без ручного ввода
BashTex
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7
Изменение приоритета процессов без их перезапуска
Когда система начинает тормозить из-за прожорливого процесса, многие просто убивают его (kill -9). Но что, если процесс важен и его нельзя останавливать? Решение -
Приоритет процессов в Linux измеряется в niceness - от -20 (наивысший приоритет) до 19 (наименьший).
Чем выше значение nice, тем меньше процессу достаётся CPU.
▪️ Как изменить приоритет процесса?
📍 Снизить приоритет процесса (уменьшить нагрузку на систему):
📍 Повысить приоритет процесса (ускорить выполнение):
📍 Изменить приоритет всех процессов пользователя:
📍 Изменить приоритет группы процессов (по GID):
▪️ Как узнать текущий приоритет?
Через ps:
Через top:
Запустите top, в колонке NI (Nice) будет указан приоритет.
▪️ Когда использовать renice?
BashTex📱 #linux #utils
Когда система начинает тормозить из-за прожорливого процесса, многие просто убивают его (kill -9). Но что, если процесс важен и его нельзя останавливать? Решение -
renice. Команда позволяет изменять приоритет процесса на лету, не перезапуская его.Приоритет процессов в Linux измеряется в niceness - от -20 (наивысший приоритет) до 19 (наименьший).
Чем выше значение nice, тем меньше процессу достаётся CPU.
sudo renice +10 -p 1234 # Процессу 1234 отдадут меньше CPU
sudo renice -5 -p 1234 # Процесс 1234 будет выполняться быстрее
sudo renice +5 -u username
sudo renice -10 -g 1001
Через ps:
ps -o pid,ni,cmd -p 1234
Через top:
Запустите top, в колонке NI (Nice) будет указан приоритет.
Если процесс нагружает процессор, но его нельзя останавливать (например, компиляция).
Если нужно ускорить важный процесс (например, срочный рендеринг).
Если фоновый процесс мешает работе, и его можно замедлить.
BashTex
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7
Оптимизация времени загрузки системы с systemd-analyze
Когда Linux загружается слишком долго, то сначала необходимо определить, какие службы тормозят процесс. Для этого в
1️⃣ Анализ общего времени загрузки
Вывод покажет время, затраченное на:
прошивку (firmware)
загрузчик (bootloader)
ядро (kernel)
службы systemd (userspace)
Пример вывода:
2️⃣ Поиск медленных сервисов
Этот список покажет службы, которые загружаются дольше всего:
Самый медленный - networkd-wait-online.service. Его можно отключить, если он не нужен:
3️⃣ Граф зависимостей сервисов. Чтобы увидеть все зависимости и их время загрузки, используйте:
Этот граф покажет какие службы блокируют запуск других.
📌 Если какая-то служба загружается слишком долго, её можно отключить или перевести в "ленивый" запуск:
4️⃣ Визуализация загрузки в SVG. Чтобы построить график загрузки системы, выполните:
Откройте boot.noscript в браузере - увидите наглядную диаграмму загрузки сервисов.
5️⃣ Ускорение загрузки с systemctl
Отключите ненужные службы
Включите параллельную загрузку. В файле
на
Затем примените изменения:
BashTex📱 #linux
Когда Linux загружается слишком долго, то сначала необходимо определить, какие службы тормозят процесс. Для этого в
systemd есть инструмент - systemd-analyze, который помогает выявить узкие места при старте системы.
systemd-analyze
Вывод покажет время, затраченное на:
прошивку (firmware)
загрузчик (bootloader)
ядро (kernel)
службы systemd (userspace)
Пример вывода:
Startup finished in 3.2s (kernel) + 5.1s (userspace) = 8.3s
systemd-analyze blame
Этот список покажет службы, которые загружаются дольше всего:
10.543s networkd-wait-online.service
3.213s apt-daily.service
1.145s snapd.service
Самый медленный - networkd-wait-online.service. Его можно отключить, если он не нужен:
sudo systemctl disable --now networkd-wait-online.service
systemd-analyze critical-chain
Этот граф покажет какие службы блокируют запуск других.
sudo systemctl disable имя_сервиса
sudo systemctl mask имя_сервиса
systemd-analyze plot > boot.noscript
Откройте boot.noscript в браузере - увидите наглядную диаграмму загрузки сервисов.
Отключите ненужные службы
sudo systemctl disable --now service_name
Включите параллельную загрузку. В файле
/etc/default/grub замените строку:
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash"
на
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash systemd.legacy_boot=false"
Затем примените изменения:
sudo update-grub
BashTex
Please open Telegram to view this post
VIEW IN TELEGRAM
👍17🔥4
Запись и воспроизведение сессий терминала
Если вам нужно показать работу команды в терминале, но скриншоты не передают всей динамики, попробуйте
В отличие от обычного видео, записи
▪️ Установка
📍 Запись терминальной сессии. Просто запустите:
Теперь всё, что вы вводите в терминале, записывается.
📌 Чтобы остановить запись: Ctrl + D или exit.
📌 После остановки asciinema предложит сохранить локально или загрузить в облако.
📂 Сохранение записи в файл:
▪️ Воспроизведение записи. Если запись сохранена в файл, проиграйте её так:
▪️ Публикация и расшаривание. Если нужно поделиться записью:
▪️ Запись с паузами между командами:
(это замедлит вывод, чтобы было комфортнее читать)
▪️ Конвертация записи в GIF-анимацию. Для этого можно использовать утилиту
BashTex📱 #linux #utils
Если вам нужно показать работу команды в терминале, но скриншоты не передают всей динамики, попробуйте
asciinema. Это инструмент для записи и воспроизведения терминальных сессий.В отличие от обычного видео, записи
asciinema:➕ занимают всего несколько килобайт➕ позволяют копировать команды прямо из записи➕ легко встраиваются в сайты и документацию
brew install asciinema -- MacOS
sudo apt install asciinema -- Ubuntu/Debian
sudo pacman -S asciinema -- Arch Linux
asciinema rec
Теперь всё, что вы вводите в терминале, записывается.
asciinema rec demo.cast
asciinema play demo.cast
asciinema upload demo.cast
asciinema rec -t 2
(это замедлит вывод, чтобы было комфортнее читать)
agg:
agg demo.cast demo.gif
BashTex
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7🔥4
Продвинутый cat с подсветкой кода
Если вы часто используете
🌟 Почему bat лучше cat?
⚙️ Установка
Windows:
▪️ Как использовать?
📍 Простая замена cat:
📍 Нумерация строк:
📍 Отображение различий с последним коммитом (если файл в git-репозитории):
📍 Использование как cat:
📍 Вывод с определённой темой оформления:
(Темы можно посмотреть через bat --list-themes)
📍 Интеграция с less и man. Сделать bat основным просмотрщиком для man:
Использовать bat с less:
bat - это альтернатива cat, которая делает работу с файлами удобнее. Отлично подходит для просмотра кода, конфигов и текстовых файлов.
BashTex📱 #linux #utils
Если вы часто используете
cat для просмотра файлов, попробуйте bat - улучшенную версию с подсветкой синтаксиса, номерами строк и встроенной пагинацией.Подсветка кода для более чем 500 языков
Номера строк прямо в выводе
Интеграция с git (показывает изменённые строки)
Встроенный пейджинг (автоматически передаёт вывод в less)
sudo pacman -S bat -- Arch Linux
brew install bat -- MacOS
sudo apt install bat -- Ubuntu/Debian
Windows:
scoop install bat
choco install bat
bat noscript.sh
bat -n myfile.txt
bat --diff myfile.py
bat --paging=never file.txt
bat --theme=Dracula config.yaml
(Темы можно посмотреть через bat --list-themes)
export MANPAGER="sh -c 'col -bx | bat -l man -p'"
Использовать bat с less:
export BAT_PAGER="less -RF"
bat - это альтернатива cat, которая делает работу с файлами удобнее. Отлично подходит для просмотра кода, конфигов и текстовых файлов.
BashTex
Please open Telegram to view this post
VIEW IN TELEGRAM
👍11
Please open Telegram to view this post
VIEW IN TELEGRAM
👍26😁7🤨1🗿1
Автоматическое переключение Wi-Fi на самый сильный сигнал
Если у вас несколько точек доступа с одним SSID, но система не переключается на точку с лучшим сигналом, можно автоматизировать этот процесс с помощью простого скрипта.
🌟 Как узнать текущий сигнал Wi-Fi?
Где wlan0 - имя вашего Wi-Fi-интерфейса.
Важен параметр Signal level, измеряется в dBm (чем ближе к 0, тем лучше).
📱 Автоматическое переключение Wi-Fi. Создадим скрипт
▪️ Как запустить скрипт в фоновом режиме?
1️⃣ Дать права на выполнение:
2️⃣ Запустить в фоне:
3️⃣ Добавить в автозапуск:
BashTex📱 #bash #utils
Если у вас несколько точек доступа с одним SSID, но система не переключается на точку с лучшим сигналом, можно автоматизировать этот процесс с помощью простого скрипта.
iwconfig wlan0 | grep -i --color signal
Где wlan0 - имя вашего Wi-Fi-интерфейса.
Важен параметр Signal level, измеряется в dBm (чем ближе к 0, тем лучше).
wifi-switch.sh, который будет мониторить сигнал и при необходимости переподключаться:
#!/bin/bash
INTERFACE="wlan0" # Название Wi-Fi интерфейса
SSID="HomeWiFi" # Имя вашей сети (SSID)
THRESHOLD=-70 # Порог переключения (в dBm)
while true; do
# Получаем текущий уровень сигнала
SIGNAL=$(iwconfig $INTERFACE | grep -i --color signal | awk '{print $4}' | cut -d '=' -f2)
# Если сигнал слабый, перезапускаем Wi-Fi
if [[ $SIGNAL -lt $THRESHOLD ]]; then
echo "Слабый сигнал ($SIGNAL dBm), переподключение..."
nmcli device wifi rescan
nmcli device disconnect $INTERFACE
nmcli device connect $INTERFACE
fi
sleep 10 # Проверяем каждые 10 секунд
done
chmod +x wifi-switch.sh
nohup ./wifi-switch.sh > /dev/null 2>&1 &
echo "@reboot /path/to/wifi-switch.sh" | crontab -
BashTex
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8🔥4
Чтение файлов в массив без cat
Часто при работе с файлами в Bash используют
🌟 Почему mapfile удобнее?
🌟 Как это работает? Допустим, у нас есть файл users.txt:
Теперь можно обращаться к строкам по индексам:
Первый пользователь: Vanya
Второй пользователь: Anna```
🌟 mapfile vs cat | while read. Обычный способ через while read ломает строки с пробелами:
Если строка "Vanya Ivanov",
🌟 Применение mapfile в реальных задачах
1️⃣ Удаление пустых строк из файла
2️⃣ Чтение вывода команды в массив
3️⃣ Чтение первых N строк
BashTex📱 #linux #utils
Часто при работе с файлами в Bash используют
cat и while read, но есть более элегантное решение - команда mapfile (она же readarray).Читает файл целиком в массив.
Избавляет от проблем с разбиением строк по пробелам.
Работает быстрее cat | while read.
Поддерживает фильтрацию и постобработку данных.
Vanya
Anna
Roman
Читаем его в массив одной командой:
```bash
mapfile -t users < users.txt
Теперь можно обращаться к строкам по индексам:
echo "Первый пользователь: ${users[0]}"
echo "Второй пользователь: ${users[1]}"
Первый пользователь: Vanya
Второй пользователь: Anna```
while read user; do
echo "$user"
done < users.txt
Если строка "Vanya Ivanov",
while read разобьёт её на "Vanya" и "Ivanov". А mapfile сохранит строку целиком.
mapfile -t lines < <(grep -v '^$' users.txt)
mapfile -t processes < <(ps aux)
mapfile -t -n 5 top_lines < users.txt
BashTex
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥15👍1
Интеграция Bash с Telegram для удалённого управления сервером
Хотите удалённо управлять сервером через телеграмм? С помощью простого bash-скрипта можно получать статусы, логи и даже перезагружать сервер прямо из чата.
🌟 Как это работает?
Для этого потребуется:
TG-бот + API-токен
curl или wget для отправки запросов
Скрипт на Bash
1️⃣ Создаём TG-бота
Открываем @BotFather.
Отправляем команду: /newbot.
Даем боту имя и получаем токен API.
Токен будет вида:
Сохраняем его.
2️⃣ Получаем свой Chat ID. Запросим ID нашего чата:
Ищем "chat":{"id":...} - это и есть наш Chat ID.
3️⃣ Отправка сообщений в телеграмм. Bash-скрипт для отправки сообщения:
Запускаем и получаем сообщение в TG.
4️⃣ Обработка команд. Теперь научим бота принимать команды.
Скрипт для проверки команд от пользователя:
Теперь отправляем
5️⃣ Автоматизация. Добавим этот скрипт в cron для регулярного выполнения:
Теперь бот сам проверяет новые сообщения и реагирует на команды.
🌟 Это базовая конфигурация с помощью которой можно значительно расширить управление сервером через телеграмм под свои конкретные потребности.
BashTex📱 #bash #utils
Хотите удалённо управлять сервером через телеграмм? С помощью простого bash-скрипта можно получать статусы, логи и даже перезагружать сервер прямо из чата.
Бот принимает команды от владельца.
Сервер обрабатывает запросы и отправляет ответ.
Ответ возвращается в телеграмм.
Для этого потребуется:
TG-бот + API-токен
curl или wget для отправки запросов
Скрипт на Bash
Открываем @BotFather.
Отправляем команду: /newbot.
Даем боту имя и получаем токен API.
Токен будет вида:
123456789:ABCdefGHIjklMNO123456xyz
Сохраняем его.
curl "https://api.telegram.org/bot<ТОКЕН>/getUpdates"
Ищем "chat":{"id":...} - это и есть наш Chat ID.
#!/bin/bash
TOKEN="123456789:ABCdefGHIjklMNO123456xyz"
CHAT_ID="123456789"
MESSAGE="Привет, сервер на связи!"
curl -s -X POST "https://api.telegram.org/bot$TOKEN/sendMessage" \
-d "chat_id=$CHAT_ID" \
-d "text=$MESSAGE"
Запускаем и получаем сообщение в TG.
Скрипт для проверки команд от пользователя:
#!/bin/bash
TOKEN="123456789:ABCdefGHIjklMNO123456xyz"
CHAT_ID="123456789"
URL="https://api.telegram.org/bot$TOKEN"
# Получаем последнее сообщение
UPDATE=$(curl -s "$URL/getUpdates")
LAST_MESSAGE=$(echo "$UPDATE" | grep -o '"text":"[^"]*' | cut -d':' -f2 | tr -d '"')
if [[ "$LAST_MESSAGE" == "/status" ]]; then
RESPONSE="Сервер работает!"
elif [[ "$LAST_MESSAGE" == "/uptime" ]]; then
RESPONSE=$(uptime)
elif [[ "$LAST_MESSAGE" == "/disk" ]]; then
RESPONSE=$(df -h | grep '/$')
else
RESPONSE="Неизвестная команда"
fi
# Отправляем ответ в TG
curl -s -X POST "$URL/sendMessage" -d "chat_id=$CHAT_ID" -d "text=$RESPONSE"
Теперь отправляем
/status, /uptime или /disk и получаем ответ!
*/1 * * * * /path/to/telegram_bot.sh
Теперь бот сам проверяет новые сообщения и реагирует на команды.
BashTex
Please open Telegram to view this post
VIEW IN TELEGRAM
👍21
Развёртывание Linux по сети с PXE
Когда нужно установить Linux на множество серверов или ПК без USB-флешек и дисков, на помощь приходит PXE (Preboot Execution Environment) - загрузка ОС по сети. PXE позволяет запустить установщик Linux прямо из сети, что особенно удобно в дата-центрах, офисах и лабораториях.
🌟 Как это работает?
🌟 Что нужно для развертывания PXE?
1️⃣ Устанавливаем нужные пакеты. На PXE-сервере установим DHCP, TFTP и Apache (для раздачи образов):
2️⃣ Настраиваем DHCP для PXE. Редактируем
Перезапускаем DHCP:
3️⃣ Настраиваем TFTP-сервер. Указываем папку для загрузки PXE-файлов в
Перезапускаем:
4️⃣ Загружаем PXELINUX. Скачиваем файлы для PXE:
Создаём каталог для меню:
5️⃣ Создаём загрузочное меню PXE. Создаём файл
6️⃣ Готовим установочные файлы. Загружаем образы на веб-сервер:
Перезапускаем Apache:
7️⃣ Запускаем установку по сети. Теперь включаем клиентский компьютер, в BIOS включаем PXE-загрузку и выбираем сетевой интерфейс в качестве загрузочного устройства.
Клиент загрузится и начнёт установку Linux прямо из сети.
BashTex📱 #linux #utils
Когда нужно установить Linux на множество серверов или ПК без USB-флешек и дисков, на помощь приходит PXE (Preboot Execution Environment) - загрузка ОС по сети. PXE позволяет запустить установщик Linux прямо из сети, что особенно удобно в дата-центрах, офисах и лабораториях.
Компьютер включается и запрашивает сетевой загрузчик по DHCP.
Сервер отвечает и передаёт загрузочный образ через TFTP.
Клиент загружает ядро Linux и переходит к установке системы.
DHCP-сервер (для раздачи PXE-загрузчика)
TFTP-сервер (для передачи загрузочных файлов)
HTTP/NFS-сервер (для хранения установочных файлов)
sudo apt update && sudo apt install isc-dhcp-server tftpd-hpa apache2
/etc/dhcp/dhcpd.conf:
subnet 192.168.1.0 netmask 255.255.255.0 {
range 192.168.1.100 192.168.1.200;
option routers 192.168.1.1;
next-server 192.168.1.10; # PXE-сервер
filename "pxelinux.0";
}
Перезапускаем DHCP:
sudo systemctl restart isc-dhcp-server
/etc/default/tftpd-hpa:
TFTP_DIRECTORY="/srv/tftp"
TFTP_OPTIONS="--secure"
Перезапускаем:
sudo systemctl restart tftpd-hpa
sudo mkdir -p /srv/tftp
cd /srv/tftp
sudo apt install syslinux pxelinux
sudo cp /usr/lib/PXELINUX/pxelinux.0 .
sudo cp /usr/lib/syslinux/modules/bios/* .
Создаём каталог для меню:
mkdir -p /srv/tftp/pxelinux.cfg
/srv/tftp/pxelinux.cfg/default:
DEFAULT menu.c32
PROMPT 0
TIMEOUT 100
ONTIMEOUT install
LABEL install
MENU LABEL Install Ubuntu 22.04
KERNEL ubuntu/vmlinuz
APPEND initrd=ubuntu/initrd.gz netboot=http://192.168.1.10/ubuntu/
sudo mkdir -p /var/www/html/ubuntu
cd /var/www/html/ubuntu
wget http://archive.ubuntu.com/ubuntu/dists/jammy/main/installer-amd64/current/images/netboot/netboot.tar.gz
tar -xzf netboot.tar.gz
Перезапускаем Apache:
sudo systemctl restart apache2
Клиент загрузится и начнёт установку Linux прямо из сети.
BashTex
Please open Telegram to view this post
VIEW IN TELEGRAM
👍26
Please open Telegram to view this post
VIEW IN TELEGRAM
😁37👍2🔥2
Cтраховка от неожиданных ошибок в скриптах
При написании скриптов важно не просто запускать команды, но и гарантировать их корректное выполнение. Без дополнительных опций Bash может пропустить ошибки и продолжить выполнение, что приведёт к неожиданным последствиям. Использование
❓ Что делает эта магическая строка?
Разберём на примерах.
🚫 Скрипт без set -euo pipefail (пропустит ошибки)
Итог: скрипт продолжает работать, даже если что-то пошло не так.
✔️ Скрипт с set -euo pipefail (контроль ошибок)
Итог: скрипт остановится сразу при первой же ошибке, не допуская некорректного выполнения.
⭐️ Где это особенно полезно?
❗️ Когда set -euo pipefail может мешать? Иногда ошибки могут быть ожидаемыми и не критичными.
Например, если файл может отсутствовать, но это не должно останавливать выполнение:
Или если команда в пайпе не всегда должна возвращать код 0:
BashTex📱 #linux #utils
При написании скриптов важно не просто запускать команды, но и гарантировать их корректное выполнение. Без дополнительных опций Bash может пропустить ошибки и продолжить выполнение, что приведёт к неожиданным последствиям. Использование
set -euo pipefail помогает защитить скрипты от ошибок и упростить отладку.
set -euo pipefail
-e (exit on error) — прерывает скрипт при ошибке любой команды (кроме в if, &&, ||).
-u (unset variables) — ошибка при попытке использовать неинициализированную переменную.
-o pipefail — ошибка в пайпах, если любая из команд завершится с ошибкой (обычно учитывается только последняя команда).
Разберём на примерах.
#!/bin/bash
echo "Начинаем работу..."
rm /несуществующий_файл # Ошибка, но скрипт продолжит работу
echo "Удалили файл (на самом деле нет)"
VAR=$(cat $UNKNOWN_VAR) # Неинициализированная переменная (ошибка, но не критично)
ls | grep myfile | awk '{print $1}' # Ошибка в grep или awk не остановит выполнение
echo "Скрипт завершён"
Итог: скрипт продолжает работать, даже если что-то пошло не так.
#!/bin/bash
set -euo pipefail
echo "Начинаем работу..."
rm /несуществующий_файл # Скрипт сразу прервётся из-за ошибки
echo "Удалили файл"
VAR=$(cat $UNKNOWN_VAR) # Ошибка: переменная не объявлена
ls | grep myfile | awk '{print $1}' # Ошибка в любой команде пайпа приведёт к остановке
echo "Скрипт завершён"
Итог: скрипт остановится сразу при первой же ошибке, не допуская некорректного выполнения.
Бэкап-скрипты (чтобы не создать пустой бэкап, если команда провалилась).
Скрипты развёртывания (чтобы не получить систему в непредсказуемом состоянии).
Автоматизация обновлений (чтобы обновление не зависло в неизвестном месте).
Например, если файл может отсутствовать, но это не должно останавливать выполнение:
rm myfile.txt || true # Явно игнорируем ошибку
Или если команда в пайпе не всегда должна возвращать код 0:
set +o pipefail # Отключаем pipefail временно
ls | grep myfile | awk '{print $1}'
set -o pipefail # Включаем обратно
BashTex
Please open Telegram to view this post
VIEW IN TELEGRAM
👍17🔥1
Ограничение ресурсов процессов прямо из терминала
В Linux каждый процесс потребляет ресурсы: память, количество открытых файлов, размер стека и прочее. Чтобы предотвратить вылет системы или несанкционированное потребление ресурсов, используется команда
🌟 Что такое ulimit?
🌟 Что можно ограничить? Команда
🌟 Часто используемые лимиты
▪️ Примеры использования
📍 Увеличить лимит открытых файлов:
📍 Ограничить процесс в использовании CPU временем:
(После 60 секунд использования CPU - процесс будет убит)
📍 Запретить создание файлов > 10 МБ:
▪️ Мягкие и жёсткие лимиты
Мягкий лимит - может быть изменён пользователем в рамках жёсткого
Жёсткий лимит - верхняя граница, меняется только от root
📍 Посмотреть:
📍 Установить:
📍 Постоянные настройки. Чтобы лимиты сохранялись после перезагрузки:
Убедитесь, что PAM обрабатывает лимиты:
Добавьте:
⭐️ Когда пригодится?
BashTex📱 #linux #utils
В Linux каждый процесс потребляет ресурсы: память, количество открытых файлов, размер стека и прочее. Чтобы предотвратить вылет системы или несанкционированное потребление ресурсов, используется команда
ulimit.ulimit - это встроенная команда оболочки, которая позволяет устанавливать ограничения на использование ресурсов для текущего сеанса оболочки и всех дочерних процессов.
ulimit -a покажет текущие лимиты:
ulimit -a
core file size (blocks, -c) 0
data seg size (kbytes, -d) unlimited
file size (blocks, -f) unlimited
open files (-n) 1024
max user processes (-u) 15635
Параметр Назначение
-n Количество открытых файлов (очень важно для веб-серверов и баз данных)
-u Кол-во пользовательских процессов
-f Максимальный размер создаваемого файла
-v Максимальный объём виртуальной памяти
-s Размер стека
-t Максимальное время CPU, сек
ulimit -n 65535
ulimit -t 60
(После 60 секунд использования CPU - процесс будет убит)
ulimit -f $((10 * 1024)) # 10 МБ в блоках по 1K
Мягкий лимит - может быть изменён пользователем в рамках жёсткого
Жёсткий лимит - верхняя граница, меняется только от root
ulimit -Sn # soft
ulimit -Hn # hard
ulimit -Sn 4096
ulimit -Hn 65535
/etc/security/limits.conf:
youruser hard nofile 65535
youruser soft nofile 65535
Убедитесь, что PAM обрабатывает лимиты:
/etc/pam.d/common-session
Добавьте:
session required pam_limits.so
Высоконагруженные сервисы (nginx, PostgreSQL, Elasticsearch)
CI/CD-сборки, которые могут упереться в лимит памяти или процессов
Безопасность: ограничение прав скриптов или сторонних процессов
BashTex
Please open Telegram to view this post
VIEW IN TELEGRAM
👍12🔥4
Настройка автообновления сертификатов Let’s Encrypt
Сертификаты Let’s Encrypt действуют всего 90 дней, и если забыть продлить - сайт покажет пользователю страшную ошибку о "небезопасном соединении". Обновлять сертификаты можно автоматически, и делается это за 5 минут.
1️⃣ Установка Certbot. Certbot - официальный клиент для работы с Let's Encrypt.
Для Ubuntu/Debian:
Для Apache:
2️⃣ Получение сертификата. Пример для Nginx:
Для Apache:
Certbot сам пропишет нужные директивы в конфиг веб-сервера и активирует HTTPS.
3️⃣ Проверка автоматического обновления. После установки certbot создает cron или systemd job, которая автоматически проверяет и обновляет сертификаты.
Проверить вручную:
Если тест успешен — автообновление работает.
4️⃣ Кастомный крон (если нужен). Если хочешь сделать всё под себя:
Обновление каждый день в 3:00 ночи. После обновления - перезагрузка веб-сервера, чтобы подхватить новый сертификат.
5️⃣ Обновление через hook (если веб-сервер кастомный)
Хук сработает только если сертификат реально обновился - не будет лишних рестартов.
🌟 Как узнать дату истечения сертификата?
BashTex📱 #linux #utils
Сертификаты Let’s Encrypt действуют всего 90 дней, и если забыть продлить - сайт покажет пользователю страшную ошибку о "небезопасном соединении". Обновлять сертификаты можно автоматически, и делается это за 5 минут.
Для Ubuntu/Debian:
sudo apt update
sudo apt install certbot python3-certbot-nginx # для Nginx
Для Apache:
sudo apt install certbot python3-certbot-apache
sudo certbot --nginx -d example.com -d www.bashtex.com
Для Apache:
sudo certbot --apache -d bashtex.com
Certbot сам пропишет нужные директивы в конфиг веб-сервера и активирует HTTPS.
Проверить вручную:
sudo certbot renew --dry-run
Если тест успешен — автообновление работает.
sudo crontab -e
Добавь строку:
```bash
0 3 * * * certbot renew --quiet && systemctl reload nginx
Обновление каждый день в 3:00 ночи. После обновления - перезагрузка веб-сервера, чтобы подхватить новый сертификат.
certbot renew --deploy-hook "systemctl reload myserver"
Хук сработает только если сертификат реально обновился - не будет лишних рестартов.
openssl x509 -in /etc/letsencrypt/live/example.com/fullchain.pem -noout -enddate
BashTex
Please open Telegram to view this post
VIEW IN TELEGRAM
👍17🔥2