Bash Days | Linux | DevOps
Авторский блог от действующего девопса Самобытно про разработку, devops, linux, скрипты, сисадминство, техдирство и за айтишную жизу. Автор: Роман Шубин Реклама: @maxgrue MAX: https://max.ru/bashdays Курс: @tormozilla_bot Блог: https://bashdays.ru
显示更多📈 Telegram 频道 Bash Days | Linux | DevOps 的分析概览
频道 Bash Days | Linux | DevOps (@bashdays) 俄语 语言赛道中的 是活跃参与者。目前社区聚集了 23 742 名订阅者,在 技术与应用 类别中位列第 5 571,并在 俄罗斯 地区排名第 27 919 位。
📊 受众指标与增长动态
自 невідомо 创建以来,项目保持高速增长,吸引了 23 742 名订阅者。
根据 30 七月, 2026 的最新数据,频道保持稳定运转。过去 30 天订阅人数变化为 7,过去 24 小时变化为 0,整体触达仍然可观。
- 认证状态: 未认证
- 互动率 (ER): 平均受众互动率为 22.02%。内容发布后 24 小时内通常能获得 12.73% 的反应,占订阅者总量。
- 帖子覆盖: 每篇帖子平均可获得 5 228 次浏览,首日通常累积 3 023 次浏览。
- 互动与反馈: 受众积极参与,单帖平均反应数为 22。
- 主题关注点: 内容集中在 bashdays, linux, bash, docker, скрипт 等核心主题上。
📝 描述与内容策略
作者将该频道定位为表达主观观点的平台:
“Авторский блог от действующего девопса
Самобытно про разработку, devops, linux, скрипты, сисадминство, техдирство и за айтишную жизу.
Автор: Роман Шубин
Реклама: @maxgrue
MAX: https://max.ru/bashdays
Курс: @tormozilla_bot
Блог: https://bashdays.r...”
凭借高频更新(最新数据采集于 31 七月, 2026),频道始终保持新鲜度与高覆盖。分析显示受众积极互动,使其成为 技术与应用 类别中的关键影响点。
Внутри игры есть DeepOS, это ретро десктоп, в котором есть окна, темы, мини приложения, редакторы кода. Можно переключаться между GUI и терминалом.Лучше один раз потрогать самому, чем читать описание. Затягивает с потрохами. Немного похожа на Hacknet, но более прокаченная, более живая. Короче потыкай, рекомендую. 🛠 #games #security #privacy — 💬 Bashdays 📲 MAX 🌐 LF 🔵 Blog
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, поэтому, если кто-нибудь поможет ускорить выражение — буду благодарен.
Всем кода без багов.
🛠 #bash #linux
—
💬 Bashdays 📲 MAX 🌐 LF 🔵 BlogДа, 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