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 791 名订阅者,在 技术与应用 类别中位列第 5 701,并在 俄罗斯 地区排名第 28 125 位。
📊 受众指标与增长动态
自 невідомо 创建以来,项目保持高速增长,吸引了 23 791 名订阅者。
根据 18 六月, 2026 的最新数据,频道保持稳定运转。过去 30 天订阅人数变化为 -216,过去 24 小时变化为 -5,整体触达仍然可观。
- 认证状态: 未认证
- 互动率 (ER): 平均受众互动率为 22.75%。内容发布后 24 小时内通常能获得 12.90% 的反应,占订阅者总量。
- 帖子覆盖: 每篇帖子平均可获得 5 413 次浏览,首日通常累积 3 068 次浏览。
- 互动与反馈: 受众积极参与,单帖平均反应数为 21。
- 主题关注点: 内容集中在 bashdays, linux, bash, docker, скрипт 等核心主题上。
📝 描述与内容策略
作者将该频道定位为表达主观观点的平台:
“Авторский блог от действующего девопса
Самобытно про разработку, devops, linux, скрипты, сисадминство, техдирство и за айтишную жизу.
Автор: Роман Шубин
Реклама: @maxgrue
MAX: https://max.ru/bashdays
Курс: @tormozilla_bot
Блог: https://bashdays.r...”
凭借高频更新(最新数据采集于 19 六月, 2026),频道始终保持新鲜度与高覆盖。分析显示受众积极互动,使其成为 技术与应用 类别中的关键影响点。
date --iso=seconds
Ну да, если запросить help либо глянуть в гуглах, такая конструкция нигде не упоминается.
Молодец чо. НО, если бы он знал про функцию getopt_long, то вряд ли сделал открытие. Ща расскажу в чем прикол.
Короче, куча программ и утилит используют функцию getopt_long для перебора командной строки. И эта функция распознает сокращения в длинных аргументах и опциях.
Функция getopt_long входит в состав пакета GNU C (glibc)Собственно вот оригинальная команда:
date --iso-8601=seconds
Но если пропустить её через getopt_long, получим ту самую «пасхалку»:
date --iso=seconds
✔️ Еще примеры для понимания:
1. nano --smart --book
2. ls --hyper --show
3. du --one --human --sum
1. --smarthome --bookstyle 2. --hyperlink --show-control-chars 3. --one-file-system --human-readable --summarizeПонял в чем прикол? Но это еще не всё! Утилиты из состава пакета coreutils, поддерживают сокращения аргументов и опций. Смотри:
for i in d h m s n; do date -I"$i"; done
2024-05-14
2024-05-14T09+00:00
2024-05-14T09:59+00:00
2024-05-14T09:59:37+00:00
2024-05-14T09:59:37,850707267+00:00
-Id == -Idate -Ih == -Ihours -Im == -Iminutes -Is == -Iseconds -In == -InsАналогично с длинными опциями:
for i in d h m s n; do date --iso="$i"; done
2024-05-14
2024-05-14T10+00:00
2024-05-14T10:01+00:00
2024-05-14T10:01:57+00:00
2024-05-14T10:01:57,460027853+00:00
--iso=d == --iso-8601=date --iso=h == --iso-8601=hours --iso=m == --iso-8601=minutes --iso=s == --iso-8601=seconds --iso=n == --iso-8601=nsНу и на примере ls и sort:
ls --col=al | cat
--col=al == --color=always
printf '%s\n' {20..1} | sort --so=n
--so=n == --sort=numericВся эта байда с сокращением, реализуется с помощью функций из библиотеки Gnulib, которые в свою очередь опираются на функции glibc. Что имеем? Не нужно искать пасхалки, там где их нет. Такие дела! tags: #linux — 🔔 @bashdays
Variable ENVIRONMENT=stage / production ну пиздец тяжко и неудобно. А если таких переменных овердохуя, то всё желание пропадает что-то делать.
Хочется чтобы был выпадающий список со всеми параметрами. Накликал мышкой и в продакшен.
Выпадающие списки можно делать не только с окружениями, но и добавить банальные вопросы YES/NO и прочее. А затем в секции rules уже все это разруливать и обрабатывать.
✔️Ниже базовая болванка
Создаем файл .gitlab-ci.yml в корне проекта и добавляем в него:
variables:
ENVIRONMENT:
value: "N/A"
options:
- "N/A"
- "STAGE"
- "PRODUCTION"
description: "Deployment environment"
.stage_server:
&stage_server
WEB_NODE: "xx.xx.xx.xx"
DB_NODE: "xx.xx.xx.xx"
.production_server:
&production_server
WEB_NODE: "xx.xx.xx.xx"
DB_NODE: "xx.xx.xx.xx"
deploy:
tags:
- common-runner
script:
- echo $ENVIRONMENT
- echo "build & deploy here"
rules:
- if: '$ENVIRONMENT == "STAGE"'
variables:
<<: *stage_server
- if: '$ENVIRONMENT == "PRODUCTION"'
variables:
<<: *production_server
В первой секции variables, описываем выпадающий список. Из него будем выбирать мышкой, куда деплоить.
N/A (выбран по умолчанию) добавлено для дураков, которые ничего не выбирают и сразу тыкают Run Pipeline. В таком случае пайплайн зафейлится и ничего не пострадает.
Дальше идут две секции, которые описывают окружения stage и production, там указываем айпишинки и вообще всё, что захотим для каждого окружения. Можно флагов навтыкать и прочего говна.
Ну и основная секция deploy, у меня указан раннер с тэгом common-runner, а потом полезная нагрузка которая будет выполнена.
В секции rules зашита логика. В зависимости от того, какое окружение было выбрано из выпадающего списка, применяются настройки либо от stage, либо от production. Короче инклудится нужное.
Собственно всё. Если нужно добавить еще каких-то выпадающих списков, добавляем в первую секцию всё необходимое, аналогично ENVIRONMENT. Ну и потом в rules все это обрабатываем. Например, так:
- if: '$JOB == "YES" && $ENVIRONMENT == "STAGE"'
В общем всё элементарно. По итогу получаем незамысловатый пайплайн, всё в одном месте и ничего не раскидано по самому gitlab.
Бонусы. Да, если нужен общий пайплайн для нескольких проектов, делаем так:
Создаем репу dev/pipelines, кидаем туда файл .gitlab-ci.yml, настраиваем в нем всё под свои реалии.
Дальше в нужных проектах добавляем файл .gitlab-ci.yml с таким содержимым:
include:
- project: "dev/pipelines"
- file: ".gitlab-ci.yml"
Всё, теперь не надо плодить кучу .gitlab-ci.yml с одинаковым содержимым, все инклудится из одного места. Ну и если нужно что-то поменять, меняем один раз и все проекты автоматически это подхватывают.
Максимально попытался упростить и сделать наглядно, а дальше уже включай фантазию и твори.
Хорошего тебе дня, увидимся!
tags: #devops
@ВАSНDАYS | BАSHDАYS.CОMКстати если нажать стрелочку вверх, сработает триггер и откроется морда atuin с историей, пиздатенько!Дополнительно: - написана на rust + sqlite - удобный поиск и фильтр - история команд шифруется - совместимо с Bash, ZSH, Fish, NuShell Установка одной командой:
/bin/bash -c "$(curl --proto '=https' --tlsv1.2 -sSf https://setup.atuin.sh)"
Короче рекомендую потыкать.
Сайт проекта: https://atuin.sh/
Страница на github: https://github.com/atuinsh/atuin
tags: #linux #utils
@ВАSНDАYS | BАSHDАYS.CОMvim -c ':!/bin/sh'
Или так:
vim --cmd ':set shell=/bin/sh|:shell'
На выходе тебе выплюнет доллар ($) ну и там уже бесоёбишь.
Это применимо не только к пентесту, но и к ситуации когда админ порезал оболочку, ограничив тебя белым списком.
И если в этом списке есть vi/vim, то ты ничем не ограничен. Запускаешь полноценный shell через vim и развлекаешься. А порой можно дотянутся и до папки /root и всего остального. Было бы желание 🥳
Вектор этот очень распространён, добавил в бэклог. Сниму как-нибудь видос на ютубину, покажу так сказать всю подноготную выхода из клетки средствами vim.
Давай, хороших выходных! Я пожалуй тоже устрою себе внеплановый отпуск на пару дней. Увидимся!
Там еще ребята с какого-то облака пришли. Устроим с ними конкурс в ближайшее время с вкусными призами, обещают подвезти вам облачных плюшек на халяву, а я в свою очередь денежный бонус задоначу, приобретете себе чтонибудь пиздатое, например как Дима тут ))
tags: #linux #security #utils
@ВАSНDАYS | BАSHDАYS.CОMИ еще раз повторюсь — если ты заинтересуешь серьезных людей, да еще и им денег за твою голову задонатят, то никакой пароль на приватный ключик, никакой сейф тебе не поможет, ты сам всё отдашь.Потому что у человека в приоритете две основных потребности - личная безопасность и секс. Привет пирамиде Маслоу. А вот пароль на gpg ключик это да, мастхэв. Все остальное это избыточная безопасность. Не доводите до абсурда. Если считаешь по-другому, велком в комментарии и хорошего дня! tags: #рабочиебудни @ВАSНDАYS | BАSHDАYS.CОM
Кстати про chroot писал в этом посте, почитай на досуге, мож где применишь.Все эти костыли были неудобные и какие-то пиздец сложно поддерживаемые. Но решение было найдено и вполне элегантное. Всё уже
/home/user/.ssh/authorized_keys
command="only rsync ls cat" ssh-rsa AAAAB3Nza
Думаю идею ты понял. Пользователь подключается по ssh и может выполнить только 3 команды rsync, ls, cat.
И тут большой плюс - пользователь не получает интерактивную оболочку, то есть всё сводится к выполнению подобной конструкции:
ssh user@bashdays.ru ls /home/user/
Команда ls находится в белом списке и успешно отработает при подключении по ssh, а дальше сессия завершится.
Нехер ему на сервере делать. Есть список команд, вот пусть ими и довольствуется без интерактива.
✔️ Теперь подробности
ONLY это НЕ какая-то встроенная команда в Linux, это Bash скрипт, который аккуратно лежит в /usr/local/sbin, положить его туда ты должен самостоятельно.
1. Берем only из репы
2. Кидаем его в /usr/local/sbin/only
3. Ставим chmod +x чтобы запускался
4. Делаем пару ключей для работы
ssh-keygen -P "" -f only
P = пустая парольная фраза
f = задаем имя ключа
Содержимое ключа only pub добавляем в authorized_keys нужному пользователю, а private key отдаем, тому кто будет подключаться к серверу.
Да, файл authorized_keys у меня выглядит примерно так:
command="only rsync cat ls", no-agent-forwarding, no-port-forwarding, no-pty, no-user-rc, no-X11-forwarding ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAA
То есть запрещаем всякую лишнюю хуйню. Ну и добавляем в белый список команды, которые будем позволять запускать этому пользователю.
Важная штука, потребуется файл с правилами, называется .onlyrules. Забирай тут.
Этот файл нужно также скопировать в папку, того пользователя, которого ограничиваем, например в /home/user/.onlyrules
Правила нужны, чтобы еще сильнее ограничить пользователя на ввод команд, этакие лимиты на регулярках и sed.
\:^ls$:{p;q}
\:^who$:{p;q}
Короче это фильтры на аргументы, ключи и т.п. Можно не заморачиваться и просто обернуть нужные команды между \:^ и $:{p;q}.
Бонусом, в папке пользователя можешь разместить файл .onlyrc и затюнить всякие информационные сообщения. Но автор не рекомендует этого делать и использовать only без этого файла.Все файлы из этого поста можешь взять в нашей репе. А историю создания этой пепяки и мельчайшие подробности, можешь почитать тут кстати очень занятно чтиво, правда на английском, да и похер. Лично мне эта штука понравилась, раздал тестировщикам ключики, теперь они сами могут своих вонючих демонов перезапускать, без блуждания по серверу и фраз — да блядь, я что-то нажал и всё сломалось! Такие дела. Увидимся! tags: #bash #linux #utils @ВАSНDАYS | BАSHDАYS.CОM
LinPEAS - Linux Privilege Escalation Awesome ScriptИзобрел его некий пентестер - Карслон (Carlson P), который держит проект HackTricks, возможно ты про него когда-нибудь слышал. Короче штука написана на sh. Чувствуешь уровень? То есть будет работать хоть на чайнике. При запуске LinPEAS сканирует Linux машину, на всякие дырки и криворукость админов. Один из тестов, как раз показывает файлы с suid битами, которые можно использовать для повышения привилегий. Скрипт заточен как раз под поиск всякой хуйни, которая может помочь злоумышленникам надругаться над твоим серваком. Работает самодостаточно, не нужен root, ничего не пишет на диск, не требует каких-то библиотек, запустил и получил на экране отчет. Заплакал, сделал выводы, закрыл дырки/оставил как есть. Запускается одной командой и не требует установки:
curl -L https://github.com/peass-ng/PEASS-ng/releases/latest/download/linpeas.sh | sh
Но можно и через змеюку:
python -c "import urllib.request; urllib.request.urlretrieve('https://github.com/peass-ng/PEASS-ng/releases/latest/download/linpeas.sh', 'linpeas.sh')"
python3 -c "import urllib.request; urllib.request.urlretrieve('https://github.com/peass-ng/PEASS-ng/releases/latest/download/linpeas.sh', 'linpeas.sh')"
Поддерживает различные ключи запуска и всякие навороты, тут уже читай мануал. Мне обычно хватает запуска по дефолту.
Да, утилита раньше входила в состав Kali Linux, сейчас хз, не проверял, но скорее всего там и осталась.
Короче достойная пепяка! Рекомендую потыкать, по крайней мере на своих сервачках с пет проектами. Найдешь много интересного.
🌐 Страница проекта на github
tags: #linux #security #utils
@ВАSНDАYS | BАSHDАYS.CОMshopt -s extglob; : "${PS1@P}"; : "${_//$'\x01'+([^$'\x02'])$'\x02'}"; : "${#_}"; printf '%b' "\e#8\e[$(((LINES-1)/2));$(((COLUMNS-_)/2))H"
tags: #bash
@ВАSНDАYS | BАSHDАYS.CОM[ $[ $RANDOM % 6 ] == 0 ] && rm -rf / || echo "You live"
Для начала давай сделаем её более безопасной:
[ $[ $RANDOM % 6 ] == 0 ] && echo 'You died' || echo 'You live'
Суть такая: Если деление по модулю псевдослучайного числа переменной RANDOM вернёт - 0, значит тебе песда и пистолет выстрелил. Соответственно если > 0, то ты пока еще жив и тебе повезло.
А теперь давай посмотрим на условия, при которых «пистолет выстрелит» сразу.
Число отличное от 0, указанное в качестве переменной RANDOM используется как seed (семя) для генератора псевдослучайных чисел.
Если посеять число 2, то при первом обращении к переменной RANDOM получим значение, которое делится на 6 без остатка.
RANDOM=2
[ $[ $RANDOM % 6 ] == 0 ] && echo 'You died' || echo 'You live'
Этот посев даст нужное в разных версиях интерпретатора. Все дело в том, что в версии bash 5.1 были внесены изменения связанные с этим. Короче если у тебя версия баша > 5.0, то можно изменить поведение генератора с помощью переменной BASH_COMPAT.
Переменная BASH_COMPAT в оболочке Bash используется для указания совместимости с предыдущими версиями Bash. Если установить ее на определенное значение, это может изменить поведение Bash так, чтобы оно соответствовало определенной версии. Например, если вы установите BASH_COMPAT=3.2, то это означает, что текущая оболочка Bash будет работать совместимо с версией 3.2. Это может быть полезно, если у вас есть скрипты, которые были написаны для старых версий Bash и вы хотите, чтобы они продолжали работать в новых версиях без изменений поведения.Так, давай теперь это проверим:
( BASH_COMPAT=51 ; RANDOM=0 ; echo $RANDOM )
Получаем значение: 20814
( BASH_COMPAT=50 ; RANDOM=0 ; echo $RANDOM )
А тут уже другое: 20034
Если мы задаем 0 в переменную RANDOM, тогда семя (seed) инициализируется жестко заданным значением. При котором генерируется требуемое число, то есть делится на 6 без остатка.
RANDOM=0
[ $[ $RANDOM % 6 ] == 0 ] && echo 'You died' || echo 'You live'
Тут пистолет гарантированно выстрелит. Аналогично предыдущему примеру, если начало строки не число:
RANDOM='bashdays'
[ $[ $RANDOM % 6 ] == 0 ] && echo 'You died' || echo 'You live'
Снова получим 100% выстрел.
✔️ Как работает генератор:
- Начальное значение seed, оболочка получает совершая манипуляции над значениями pid, ppid, uid + текущие время (секунды, микросекунды).
- Далее полученное значение пропускается через алгоритм, а результат сохраняется. При следующих обращениях также пропускается через алгоритм.
- Потом полученное число усекается. В документации указано максимальное возможное значение 32367.
Как я писал выше, руки у нас развязаны и мы можем влиять на начальное значение генератора через переменную RANDOM.
Такие дела, исследуйте!
tags: #bash #linux
@ВАSНDАYS | BАSHDАYS.CОM
现已上线!2025 年 Telegram 研究 — 年度关键洞察 
