jq: парсинг JSON в терминале

jq — фильтр для JSON прямо в bash. Незаменим при работе с API, конфигами и логами. # достать поле echo '{"name":"alice","age":30}' | jq '.name' # из массива — все элементы cat data.json | jq '.users[]' # фильтр: только активные пользователи cat data.json | jq '.users[] | select(.active == true)' # выбрать только поля name и email cat data.json | jq '.users[] | {name, email}' map() применяет выражение к каждому элементу массива: # увеличить все цены на 10% jq '.items | map(.price * 1.1)' catalog.json # получить список имён как bash-массив mapfile -t names < <(jq -r '.users[].name' data.json) -r убирает кавычки из строк — удобно для дальнейшей передачи в bash. ...

10 июня 2026 г. · llexa

systemd таймеры вместо cron

Таймеры systemd — это .timer + .service пара. Логи через journalctl, зависимости через Requires=, пропущенные запуски — через Persistent=true. # /etc/systemd/system/backup.timer [Unit] Description=Daily backup [Timer] OnCalendar=*-*-* 03:00:00 Persistent=true [Install] WantedBy=timers.target # /etc/systemd/system/backup.service [Unit] Description=Backup job [Service] ExecStart=/usr/local/bin/backup.sh systemctl enable --now backup.timer systemctl list-timers # все активные таймеры + следующий запуск journalctl -u backup.service # логи Persistent=true — если система была выключена в момент запуска, таймер сработает при следующем старте. В cron такого нет. ...

10 июня 2026 г. · llexa

Архиваторы #3: 7z и сравнение форматов

7z умеет почти всё: создавать, распаковывать, тестировать и листить архивы любых форматов. # создать архив 7z a archive.7z ./dir/ # распаковать (сохраняет структуру) 7z x archive.7z # просмотр содержимого 7z l archive.7z # проверить целостность 7z t archive.7z Сравнение форматов при сжатии папки ~500 МБ: Формат Команда Степень Скорость 7z 7z a -mx=9 ★★★★★ ★★☆☆☆ xz tar -cJf ★★★★★ ★☆☆☆☆ zst tar -I 'zstd -19' ★★★★☆ ★★★★☆ gz tar -czf ★★★☆☆ ★★★★☆ zip zip -r ★★☆☆☆ ★★★★★ Для бэкапов — zst. Максимальная компрессия — 7z/xz. Windows-совместимость — zip. ...

10 июня 2026 г. · llexa

openssl в командной строке

Проверить сертификат, TLS-рукопожатие или срок истечения — openssl делает это без браузера. # TLS-рукопожатие и цепочка сертификатов openssl s_client -connect example.com:443 -servername example.com </dev/null # информация о сертификате из файла openssl x509 -in cert.pem -noout -text # дата истечения openssl x509 -in cert.pem -noout -dates Проверить, не истекает ли сертификат в течение 30 дней (exit 1 = истекает): openssl x509 -in cert.pem -noout -checkend 2592000 && echo OK || echo "EXPIRES SOON" # проверить удалённо echo | openssl s_client -connect example.com:443 2>/dev/null | \ openssl x509 -noout -enddate # проверка цепочки доверия openssl verify -CAfile /etc/ssl/certs/ca-certificates.crt cert.pem Удобно добавить в cron — заранее узнаёшь об истекающих сертификатах. ...

9 июня 2026 г. · llexa

systemd: пишем свой .service с нуля

Любой скрипт или приложение можно превратить в systemd-сервис за пять минут. # /etc/systemd/system/myapp.service [Unit] Description=My Application After=network.target [Service] Type=simple ExecStart=/usr/local/bin/myapp --config /etc/myapp.conf ExecStop=/bin/kill -TERM $MAINPID Restart=on-failure RestartSec=5 User=myapp [Install] WantedBy=multi-user.target Основные значения Type=: simple — не форкается; forking — демон в фон; oneshot — запуск и выход (cron-стиль). systemctl daemon-reload systemctl enable --now myapp systemctl status myapp journalctl -u myapp -f Restart=on-failure — перезапуск при ненулевом exit-коде. Restart=always — всегда, кроме явного stop. RestartSec — пауза перед перезапуском. ...

9 июня 2026 г. · llexa

tcpdump: захват трафика на сервере

Самый быстрый способ понять, что происходит в сети — tcpdump прямо на сервере. # слушать на всех интерфейсах, без резолва имён tcpdump -i any -n # только HTTP (порт 80) от конкретного хоста tcpdump -i eth0 -n host 192.168.1.10 and port 80 # захватить 100 пакетов и выйти tcpdump -i any -n -c 100 BPF-фильтры: host, net, port, src, dst, логика and/or/not. # всё кроме SSH tcpdump -i any not port 22 # захват в файл для анализа позже tcpdump -i eth0 -w /tmp/capture.pcap # прочитать файл tcpdump -r /tmp/capture.pcap -n Pipe в Wireshark с удалённого сервера: ...

9 июня 2026 г. · llexa

DNS: unbound, dog и DOH/DOT

DNS можно резолвить быстрее, приватнее и с нормальным выводом. # установить unbound apt install unbound systemctl enable --now unbound # проверить резолвинг dig @127.0.0.1 example.com dog — современная замена dig с цветным выводом: apt install dog dog example.com dog example.com MX dog @8.8.8.8 example.com AAAA DOT (DNS over TLS) и DOH (DNS over HTTPS) шифруют запросы. В unbound включить DOT: forward-zone: name: "." forward-tls-upstream: yes forward-addr: 1.1.1.1@853 forward-addr: 9.9.9.9@853 После systemctl restart unbound — трафик на 53 снаружи не виден. Проверить: dog @127.0.0.1 example.com должен отвечать с кешем. ...

8 июня 2026 г. · llexa

Proxmox: HA cluster без потери VM

Если узел падает — VM автоматически поднимается на соседнем. # на первом узле pvecm create mycluster # на втором и третьем pvecm add 192.168.1.10 # проверить кворум pvecm status Минимум три узла: при двух кворум не набрать после отказа одного. Fencing настраивается через IPMI/iLO — без него кластер не запустит миграцию (split-brain). Добавить VM в HA: ha-manager add vm:101 ha-manager set vm:101 --state started ha-manager status ha-manager сам решает, куда переселить VM. Принудительная миграция: qm migrate 101 pve2 --online. ...

8 июня 2026 г. · llexa

sed и awk: однострочники на каждый день

Не скрипты — команды, которые уже сейчас в истории bash. # заменить во всех .conf sed -i 's/old/new/g' /etc/nginx/*.conf # удалить пустые строки sed '/^$/d' file.txt # вывести IP из access.log awk '{print $1}' /var/log/nginx/access.log | sort | uniq -c | sort -rn | head # извлечь поле по разделителю awk -F: '{print $1}' /etc/passwd # сумма столбца awk '{sum += $5} END {print sum}' report.txt sed -i меняет файл на месте — сделай бэкап или сначала проверь без -i. awk -F задаёт разделитель; END — блок после всех строк. Для сложных замен с группами: sed 's/\(foo\)\(bar\)/\2\1/'. ...

8 июня 2026 г. · llexa

Цикл дежурного sysadmin'а

Воспроизводится каждую пятницу в 23:47. ┌─────────────────────────────────┐ ↓ │ Тихо │ ↓ │ Алерт в 23:47 │ ↓ │ SSH. Паника. Логи. │ ↓ │ Само починилось │ ↓ │ «Надо задокументировать» │ ↓ │ Никто не задокументировал ────────┘ Причина неизвестна. Мониторинг молчит. До следующей пятницы. #linux #sysadmin #юмор #bash #devops

7 июня 2026 г. · llexa