Bash Days | Linux | DevOps
Авторский блог от действующего девопса Самобытно про разработку, devops, linux, скрипты, сисадминство, техдирство и за айтишную жизу. Автор: Роман Шубин Реклама: @maxgrue MAX: https://max.ru/bashdays Курс: @tormozilla_bot Блог: https://bashdays.ru
Mostrar más📈 Análisis del canal de Telegram Bash Days | Linux | DevOps
El canal Bash Days | Linux | DevOps (@bashdays) en el segmento lingüístico de Ruso es un actor destacado. Actualmente la comunidad reúne a 23 788 suscriptores, ocupando la posición 5 702 en la categoría Tecnologías y Aplicaciones y el puesto 28 099 en la región Rusia.
📊 Métricas de audiencia y dinámica
Desde su creación el невідомо, el proyecto ha mostrado un crecimiento acelerado, reuniendo a 23 788 suscriptores.
Según los últimos datos del 19 junio, 2026, el canal mantiene una actividad estable. En los últimos 30 días la variación de miembros fue de -226, y en las últimas 24 horas de 1, conservando un alto alcance.
- Estado de verificación: No verificado
- Tasa de interacción (ER): El promedio de interacción de la audiencia es 23.40%. Durante las primeras 24 horas tras publicar, el contenido suele obtener 13.11% de reacciones respecto al total de suscriptores.
- Alcance de las publicaciones: Cada publicación recibe en promedio 5 567 visualizaciones. En el primer día suele acumular 3 119 visualizaciones.
- Reacciones e interacción: La audiencia responde de forma activa: el promedio de reacciones por publicación es 22.
- Intereses temáticos: El contenido se centra en temas clave como bashdays, linux, bash, docker, скрипт.
📝 Descripción y política de contenido
El autor describe el recurso como un espacio para expresar opiniones subjetivas:
“Авторский блог от действующего девопса
Самобытно про разработку, devops, linux, скрипты, сисадминство, техдирство и за айтишную жизу.
Автор: Роман Шубин
Реклама: @maxgrue
MAX: https://max.ru/bashdays
Курс: @tormozilla_bot
Блог: https://bashdays.r...”
Gracias a la alta frecuencia de actualizaciones (últimos datos recibidos el 20 junio, 2026), el canal mantiene la vigencia y un amplio alcance. La analítica demuestra que la audiencia interactúa activamente con el contenido, lo que lo convierte en un punto de referencia dentro de la categoría Tecnologías y Aplicaciones.
Отключение встроенных команды позволяет выполнить дисковую команду, имеющую то же имя, что и встроенная команда оболочки, без указания полного пути, даже если оболочка ищет встроенные команды перед дисковыми командами.Запускаем:
type test
И видим выхлоп: test is a shell builtin. То есть используется команда test встроенная в оболочку. А не та что лежит на пути в test: /usr/bin/test. А как нам воспользоваться дисковой версией этой утилиты? А вот так:
enable -n test
type test
И мы получаем уже такое: test is /usr/bin/test. Получается мы сделали некое переключение. И по факту используем разные версии test.
Чтобы включить обратно встроенную команду test в оболочке, выполняем:
enable test
Так окей. Что еще можно с этим интересного сделать? А можно подгрузить расширения поставляемые с оболочкой. Некие плагины, экстеншены. Для этого эти экстеншены нужно установить (если у тебя их нет:
apt/yum install bash-builtins
Все это дело установится в папку /usr/lib/bash/. В ней будут всякие mkdir, rm, sleep и т.п. По сути это те же дисковые команды, только экстеншены для оболочки.
Для начала узнаем дисковую версию команды mkdir:
mkdir --version
Ага, есть: mkdir (GNU coreutils) 8.32
Теперь загружаем экстеншен в оболочку:
enable -f /usr/lib/bash/mkdir mkdir
mkdir --version
Хе! -bash: mkdir: --: invalid option
Теперь запускаем:
type mkdir
И получаем: mkdir is a shell builtin, то есть теперь mkdir используется не системный (дисковый), а тот что подгружен в оболочку bash.
Например, ты снес все системные бинарники и у тебя есть только bash. Через подгрузку экстеншенов можно без проблем обслуживать свою операционную систему, даже если в системе пропали всякие mkdir и т.п.
Чтобы посмотреть что вообще подгружено в оболочку, воспользуйся командой:
lsof +fg -p $$
Получишь отчет по текущему процессу, что подгружено в данный момент в оболочку и используется.
С версии 4.4 в bash появилась переменная BASH_LOADABLES_PATH, с помощью нее ты можешь задать путь для поиска экстеншенов. Тогда при подгрузки этих модулей, не нужно будет использовать полные пути.
BASH_LOADABLES_PATH=/usr/lib/bash/
enable -f sleep sleep
Для чего это может все пригодится? Да черт его знает. Например, можешь собрать chroot окружение и не добавлять дисковые утилиты, а подгрузить только необходимые модули для встроенной оболочки.
Ну либо в ситуации когда ты случайно снес бинарники и нужно как-то админить и восстанавливать систему. В общем тут всё рассчитано на полный полет твоей фантазии.
Развлекайся )
tags: #linux #bash #utils
—
💩 @bashdays#! echo 'Have a nice bashdays' exitИ это тоже запустится:
# super comment echo 'Have a nice bashdays' exitНу и это аналогично залетит в сакцесфул:
echo 'Have a nice bashdays' exitТак что не обязательно указывать нашу любимую конструкцию #!/bin/bash, интерпретатор тот еще жук и учитывает такие нюансы. Если интересно поподробнее про это почитать, есть клевый мануал про всю эту суету с «ОнаВзрывает» или SheBang. Правда на английском, но с переводчиком вменяемо. Исследуйте господа и дамы. Всем котиков и доброй ночи 🚶♀️ 😎 ☠️ пойдука я дрыхнуть! А завтра наконец-то пятница и нет никаких ретроспектив и созвонов. Ура! tags: #linux #bash — 💩 @bashdays
iptables -L | jc --iptablesИ по итогу получаю годноту:
[{"chain":"INPUT","rules":[]},{"chain":"FORWARD","rules":[{"target":"DOCKER-USER","prot":"all","opt":null,"source":"anywhere","destination":"anywhere"},{"target":"DOCKER","prot":"all","opt":null,"source":"anywhere","destination":"anywhere"}..
Ну красота же. JC ограничена парсерами, но из коробки там прям на богатом все (около 50ти). Crontab, csv, ls, fstab, date, ping и т.п. Выбираешь парсер под нужную тебе задачу и получаешь готовый к работе массив данных.
Выдирать данные само собой будет удобно через jq, вкидываем его в пайп, пишем какой ключ нужен и получаем желаемое.
JC так же можно использовать как модуль в python, так что, тут не только у башников праздник.
🐱 Страница проекта на github
🟢 Установка: apt/yum install jc
Лично я jc никогда не применял, но порой встречал в скриптах. Изучай, когда-нибудь обязательно пригодится.
tags: #linux #bash #utilites
—
💩 @bashdays{
"login" : "user",
"password" : "12345678"
}
А в главном скрипте, который все это будет читать делаем так:
#!/bin/bash config="vars.json" login=$(jq -r '.login' < $config) passwd=$(jq -r '.password' < $config) echo $login echo $passwdТут это - говорим в config как называется файл с переменными, а далее с помощью офигительной утилиты jq парсим конфиг без кучи говнокода и слёз. Ключик -r означает, что выведется сырой текст (без кавычек и прочей нечисти). Попробуй убрать его и увидишь? что появятся кавычки, которые нам не нужны. jq - это мощный инструмент, позволяющий читать, фильтровать и писать JSON в bash. jq вообще очень крутая тулза, но увы в коробке ее нет, придется ставить через менеджер пакетов. Но это мелочи. Есть и другие способы работать с конфигами в bash, но как я выше сказал, json наше всё и мастхев. Изучай. tags: #linux #bash — 💩 @bashdays
#!/bin/bash
lock="/tmp/bashdays.lock"
[[ -f "${lock}" ]] || touch "${lock}"
(
flock -n -o -x ${fd_lock} || { echo 'Nice try' >&2; exit 0; }
sleep 100
) {fd_lock}<"${lock}"
Запускаем скрипт. Ничего полезного он не сделает, просто будет висеть 100 секунд. После того как ты запустил этот скрипт, в соседнем терминале попробуй запустить его же параллельно. В ответ ты получишь ожидаемое - Nice try.
Как только скрипт завершит работу, ты сможешь запустить его повторно.
Сначала создается lock файл если его нет, а далее начинается магия с дескрипторами и логикой.
Вместо sleep можно вставить запуск функции типа main() где и будет основная логика скрипта. Либо вообще через source (или точку) заинклудить свой скрипт. То есть можно сделать универсальную штуку, чтобы в каждый скрипт не пихать flock.
Делаешь один обработчик и передаешь ему параметром путь до скрипта + путь до lock файла. А обработчик через source подгружает уже полезную нагрузку.
Моё решение возможно не самое изящное, но рабочее. Изучай. Слышал что такое можно провернуть каким-то образом через сокеты, но особо не вникал. Если в комментах поделишься, будет очень полезно. Спасибо!
tags: #linux #bash #utils
—
💩 @bashdaysРеклама. ООО «Отус онлайн-образование», ОГРН 1177746618576echo 'some text' > test.txtЗатариваем его:
tar -cf test.tar test.txtТеперь открываем в hexdump:
hexdump -C test.tarhexdump — инструмент который используется разработчиками и отладчиками приложений. Он может преобразовывать файлы и данные в приятный и читаемый формат. Так, открыли. Смотри первую картинку к этому посту. Видишь root/root? Это имя владельца и имя группы файла. Так вот, при создании архива эти поля можно изменять. Давай изменим:
tar --owner='bash' --group='days' -cf test.tar test.txtОкей. Снова открываем в hexdump:
hexdump -C test.tarСмотрим вторую картинку. На ней видим интересную ситуацию, пользователь изменился на bash, а группа на days. НО в системе у нас нет такого пользователя и группы. Хотя ожидаемый результат должен быть — user/group not found или что-то подобное.
-rw-r--r-- bash/days 10 2023-10-23 05:09 test.txtБаг или фича? Причем если растарить такой файл (с ключом -p или без него), bash/days вернутся к root/root. А теперь создадим с user/user (этот пользователь и группа есть в системе).
tar --owner='user' --group='user' -cf test.tar test.txtРаспаковываем:
tar -xf test.tarИ видим ситуацию, что у файла test.txt пользователь и группа user/user. Великолепно! Вот такое интересное поведение. Из документации по тару по смещениям 108 и 116 находятся uid и gid.
char uid[8]; /* 108 */ char gid[8]; /* 116 */Давай посмотрим смещение 108:
hexdump -Cs108 -n8 test.tarполучаем:
0000006c 30 30 30 31 37 35 30 00 |0001750.|00000074Конвертим 0001750 в uid:
echo $(( 8#1750 ))Опа, получили 1000, что соответствует пользователю user. А если этот трюк провернуть с bash/days то получим uid того пользователя, под которым тарили файл. Короче как всегда везде есть свои нюансы и приколы, возможно обоснованные. Глубже копать не стал. Давай, увидимся вечерком! tags: #linux #debug — 💩 @bashdays
shopt -s cdspellshopt — встроенная команда оболочки, управляет опциями. Изменяет значение внутренних конфигурационных параметров оболочки. Далее делаем:
cd /va cd /otp cd /HomeХа! Мы попадаем в каталог var/opt/home. Понял/а? Эта надстройка в терминале исправляет ошибки. Клёва! Призывает древнейшее зло
shopt -s autocdТеперь вводим:
/etc/cron.d ~root .. ~-1. Переход в директорию
/etc/cron.d2. Переход в хоумдир рута 3. Переход в папку на уровень выше 4. Переход в предыдущую директорию Заметь что я не писал команду cd! Оно само… Хз на сколько это вообще практично, но как видишь такое возможно. Изучай, может станешь фанатом этой фичи ) tags: #linux #bash — 💩 @bashdays
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576, www.otus.ru# unlink /tmp/hardlink # unlink /tmp/fileСофтина очень молчаливая — как мужик. После удаления, она промолчит и ничего не выведет на экран. Команда unlink использует системную команду unlink, в то время как команда rm использует системный вызов unlinkat. Оба системных вызова практически одинаковы. Unlink не умеет работать с wildcard и globbing шаблонами. Так же ты не сможешь с помощью нее удалить каталог. Короче одни минусы. А нахрена тогда она нужна? Ооо брат, сейчас расскажу. Запускаем команду и пытаемся насильно удалить файл которого нет в каталоге:
rm -f test.txtИ получаем - НИЧЕГО. То есть rm -f не вернуло ошибку, что файл отсутствует. А если сделать так:
unlink test.txtполучаем ошибку:
unlink: cannot unlink 'test.txt': No such file or directoryТо есть если мне нужно будет обработать результат выполнения команды rm -f, то я не буду достоверно знать, а существовал ли вообще файл. Ведь rm -f мне ничего не вернуло/ Короче с unlink можно гибче обрабатывать эксепшены в скриптах. А еще при использовании команды unlink отсутствует проверка безопасности. Она удалит файл, защищенный от записи. Хотя современная версия rm теперь тоже так умеет. Оффтоп. Ну а если хочешь, чтобы твой файл никто не смог удалить, включая root, делай так:
chattr +i test.txtchattr позволяет устанавливать и отключать атрибуты файлов, на уровне файловой системы не зависимо от стандартных (чтение, запись, выполнение). Ключ i - сделает файл неизменяемым. Чтобы снять с файла этот аттрибут, в команде которая выше, замени знак «+» на «-». Подытожим. Для большинства повседневных задач конечно rm мастхев, но если ты пишешь софт для каких-то критичных систем, стоит не упускать из виду unlink. Увидимся вечером. tags: #linux #bash — 💩 @bashdays
#!/bin/bash echo $UID > /tmp/test.txt unlink /tmp/test.txtUID обозначает идентификатор пользователя, то есть номер, назначенный каждому пользователю Linux. 1. Записываем во временный файл /tmp/test.txt этот самый UID. 2. Удаляем временный файл. Почему не rm а unlink? Потому что в моём случае это был именно unlink, который я нашел просматривая лог strace. Чем отличается unlink от rm, расскажу в следующих постах. Так, подопытный скрипт есть. Запускаем так:
strace -yfe inject=unlink:error=EACCES ./script.shВ этой конструкции мы говорим strace, чтобы проинжектил наш системный вызов unlink и передал ему насильно ошибку EACCES (Permission denied). В тот момент когда скрипт попытается удалить временный файл, наша инъекция не даст ему это сделать и завершит скрипт с ошибкой:
[pid 677954] unlink("/tmp/test.txt") = -1 EACCES (Permission denied) (INJECTED)
А сам временный файл останется на диске. Открываем его и смотрим, что же там внутри происходит.
По умолчанию инъекция будет сделана всем системным вызовам unlink, но есть возможность указать диапазон или конкретный индекс срабатывания. В этом посте можешь глянуть как узнать конкретный индекс (смотри строчку с when=4+).
В моем случае я увидел кусок своей выгрузки, которая резко прерывалась. Ну а дальше всё стало очевидным, что-то где-то не успевает. Включил таймер и нашел закономерность в 30 секунд, посмотрел дочерние процессы которые плодились и обнаружил активность этой зачищалки.
Отдал результаты дебага разработчикам, фиксить это конечно никто не стал, такой гемор никому не нужен. По итогу ребята с нуля переписали на golang и сразу чудным образом нашлась документация. Жиза.
Вот такие приключения порой случаются. Изучай. Хорошего дня!
tags: #linux #debug #bash
—
💩 @bashdays
¡Ya disponible! Investigación de Telegram 2025 — los principales insights del año 
