Bash Days | Linux | DevOps
Авторский блог от действующего девопса Самобытно про разработку, devops, linux, скрипты, сисадминство, техдирство и за айтишную жизу. Автор: Роман Шубин Реклама: @maxgrue MAX: https://max.ru/bashdays Курс: @tormozilla_bot Блог: https://bashdays.ru
Show more📈 Analytical overview of Telegram channel Bash Days | Linux | DevOps
Channel Bash Days | Linux | DevOps (@bashdays) in the Russian language segment is an active participant. Currently, the community unites 23 744 subscribers, ranking 5 638 in the Technologies & Applications category and 27 972 in the Russia region.
📊 Audience metrics and dynamics
Since its creation on невідомо, the project has demonstrated rapid growth, gathering an audience of 23 744 subscribers.
According to the latest data from 04 July, 2026, the channel demonstrates stable activity. Although there has been a change in the number of participants by -144 over the last 30 days and by 7 over the last 24 hours, overall reach remains high.
- Verification status: Not verified
- Engagement rate (ER): The average audience engagement rate is 25.26%. Within the first 24 hours after publication, content typically collects 12.90% reactions from the total number of subscribers.
- Post reach: On average, each post receives 5 998 views. Within the first day, a publication typically gains 3 062 views.
- Reactions and interaction: The audience actively supports content: the average number of reactions per post is 30.
- Thematic interests: Content is focused on key topics such as bashdays, linux, bash, docker, скрипт.
📝 Description and content policy
The author describes the resource as a platform for expressing subjective opinions:
“Авторский блог от действующего девопса
Самобытно про разработку, devops, linux, скрипты, сисадминство, техдирство и за айтишную жизу.
Автор: Роман Шубин
Реклама: @maxgrue
MAX: https://max.ru/bashdays
Курс: @tormozilla_bot
Блог: https://bashdays.r...”
Thanks to the high frequency of updates (latest data received on 05 July, 2026), the channel maintains relevance and a high level of publication reach. Analytics show that the audience actively interacts with content, making it an important point of influence in the Technologies & Applications category.
Если официальный мануал по компиляции писала жопорукая обезьяна, тут уже ничего с этим не поделаешь.Залил в себя пару пиалок до-хун-пао, словил дзен и нашел выход. Пиздуем на сайт и ищем ZED. Ебала жаба гадюку! Всё уже придумано и собрано за нас. Верните мне 4 часа компиляции! Открываем CMD и хуячим:
scoop bucket add extras
scoop install extras/zed
Всё!
Если не установлен scoop, ставим так:
Set-ExecutionPolicy RemoteSigned -Scope CurrentUser
irm get.scoop.sh | iex
Что по IDE?
Моё почтение, все нужные мне плагины по девопсовым делам — есть. Даже маркдаун и превью работает. Шикарно!
Из коробки есть подключение к удаленным серверам. То есть подключаешься к своему удаленному серверу разработки и пишешь код. В лучших традициях VSCode.
Чтобы по умолчанию в качестве терминала у тебя не открывался CMD, делаем финт ушами и дружим ZED с WSL.
"terminal": {
"shell": {
"program": "C:\\Windows\\System32\\wsl.exe"
},
"font_family": "Hack Nerd Font Mono",
"font_size": 15,
"line_height": "standard"
}
Теперь открывается ZSH, или что там у тебя установлено в WSL.
Ааа, забыл, в ZED можно подключить ИИ агенты, причем можешь локально поднять дипсик или т.п. и использовать его прям в IDE.Больше добавить пока нечего, всё нравится. Буду тыкать, а там уже посмотрим. 🛠 #windows #ide #dev — ✅ @bashdays ✅ @linuxfactory ✅ @blog
➡️ что такое резервное копирование и аварийное восстановление; ➡️ в чем между ними разница и когда они нужны; ➡️ как использовать облако для непрерывности данных; ➡️ как еще можно защитить вашу информацию.А еще в прямом эфире эксперты проведут демо: настроят резервное копирование и аварийное восстановление в облаке. Зарегистрироваться 👈
curl я заебался.
ㅤ
Тем более хотелось что-то организованное и визуально приятное.
Postman сразу мимо, это гавно сделали настолько перегруженным, что им пользоваться уже нереально, да и под чистым терминалом его не запустишь.
Выбор пал на Posting. Это TUI клиент со всем необходимым функционалом.
Так он и прижился, сейчас если что-то нужно отладить или потестить у меня есть эта замечательная тулза. Не перегружена хуйнёй и дружелюбная. Есть все самое необходимое, даже мышкой можно тыкать. Ну и сессии сохраняет со всеми запросами.
Ставится элементарно:
curl -LsSf https://astral.sh/uv/install.sh | sh
uv tool install --python 3.13 posting
uv — это современный инструмент для Python, который объединяет в себе функционал менеджера пакетов и виртуальных окружений, задумывается как замена pip + venv/virtualenv + pip-tools.Для хакерменов прям мастхев. Забирай в копилку, годнота! 🛠 #linux #utilites — ✅ @bashdays ✅ @linuxfactory ✅ @blog
Дополнительно установлены 10 кодов на два бесплатных месяца обучения в Linux Factory.Поиск кодов это не основное, можно банально встретиться 1x1 и набить друг другу ебальник. Ну или просто почилить, отгрохать себе подземную базу или построить личный дата-центр. Если будут лаги и т.п. пиши сюда @linuxfactorybot, бум разбираться. Я нашел код, что дальше? 1. Делаешь скрин кода и координат XYZ (нажать F3) 2. Скидываешь эту инфу Максу 3. Забираешь приз Что бы не было соблазна схитрить, предприняты меры, все ходы записаны, так что будь честен.
Учти, что за тобой будут охотиться специально обученные боты-вжопуебаки.Как начать? Качаешь клиент отсюда или берешь официальный. Версия сервера
1.21.8 Подключаешься к mc.bashdays.ru и погружаешься в приключения.
Регистрация
/reg <пароль> <пароль>
/log <пароль>
Время работы сервера: c 05:00 МСК до 19:00 МСК
😀😃😄😁😅😂🤣😊
😇🙂🙃😉😌😍🥰😘
😗😙😚😋😛😝😜🤪
🤨🧐🤓😎🤩🥳😏😒
Что дальше?
А дальше посмотрим, если сервак переживет эту неделю и не будет уничтожен письками, то таблички с промокодами будут пополняться каждую неделю. Ну и время работы сервера будет увеличено. А по пятницам можно сходки устраивать, голосовой чатик замутить, пиво, все дела.
На этом пока всё. Хорошей тебе рабочей недели.
🛠 #островсокровищ
—
✅ @bashdays ✅ @linuxfactory ✅ @blogbegin 644 bashdays.txt MT)_1@-"XT++0M=&"+"#1@="ZT+[0N]&,T+K0OB#0L=&#T+30M=&"(#$P,"\P M+C4L(-"]T+#0O]"XT8C0N"#0OM&"T++0M=&"(-"R(-"ZT+[0O-"\T+70O=&" MT+#1@-"XT8_1A2#0NB#0O]"^T8'1@M&#(-"X(-"RT+[0M]"\T+[0MM"]T+X@ IT8$@T8+0OM"QT+[0N2#1@="RT8_0MM"UT8+1@=&/(-"<T+#0NM&!+@H` ` end😀😃😄😁😅😂🤣😊 😇🙂🙃😉😌😍🥰😘 😗😙😚😋😛😝😜🤪 🤨🧐🤓😎🤩🥳😏😒 🛠 #xfiles — ✅ @bashdays ✅ @linuxfactory ✅ @blog
Самое главное в ходе дебага, не выйти на самого себя.Да всё просто. После блокировок появилось много тикетов от клиентов, в которых говорилось - хочу GPT чат ёпта и чтобы блядь как раньше, нажал кнопочку и пошел работать. Да, без GPT уже никто не работает, деградировали все сука в зеленые сопли. Тут даже не «вайб-кодинг», а прям массовая истерия и осмысленный слив корпоративных данных. Нужно проверить договор? Так этож его читать нужно, нахуй надо, заливаем в GPT, а он пусть анализирует риски и неточности. Ну и всё в таком духе. 😀😃😄😁😅😂🤣😊 😇🙂🙃😉😌😍🥰😘 😗😙😚😋😛😝😜🤪 🤨🧐🤓😎🤩🥳😏😒/ Левой дрочу, правой жопу щекочу! Короче спрос есть, тем более я умею настраивать
openconnect да и сам им пользуюсь в личных целях.
Хуль, пошел настраивать на серваки клиентов, настроил, пытаюсь подключиться с локальной машины. ХУЙ ТАМ ПЛАВАЛ! Сервер нотфаунд. Пробую курлы, телнеты, меняю порты — ничего!
Ладно, думаю у клиента сервак с плохим айпишником, пошел настраивать другому клиенту. Такая же история.
Хм… уже закономерность какая-то. Иду к третьему клиенту, переношу полностью образ своего сервера на его сервер. Ну теперь 100% заработает!
Ага, история повторяется… Сервер нотфаунд.
Ну не может же такого быть. У меня с моим сервером все работает, а с клиентскими не работает. Даж не курлит и не телнетит ничего. Однако.
Как говорится:
Лох этот тот, кто пытается понять что вокруг происходит, хотя все кругом уже это понимают.Утро вечера мудренее. Если что-то не получается, нужно это дело отложить и вернуться к нему позже. Так и сделал. На утро вернулся и подумал иначе. А что если проблема — во мне? Нужно проверить эту гипотезу. Беру ноут для созвонов, ставлю
openconnect клиента и без проблем подключаюсь ко всем 3м серверам которые вчера настраивал.
Хм… иду за комп на котором все вчера настраивал — сервер нотфаунд.
Да ёбтавоюмать! Это как в nginx с редиректами, ебешься 5 часов, а потом понимаешь что дело не в nginx, а в твоём браузере. Оно закешировало запросы и похуй ему, редиректит по умолчанию, даже если меняешь конфиг nginx.
Что было?
😀😃😄😁😅😂🤣😊
😇🙂🙃😉😌😍🥰😘
😗😙😚😋😛😝😜🤪
🤨🧐🤓😎🤩🥳😏😒
Антивирус блядь! Какой не скажу, а то опять придут люди из 90х и начнут в меня письками тыкать и угрожать. Мыж с вами достаточно медийные, обсирать никого нельзя.
В антивирусе есть галка — Блокировать нерекомендуемые сайты.
Методом подбора эта галка была определена, она и блочила все мои попытки подключения. Это даже не фаервол, фаервол я отключал, когда настраивал openconnect. Всегда фаер отключаю когда работы подобного плана делаю.
Это чисто хуйня, которая блядь неочевидно скрыта в другом разделе. И до сих пор непонятно, почему айпишники моих серверов это рекомендуемые, а айпишники клиентов это не рекомендуемые.
ㅤ
Так и живем. Один лишний пробел, одна не поставленная запятая, забытый таб, вполне может уничтожить твой день.
Но опять же опыт. Теперь при настройке подобного гавна, буду иметь это ввиду. Но это не точно. Я люблю по 5 раз наступать на грабли. Говорят на ошибках учатся, но это не про меня.
Век живи, век учись!
🛠 #рабочиебудни
—
✅ @bashdays ✅ @linuxfactory ✅ @blogsystemd-cat. Она отправляет логи прямиком в journald.
🔤🔤🔥🔤 🔤🔤🔤🔤🔤🔤
Например:
echo "Successful backup" | systemd-cat -t my-backup
Просмотреть логи можно по тегу:
journalctl -t my-backup
Можно указать приоритет сообщения текстом или числом, как в syslog:
echo "Шеф, усё пропало!" | systemd-cat -t my-backup -p 1
А можно и префиксом в начале сообщения (число в угловых скобках):
echo "<1>Шеф, усё пропало!" | systemd-cat -t my-backup
В случаях отправки через pipe в journald попадет только то, что вывелось в stdout.
Для логирования stderr можно либо отправить stderr в stdout, либо запускать команду как аргумент systemd-cat:
ls non-exists 2>&1 | systemd-cat -t my-log
systemd-cat -t my-log ls non-exists
Во втором случае можно задать отдельный приоритет для сообщений из stderr: --stderr-priority.
😀😃😄😁😅😂🤣
😇🙂🙃😉😌😍🥰
😗😙😚😋😛😝😜
🤨🧐🤓😎🤩🥳😏
🛠 #балансбатл
—
✅ @bashdays ✅ @linuxfactory ✅ @blogdef respond_to_telnet_commands(sock, data):
"""Отвечает на IAC-команды, отправляя WONT на все DO и DONT на все WILL."""
i = 0
while i < len(data):
if data[i] == 0xff and i + 2 < len(data): # IAC
command, option = data[i + 1], data[i + 2]
if command == 0xfd: # DO
sock.send(bytes([0xff, 0xfc, option])) # WONT
elif command == 0xfb: # WILL
sock.send(bytes([0xff, 0xfe, option])) # DONT
i += 3
else:
i += 1
respond_to_telnet_commands - функция понадобится только если в ответе от сервера получаем такое b"\xff\xfb%\xff\xfb&\xff\xfd\x18\xff\xfd \xff\xfd#\xff\xfd'\xff\xfd$".
Если же в конце этой кишки будет login то всё ок можно сразу отправлять логин sock.send(b'login\r\n')
Подключение через ipython:
import socket
sock = socket.socket()
sock.connect(('192.168.1.100', 5000))
data = sock.recv(1024)
print(data)
respond_to_telnet_commands(sock, data)
data = sock.recv(1024)
print(data)
respond_to_telnet_commands(sock, data)
data = sock.recv(1024)
print(data)
sock.send(b'<login>\r\n')
data = sock.recv(1024)
print(data)
sock.send(b'<pass>\r\n')
data = sock.recv(1024)
print(data)
sock.send(b'<command>\r\n')
data = sock.recv(1024)
print(data.decode())
Подключение к telnet без аутентификации
ㅤ
В /etc/inetd.conf добавить:
5000 stream tcp nowait root /usr/local/bin/telnet_noauth
telnet_noauth - 5000 можно заменить на любой порт или написать просто telnet будет использоваться для подключения порт 23
<service_name>: имя службы (например, telnet), соответствует записи в /etc/services.
<socket_type>: обычно stream (для TCP) или dgram (для UDP).
<protocol>: протокол, например, tcp или udp.
<wait/nowait>: wait (ждёт завершения процесса) или nowait (многопоточный).
<user>: пользователь, от имени которого запускается служба (например, root).
<server_program>: путь к исполняемому файлу службы (например, /usr/sbin/in.telnetd).
<server_args>: аргументы для программы (обычно имя программы).
Добавить скрипт telnet_noauth с содержимым:
#!/bin/bash
/bin/bash -i
Дать права на исполнения:
chmod +x /usr/local/bin/**telnet_noauth**
Подключение через ipython:
import socket
sock = socket.socket()
sock.connect(('192.168.1.100', 5000))
data = sock.recv(1024)
print(data)
sock.send(b'<command>\r\n')
data = sock.recv(1024)
print(data.decode())
Такие дела!
🛠 #балансбатл
—
✅ @bashdays ✅ @linuxfactory ✅ @blog🤖 AI&ML — узнаете, как устроены RAG-системы и мультиагентные системы и как начать их использовать. ☁️ Cloud Infrastructure — нюансы сетевой архитектуры, проектирование IaaS‑кластеров на K8s, возможности балансировщиков и производительность SDN. 📈 Data&Analytics — про современные подходы к Big Data: тренды, интеграцию с AI-агентами и инструменты для хранения, обработки и анализа. ⚙️ Dev Platform Services — заглянем «под капот» решений, чтобы облегчить повседневную рутину разработки и настройки сервисов.А еще вас ждут демо, воркшопы, карьерные консультации, кастомный мерч и яркое afterparty. Не пропустите🖱
p1p0 у нас адрес 10.0.0.1/31 (у провайдера соответственно 10.0.0.0/31)
- На интерфейсе p1p1 у нас адрес 10.0.0.3/31 (у провайдера соответственно 10.0.0.2/31)
- На интерфейсе dummy-moew у нас висит адрес 188.222.33.1/32
- На сервере стоит гордый птыц bird, который делает bgp с провайдером
Зачем 30e и 31е маски? Потому что могу, да и ну его, айпишники тратить на 30е маски...
Делаем докериную сетку (bridge) и запускаем контейнер (например alpine:3), проверяем сетку:
docker network create -d bridge br-dzhigurda
docker run -it --rm --network br-dzhigurda alpine:3
ping -c 1 8.8.8.8
Получаем:
PING 8.8.8.8 (8.8.8.8): 56 data bytes
--- 8.8.8.8 ping statistics ---
1 packets transmitted, 0 packets received, 100% packet loss
Херня, товарищи! Идём смотреть правила в iptables:
-A POSTROUTING -s 198.18.66.0/24 ! -o br-dzhigurda -j MASQUERADE
Видим, что Docker делает MASQUERADE. Это обычный, всем привычный NAT, но! оно работает только с физическими сетевыми интерфейсами. И весь трафик от сервера выходит с IP именно физических интерфейсов. Нам такое не подходит.
Имеем, то что мы смотрим
Закапываемся в доку Docker и трём глаза в изумлении, ничего не нашли. Отлично, полезем в кишочки разбираться. Нам надо попробовать сделать вместо MASQUERADE - SNAT.
Идём в сырцы Docker (а точнее в moby/moby), грепаем, копаемся, и видим
// Файл integration/network/network_linux_test.go
ipv4SNATAddr := "172.0.0.172"
// Create a bridge network with --opt com.docker.network.host_ipv4=172.0.0.172
bridgeName := "hostIPv4Bridge"
network.CreateNoError(ctx, t, c, bridgeName,
network.WithDriver("bridge"),
network.WithOption("com.docker.network.host_ipv4", ipv4SNATAddr),
network.WithOption("com.docker.network.bridge.name", bridgeName),
)
Ага. В доке этого не было. Поехали, попробуем!
docker network create -d bridge br-fuckingsnat --opt com.docker.network.bridge.name=br-fuckingsnat --opt com.docker.network.host_ipv4=188.222.33.1
docker run -it --rm --network br-dzhigurda alpine:3
ping -c 1 8.8.8.8
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
64 bytes from 8.8.8.8: icmp_seq=1 ttl=108 time=16.5 ms
--- 8.8.8.8 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 16.497/16.497/16.497/0.000 ms
Отлично, связь есть. Смотрим в iptables:
-A POSTROUTING -s 198.18.66.0/24 ! -o br-fuckingsnat -j SNAT --to-source 188.222.33.1
Поразительно. Не, я точно слепой, такую же фичу не могли в документации пропустить... Или могли? Идём гуглим, и получаем всего один результат! И тот в Release Notes...
Итоги
Мы имеем работающие Docker контейнеры, которые SNAT-ятся с нужного нам IP, кровь из глаз после вида исходников, и непреодолимое желание написать разработчикам, что бы поправили доку.
🛠 #балансбатл #networks
—
✅ @bashdays ✅ @linuxfactory ✅ @blog192.168.0.87) который пулял куда-то API-запросы, с такой особенность, что работал он не как все машины через шлюз 192.168.0.1.
ㅤ
А пулял запросы в другую сеть которая была за шлюзом 192.168.0.176 и далее в дивный неведомый интернет, хуй знает куда он там чего отправляет, это в данном случае не важно.
Важно что запросы должны летать в шлюз 192.168.0.176 а общий шлюз в сети 192.168.0.1 с внешним X.X.X.X.
Все было хорошо, пока манагеры не захотели видеть этот сайт снаружи сети (IP X.X.X.X, всякие DNS опустим, они тут не важны).
Разраб тоже сказал что ему нужна 22 дырка снаружи, и понятно что проброс порта на шлюзе не сработает. Надо выдумывать маршруты.
Присказка окончена, понеслася сказка.
Пишем маршрутизацию
/etc/netplan/00-installer-config.yaml
network:
version: 2
renderer: networkd
ethernets:
eth0:
addresses: [192.168.0.87/24]
routes:
- to: 0.0.0.0/0 # Весь интернет-трафик через 192.168.0.176
via: 192.168.0.176
metric: 100
- to: 192.168.0.1/32 # Явный маршрут до шлюза 192.168.0.1
via: 192.168.0.1
metric: 50 # Более высокий приоритет
nameservers:
addresses: [8.8.8.8, 8.8.4.4]
Применяем изменения (тут если накосячил сообщат)
sudo netplan apply
Создаем отдельную таблицу маршрутизации (table 100)
sudo ip route add default via 192.168.0.1 dev eth0 table 100
Создаем правила маршрутизации для каждого порта:
sudo ip rule add iif eth0 dport 22 lookup 100
sudo ip rule add iif eth0 dport 8080 lookup 100
Что делает:
iif eth0 — трафик, пришедший на интерфейс eth0.
dport 22 и dport 8080 — если это SSH (порт 22) или HTTP (порт 8080).
lookup 100 — использовать таблицу 100 для маршрутизации этого трафика.
Пометка исходящего трафика (iptables mangle + MARK)
sudo iptables -t mangle -A OUTPUT -p tcp --sport 22 -j MARK --set-mark 1
sudo iptables -t mangle -A OUTPUT -p tcp --sport 8080 -j MARK --set-mark 1
Что делает:
-t mangle — таблица mangle для изменения (marking) пакетов.
--sport 22 и --sport 8080 — если исходящий трафик идёт с портов 22 (SSH) или 8080 (HTTP).
--set-mark 1 — помечает такие пакеты меткой 1.
Зачем:
Метка (mark) позволяет позже применить к пакетам особые правила маршрутизации.
Правило маршрутизации по метке (fwmark)
sudo ip rule add fwmark 1 lookup 100
Что делает:
fwmark 1 — если пакет помечен меткой 1 (как в iptables выше).
lookup 100 — использовать таблицу 100 для маршрутизации.
Зачем:
Это гарантирует, что ответы на SSH/HTTP-запросы (исходящие с портов 22/8080) будут направляться через шлюз 192.168.0.1 (из таблицы 100), а не через основной маршрут.
Общий смысл всей настройки:
Для входящих запросов на eth0 (порты 22 и 8080): Ответный трафик маркируется (mark=1).
Маркированный трафик направляется через таблицу 100 (шлюз 192.168.0.1).
Для исходящих ответов (SSH/HTTP с портов 22/8080): Трафик также маркируется и направляется через таблицу 100.
Результат:
Весь трафик, связанный с SSH (22) и HTTP (8080), всегда идёт через шлюз 192.168.0.1, даже если в системе есть другие маршруты по умолчанию.
Проверяем:
ssh -p 1422 user@Х.Х.Х.Х
curl ident.me #должен вернуть внешний адрес шлюза
Если все отработало, идем дальше.
При перезагрузке вся настроенная маршрутизация слетит.
Надо восстанавливать при каждой перезагрузке. Тут на выбор. Пойдем по пути systemd.
В комментах содержимое portforward-routes.service, в пост не влезло.Включаем
sudo systemctl daemon-reload
sudo systemctl enable portforward-routes.service
Перегружаемся\проверяем.
🛠 #балансбатл #networks
—
✅ @bashdays ✅ @linuxfactory ✅ @blog
Available now! Telegram Research 2025 — the year's key insights 
