Bash Days | Linux | DevOps
Авторский блог от действующего девопса Самобытно про разработку, devops, linux, скрипты, сисадминство, техдирство и за айтишную жизу. Автор: Роман Шубин Реклама: @maxgrue MAX: https://max.ru/bashdays Курс: @tormozilla_bot Блог: https://bashdays.ru
نمایش بیشتر📈 تحلیل کانال تلگرام Bash Days | Linux | DevOps
کانال Bash Days | Linux | DevOps (@bashdays) در بخش زبانی روسی بازیگری فعال است. در حال حاضر جامعه شامل 23 814 مشترک است و جایگاه 5 718 را در دسته فناوری و برنامهها و رتبه 28 110 را در منطقه روسيا دارد.
📊 شاخصهای مخاطب و پویایی
از زمان ایجاد در невідомо، پروژه رشد سریعی داشته و 23 814 مشترک جذب کرده است.
بر اساس آخرین دادهها در تاریخ 14 ژوئن, 2026، کانال فعالیت پایداری دارد. در ۳۰ روز گذشته تغییر اعضا برابر -182 و در ۲۴ ساعت گذشته برابر 1 بوده و همچنان دسترسی گستردهای حفظ شده است.
- وضعیت تأیید: تأیید نشده
- نرخ تعامل (ER): میانگین تعامل مخاطب 23.05% است و در ۲۴ ساعت نخست پس از انتشار، محتوا معمولاً 11.52% واکنش نسبت به کل مشترکان کسب میکند.
- دسترسی پستها: هر پست به طور میانگین 5 492 بازدید دریافت میکند. در اولین روز معمولاً 2 744 بازدید جمعآوری میشود.
- واکنشها و تعامل: مخاطبان بهطور فعال حمایت میکنند؛ میانگین واکنش به هر پست 25 است.
- علایق موضوعی: محتوا بر موضوعات کلیدی مانند bashdays, linux, bash, docker, скрипт تمرکز دارد.
📝 توضیح و سیاست محتوایی
نویسنده این فضا را محل بیان دیدگاههای شخصی توصیف میکند:
“Авторский блог от действующего девопса
Самобытно про разработку, devops, linux, скрипты, сисадминство, техдирство и за айтишную жизу.
Автор: Роман Шубин
Реклама: @maxgrue
MAX: https://max.ru/bashdays
Курс: @tormozilla_bot
Блог: https://bashdays.r...”
به لطف بهروزرسانیهای پرتکرار (آخرین داده در تاریخ 15 ژوئن, 2026)، کانال همواره بهروز و دارای دسترسی بالاست. تحلیلها نشان میدهد مخاطبان بهطور فعال با محتوا تعامل دارند و آن را به نقطه اثرگذاری مهم در دسته فناوری و برنامهها تبدیل کردهاند.
Да, Linux Factory продолжает работать, заходи если чё, замажем пати. Если нужен промик со скидкой 1000р на новых вход не стесняйся — пиши сюда.Как говорится: Кто хочет — ищет возможности, кто не хочет — ищет причины. Всех обнял, хорошего тебе дня и увидимся! 🛠 #рабочиебудни — 💬 Bashdays 📲 MAX 🌐 LF 🔵 Blog
▶️автоматизация в эпоху ИИ ▶️DevOps-инструменты в облаке ▶️эффективные среды для разработки, CI/CD и обучения ▶️DevOps- и SRE-агенты ▶️защита cloud native приложений ▶️и другие докладыТакже будут отдельные треки про ИИ, облачную инфраструктуру и работу с данными. И самое крутое – практические воркшопы: берите ноутбук и решайте прикладные задачи под руководством экспертов Cloud.ru. Где и когда: 9 апреля в Москве и онлайн 👉Не пропустите👈
netbird сеть и проксировать трафик с випиэски на твои поделки, хоть в интернетах, хоть на 1000 NATами.
Сейчас у меня так и организовано, в интернетах торчит випиэска, на ней тоннель и nginx разруливает уже по доменам, причем трафик завязан в мой домашний периметр на проксмокс. И даже микротик не пищит, что у него порты закрыты. Всё работает из коробки.
Второй вариант та же внешняя випиэска, но с поднятым Safeline. Это морда с обвесами, новогодняя ёлка на все случаи жизни. Про неё уже упоминали в гейте, это ничего не меняет.
Оно ставится перед твоими веб-приложением и фильтрует трафик, защищая приложение от самых распространенных атак (SQL injection, XSS, Command injection, Path traversal, File inclusion, Webshell, RCE, боты-хуёты).Короче говоря заебачий такой WAF. Много крутилок, много перделок. В бесплатной версии хватает с головой (да, есть и платная). Получается ты не только анализируешь трафик, но и прячешь айпишник своих приложений и серверов. Пиздато? Пиздато! Композ бывалый:
version: "3"
services:
safeline-mgt:
image: chaitin/safeline-mgt:latest
container_name: safeline-mgt
restart: always
ports:
- "9443:9443"
volumes:
- ./data:/data
environment:
- TZ=UTC
safeline-gateway:
image: chaitin/safeline-gateway:latest
container_name: safeline-gateway
restart: always
depends_on:
- safeline-mgt
ports:
- "80:80"
- "443:443"
volumes:
- ./gateway:/gateway
environment:
- MGT_HOST=safeline-mgt
Два базовых контейнера: панель управления, API, хранилище правил, reverse proxy. А вообще в офф доке есть одна команда, которая скачает нужный композ, создать вольюмы и всё запустит:
bash <(curl -sSL https://waf.chaitin.com/release/latest/setup.sh)
Да, поделка Китайская, но опять же это ничего не значит. В Китае пиздатые специалисты.
Рекомендую потыкать, особенно если ищешь вменяемые и бесплатные альтернативы сдохшему клаудфларе.
🛠 #security #services
—
💬 Bashdays 📲 MAX 🌐 LF 🔵 Blog.bashrc экономит часы. У каждого эти функции обычно индивидуальны, но возможно этот список раскроет тебе глаза на что-то новое.
Создать директорию и сразу в неё перейти
mkcd() {
mkdir -p "$1" && cd "$1"
}
Подняться на несколько уровней вверх
up() {
local d=""
for ((i=1;i<=$1;i++)); do
d+="../"
done
cd "$d"
}
Быстро найти файл
ff() {
find . -type f -iname "*$1*"
}
Найти директорию
fd() {
find . -type d -iname "*$1*"
}
Найти процесс
psg() {
ps aux | grep -i "$1" | grep -v grep
}
Посмотреть последние команды
h() {
history | tail -n "$1"
}
Поиск по истории
hg() {
history | grep "$1"
}
Узнать размер директории
dirsize() {
du -sh "$1"
}
Универсальная распаковка архивов
extract() {
if [ -f "$1" ]; then
case "$1" in
*.tar.bz2) tar xjf "$1" ;;
*.tar.gz) tar xzf "$1" ;;
*.bz2) bunzip2 "$1" ;;
*.rar) unrar x "$1" ;;
*.gz) gunzip "$1" ;;
*.tar) tar xf "$1" ;;
*.tbz2) tar xjf "$1" ;;
*.tgz) tar xzf "$1" ;;
*.zip) unzip "$1" ;;
*.7z) 7z x "$1" ;;
*) echo "unknown archive" ;;
esac
fi
}
Быстрый HTTP-сервер из текущей папки
serve() {
python3 -m http.server "${1:-8000}"
}
Узнать свой внешний IP
myip() {
curl -s ifconfig.me
}
Узнать IP домена
ipinfo() {
dig +short "$1"
}
Показать открытые порты
ports() {
ss -tuln
}
Полная очистка терминала
cls() {
clear && printf '\e[3J'
}
Безопасный rm
rm() {
ls -FCsd -- "$@"
read -p 'Delete? [y/N] ' ans
if [ "$ans" = "y" ]; then
command rm -rf -- "$@"
fi
}
С удалением еще можно сделать аналог корзины, добавив простое копирование в какой-нибудь временный каталог, который автоматически зачищается спустя какое-то время, например в /tmp.
The end. Кидай в комменты, какие функции используешь ты, будет полезно.
🛠 #bash
—
💬 Bashdays 📲 MAX 🌐 LF 🔵 BlogНа встрече обсудим: 🔵 что ждут работодатели от DevOps-инженеров в 2026 году 🔵 какая главная сложность входа в профессию DevOps 🔵 как устроено обучение и вступительные экзамены Расскажем, как проходит обучение, какие навыки получают студенты магистратуры и как совмещать учёбу с работой. А ещё сможете задать вопросы команде программы.Ждём вас 25 марта в 19:00 мск. → Зарегистрироваться на ДОД
Чуть раньше я уже писал подобный пост для докера «основные методы отладки», но там освещены не все моменты.Зачастую используются «тулбоксы», это такие специальные docker контейнеры, которые содержат в себе все самые необходимые утилиты для этого самого дебага. Такие «тулбоксы» можно делать самостоятельно, а можно воспользоваться готовыми. Один из самых популярных, это netshoot, в него включено свыше 50ти консольных утилит на все случаи жизни. Основной упор сделан на диагностику сетевой хуйни. Например:
kubectl run netshoot --rm -it --image=nicolaka/netshoot
Теперь можно выполнить:
dig service.bashdays.svc.cluster.local
curl http://service:8080
Или зайти в network namespace pod:
kubectl debug pod/myapp -it --image=nicolaka/netshoot
Короче если какой-то сервис не работает, запускается netshoot делается DNS проверка dig service, проверка TCP nc service 5432, смотрим пакеты tcpdump -i any port 5432 и т.п.
Довольная удобная штука, ничего выдумывать не нужно. Аналогично создаются другие «тулбоксы» со своим содержимым и утилитами.
У каждого уважающего себя девопс-инженера, должен быть такой image под рукой, рано или поздно он обязательно пригодится и сослужит службу.
Самое важное здесь, разместить этот образ на РФ серверах, чтобы рядышком был и никакие блокировки бы его не касались. Да и тот же `netshoot` желательно к себе утащить в норку.Чем еще подебажить: - k8s-toolbox - Busybox - dnsutils - Network Multitool А в новых версиях куба активно используют Ephemeral containers, как раз тот самый
kubectl debug. Можно внедрить debug container прямо в pod.
Кстати «тулбоксы» можно использовать не только в кубере, они отлично ложатся на обычный докер, опять-же сеть потыкать, покурлить и помяукать. Так что если у тебя нет куба, похуй, пригодится и для обычного докера.
Ну а теперь давай создадим искусственную проблему и попытаемся её диагностировать с помощью этих самых «тулбоксов».
….
На этом всё, изучай!
🛠 #devops #debug #docker #k8s
—
💬 Bashdays 📲 MAX 🌐 LF 🔵 Blog➡️как быстро запустить и контролировать генерацию кода с LLM в VS Code ➡️как выстроить правила, ограничения и стандарты при работе с LLM ➡️как настроить ранний контроль качества и безопасности через SonarQube ➡️как использовать MCP-серверы для качественного кодаНе забудьте зарегистрироваться 🌐
1. Все подряд (побегать по сайтам) 2. Self-Hosted (домашние сервера и сервисы) 3. GPT (несколько нейронок) 4. Бухгалтерия (отчетность, диадоки-хуёки всякие)Раньше я группировал их в «группа вкладок», но теперь навесил workspaces на горячие клавиши «ALT+1, ALT+2…», стало намного удобнее и быстрее переключаться, возникает меньше путаницы. Дополнительно к workspaces можно создавать папки под вкладки, например нашел что-то интересное, закрывать жалко, но и сейчас нет времени разбираться. Перенес вкладку в папку, она там висит и не тревожит моё внимание. Ну там всякий сплит окон типа терминального tmux. Из необычного, все вкладки располагаются слева, сначала непривычно, но потом проникаешься. Настроек хуева гора. Если не хватает, то можно впендюрить обвесы, опять же на их сайте это всё лежит, ну и на гитхабе энтузиасты стряпают регулярно. Что по глюкам? Да пока не наблюдаю, тормозов не ощущается, рутокен работает, нет ощущения, что пересел с лексуса на девятку, дальше уже посмотрим. Присмотрись, возможно зайдет и наконец организуешь свои 100500 открытых вкладок которые жалко закрывать. 🛠 #soft — 💬 Bashdays 📲 MAX 🌐 LF 🔵 Blog
Помню в начале 2000х было нечто подобное, вроде как «осёл» назывался (eDonkey, eMule).Суть soulseek — расшарить на компе папку и поделиться со всеми, как в старые добрые. Можно ничего не шарить и только потреблять. Что прикольно, музло можно сразу качать дискографиями, а не отдельными песнями. И это музло НЕ будет «зацензурено». Удобно? Да охуенно! Пойду поищу свой старенький digma mp3 плеер, да погружусь в вайб. А какой у тебя был MP3 плеер? Поделись в комментах если еще помнишь. Хорошей тебе рабочей недели. Не болей! 🛠 #soft #services #music — 💬 Bashdays 📲 MAX 🌐 LF 🔵 Blog
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Всем кода без багов. 🛠 #linux #bash — 💬 Bashdays 📲 MAX 🌐 LF 🔵 Blog
Если открыть файл в vim, то lsof покажет этот файл открытым. А вот если открыть файл в nano, то lsof не факт, что покажет этот файл открытым. Ну видимо nano не постоянно держит открытым файл.Давай покопаем глубже и посмотрим что происходит. Расчехляем лабу! ㅤ В первом терминале запускаем:
echo "secret data" > test.txt
nano test.txt
Во втором запускаем глазища:
sudo strace -e open,openat,write,close -p $(pgrep nano)
Пока пусто. Теперь в первом терминале нажимаем CTRL+O и смотрим выхлоп во втором терминале:
openat(AT_FDCWD, "test.txt", O_WRONLY|O_TRUNC) = 3
write(3, "secret data\n", 5) = 5
close(3) = 0
Получается nano запихивает весь файл в RAM и только после манипуляций с ним производит запись на диск, то есть не держит его постоянно открытым. По этой причине lsof ничего и не показывает.
Теперь идем в vim и повторяем предыдущие команды:
vim test.txt
Но во втором терминале запускаем:
watch -n 0.01 "lsof | grep test.txt"
И сразу же видим что lsof показывает открытые файлы:
vim 6423 user 5u REG 8,48 12288 11148 /tmp/.test.txt.swp
vim 6423 6424 vim user 5u REG 8,48 12288 11148 /tmp/.test.txt.swp
Но это не сам файл test.txt, это его swap версия, то есть создается еще один файл. Если открыть такой файл, то в нем будет мусор:
0000000 3062 4956 204d 2e39 0031 0000 1000 0000
0000010 bfdc 69a7 b9a1 0000 1917 0000 7375 7265
0000020 0000 0000 0000 0000 0000 0000 0000 0000
Этот файл, vim использует для crash recovery, undo history, file already open, incremental writes и т.п. Получается что vim постоянно держит открытый swap, а не исходный файл.
Если выполнить:
lsof -p 6423То увидим всю подноготную этого процесса включая дескрипторы. Ну и финт ушами. В первом терминале выполняем:
vim test.txt
Во втором:
mv test.txt test.old
И видим что vim грязно выругался: E211: File "test.txt" no longer available.
А если все то же самое проделать с nano то он даже не пискнет, потому что файл загружен в память и ему похеру что мы физически снесли файл с диска. Можно снова нажать CTRL+O и он даже предложит нам его сохранить со старым именем.
Вот тут уже можно почесать репу, получается nano работает быстрее чем vim? Неа, vim тоже загружает файл в память (buffer ram). А swap файл это всего лишь журнал изменений либо undo-файлы. Swap не заменяет память, он выступает в роле дополнительного инструмента.
Схема для vim такая:
disk file → RAM buffer (vim)
↓
swap file (.swp)
Схема для nano попроще:
disk file → RAM bufferВ
nano нет ни рекавери, не другой подобной хуйни-муйни. Ну а по скорости, разницы практически нет (если файлы небольшие), файлы читаются один раз, оба редактора работают в памяти, ну а linux page cache делает чтение еще быстрее.
Если файлы большие, vim все же предпочтительнее, у него более продвинутый механизм по работе с буферами.
Так и живем!
🛠 #debug #strace
—
💬 Bashdays 📲 MAX 🌐 LF 🔵 BlogФорензика — это направление информационной безопасности, связанное с анализом и восстановлением данных для расследования инцидентовКто-то извращается со
shred и т.п. утилитами, но это избыточно, да и на SSD, Btrfs, ZFS и journal FS оно будет работать хуева и не гарантирует физическое уничтожение данных. Лучше на диск вообще ничего не писать.
Наш вариант это — pipe через printf. Можно конечно усложнить и сделать через анонимный файловый дескриптор, но получаются те же грабли только сбоку, смысла усложнять нет.
#!/usr/bin/env bash
set -euo pipefail
SECRET="$(openssl rand -base64 32)"
printf '%s' "$SECRET" | \
openssl enc -aes-256-cbc -salt -pbkdf2 -iter 200000 \
-in input.txt \
-out output.enc \
-pass stdin
unset SECRET
Что тут происходит?
Ничего необычного, генерим 32 случайных байта, кодируем в base64, получаем пароль высокой энтропии, затем через printf передаем пароль (без \n) через pipe в stdin.
Ну и в конце скармливаем какой-нибудь утилите или в CI/CD, куда нужно передать секрет, в моем случае я передал его в openssl.
По итогу секрет, не попадает в history, не лежит на диске и временно находится в памяти. Но важно понимать, что после unset SECRET переменная удаляется только из таблицы переменных, в памяти эта переменная может по-прежнему храниться и быть уязвима к форензике. Поэтому носи это в голове и по возможности перезатирай память например тем же stress.
А еще оно может попасть в swap и это еще хуже, swap это прям как неочищенная «корзина» с удаленными файлами.
На bash этот момент описать наверное не получится, поэтому покажу как сделать на Сиськах. Будем использовать mlock().
#include <sys/mman.h>
#include <string.h>
#include <stdio.h>
int main() {
char secret[32] = "super_secret_password";
if (mlock(secret, sizeof(secret)) != 0) {
perror("mlock failed");
return 1;
}
printf("Secret in locked memory\n");
// Используем секрет...
memset(secret, 0, sizeof(secret)); // затираем
munlock(secret, sizeof(secret));
return 0;
}
Когда этот код будет вызывать mlock(), указанный диапазон памяти закрепляется в RAM и ядро не имеет права выгружать его в swap.
Получается что сначала mlock() блокирует участок памяти, затирает memset() её перед освобождением и с помощью munlock() снимает блокировку.
Кстати mlock() используют GnuPG, OpenSSH, HashiVault, KeePassXX. Так что вариант надежный, можешь не сомневаться. А еще иногда используется mlockall():
mlockall(MCL_CURRENT | MCL_FUTURE);
Блокируется вся текущая и будущая память процесса, активно применяется демонами в HashiVault.
Такие дела.
Накидай еще своих вариантов в комменты, будет интересно ознакомиться.
🛠 #dev #security #bash
—
💬 Bashdays 📲 MAX 🌐 LF 🔵 Bloggit config --global user.name
git config --global user.email
Один раз забил свои явки-пароли и затем git при любом коммите или пуше будет подставлять эти данные. То есть в историю коммитов будет забиваться user.name и user.email. Это логично и понятно.
ㅤ
Но если у тебя смешаны личные и рабочие репозитории, начинается цирк с конями. Я тысячу раз комитил в рабочую репу под личным user.name и user.email и получал за это по рукам. Получал конечно сам от себя.
Потому что смешивать личное и рабочее — фуфу!Из этой ситуации можно выйти по-разному, кто-то изобретает безумные Bash скрипты или пишет хуки, кто-то постоянно правит конфиги перед пушем. Короче костыль на костыле. Но есть решение лучше и нативнее. Расчехляем хоумлабу! У нас будет 2 папки:
mkdir -p ~/projects/personal
mkdir -p ~/projects/work
Настраиваем основной конфиг:
vim ~/.gitconfig
[user]
name = Roman Shubin
email = shuba@bashdayz.com
[includeIf "gitdir:~/projects/work/"]
path = ~/.gitconfig_work
Нюанс: / в конце work обязателен. Git интерпретирует gitdir: как префикс пути к каталогу .git.
Создаем рабочий конфиг ~/.gitconfig_work
[user]
name = Linux Factory
email = exe@linuxfactory.ru
На этом танцы с бубном закончились, проверяем:
mkdir -p ~/projects/personal/app
cd ~/projects/personal/app
git init
git config user.email
git config --show-origin user.email
Ага, видим что для личных проектов будет применяться shuba@bashdayz.com и берется он из ~/.gitconfig. Последние 2 команды, как раз выводят эту информацию в терминал. Хорошо, теперь:
mkdir -p ~/projects/work/app
cd ~/projects/work/app
git init
git config user.email
git config --show-origin user.email
Да твоюж мать! Видим Linux Factory и exe@linuxfactory.ru. Что и требовалось доказать, данные берутся из файла ~/.gitconfig_work.
Всё, мы успешно разделили контекст между личными и рабочими проектами. Таких инклудов ты можешь насоздавать сколько угодно. Самое главное это работает без костылей и каких-то лишних обвесов вокруг git.
Git скрывает очень много интересного и не всегда это очевидно. Такие дела, изучай!
🛠 #devops #linuxfacroty #dev
—
💬 Bashdays 📲 MAX 🌐 LF 🔵 Blog
اکنون در دسترس! پژوهش تلگرام ۲۰۲۵ — مهمترین بینشهای سال 
