es
Feedback
Bash Days | Linux | DevOps

Bash Days | Linux | DevOps

Ir al canal en Telegram

Авторский блог от действующего девопса Самобытно про разработку, 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.

23 788
Suscriptores
+124 horas
-217 días
-22630 días
Archivo de publicaciones
Охохо, привет! Размазывать бытовуху не буду, сразу к делу. В bash есть офигительная команда, называется она «readonly». С помощью неё ты сможешь защитить любую переменную от изменения. Получается этакая константа, которую довольно сложно перезаписать. И не дай бог кто-то решит ее перезаписать, получит в лоб ошибкой:
bash: VAR: readonly variable
Буквально сегодня ебался со скриптом уволившегося коллеги и не мог понять, какого лешего я получаю неочевидные результаты. Оказалось, всё очень даже очевидно. Этот скуфяра мало того что применил ООП в скриптах (это пиздец), так еще и воспользовался «readonly». Спасибо тебе дорогой друг. Надеюсь на новом месте, тебе такого с кубернейтсами не позволяют делать. Диверсант блядь.
Еще раз, НЕ НУЖНО УСЛОЖНЯТЬ, ООП и выкрутасы оставь для программистов.
Ладно. Теперь про «readonly». Если не можем победить, значит нужно изучить и победить. Это как в анекдоте 18+: Я ебу все что движется, а всё что не движется, я двигаю и ебу. Поехали двигать! Переменная защищается так:
readonly VAR=1234
Если её попытаться переопределить, то моментально отправляешься в пешее эротическое. Возникает логичный вопрос — как её откатить обратно и сделать нормальной переменной? В голову приходит логичный ответ, сделай так:
unset VAR
А вот и нет! Сразу получишь хуем ошибкой по башке: bash: unset: VAR: cannot unset: readonly variable. Хм… интересное кино. А чо делать? Не использовать «readonly»! Ну а если пришлось с этим столкнутся, придется использовать древнюю магию. Мы её кстати недавно использовали в этом посте. Чтобы заансетить константу, открываем «Ящик Пандоры»:
gdb -ex 'call (int) unbind_variable("VAR")' --pid=$$ --batch
Если получил $1 = 0, значит всё прошло успешно. Такими консервированными переменными хорошо манипулировать во всяких конфигах, например в .bashrc и т.п. Если кто-то захочет что-то переопределить, у него ничего не получится. Защита от дурака. Но помни, что древняя магия gdb может не сработать на этом проклятии, если ты не root. Например, можно защитить переменную PATH от вмешательств и ни одна собака его не зареврайтит. И порой даже ты сам. В общем изучай. Хороших тебе предстоящих выходных и береги себя! tags: #bash #linux @BASHDAYS

Работать и не уставать, достигать цели, но делать это в кайф - реально! Как научиться делать дела и не выгорать? Психолог взр
Работать и не уставать, достигать цели, но делать это в кайф - реально! Как научиться делать дела и не выгорать? Психолог взрослого человека - канал для айтишников, у которых периодически опускаются руки и отключается мозг, ибо переработки и постоянная тревожность не приводят к другим исходам. ▪️ Как научиться отвлекаться от работы и отдыхать? ▪️ Как совместить кучу рабочих задач и время с семьей? ▪️ Как справиться с прокрастинацией? ▪️ Как не растерять запал, даже если начальник и коллеги 💩 и кажется, что ничего не выходит? Подписывайтесь на канал @vadimpetrov_psy и научитесь работать без упахивания, выгорания и ущерба для личной жизни! 👨🏻‍💻 Псс. Заходите в закреп канала - там много полезного, и даже бесплатный мини-курс. Реклама. ООО «ТД «Степмотор», ИНН: 7804501708, erid: 2VtzqwMJebM

Что случится, если отключить буферизацию Привет. Чтобы результаты вывода софта/скриптов отображались без задержек в реальном времени — отключи буферизацию. На практике, эффект буферизации незаметен, либо софт/скрипты и так работают в реальном времени. Распространенный случай. Ты всяко с таким сталкивался: запустил программу, которая пишет данные в файл. И пока софтина не отработает, файл с результатами, визуально пустой. Грыжа! Но хочется же в реальном времени наблюдать, как файл заполняется и делать выводы. А что если софтина работает 10 часов? А выхлоп нужен вчера?
/usr/local/sbin/script.sh &> bashdays.log
Проблема этого условного скрипта, в том, что файл bashdays.log создаётся только, после выполнения скрипта. Как отслеживать прогресс? Воспользуйся отключением буферизации! Всё делается с помощью утилиты stdbuf. Утилита изменяет способ буферизации программ.
stdbuf -oL /usr/local/sbin/script.sh &> bashdays.log
Ключ «o» взаимодействует со стандартным выводом (stdout). А аргумент «L» означает Line buffered, то есть, буферизация по строкам.
По умолчанию при перенаправлении в файл, стандартный вывод (stdout) полностью буферизуется и записывается в файл после сброса.
В примере выше, буфер очищается после каждой строки вывода. А в файле bashdays.log появится долгожданный результат, без мучительного ожидания. Одно из применений stdbuf:
stdbuf -oL nohup /usr/local/sbin/script.sh &> bashdays.log
Если закрыть вкладку с сессией, скрипт продолжит работу. Либо можешь воспользоваться утилитой script:
script -c <PROGRAM> -f bashdays.txt
Ключ «f» выполняет аналогичную функцию, после каждой операции, запускается flush, запись на диск. На этом смею откланяться, хорошего дня/вечера! tags: #bash #linux @BASHDAYS

🏆 Чтобы получить новые знания, опыт совместной работы и общение с лучшими экспертами, пройдите предварительную регистрацию в
🏆 Чтобы получить новые знания, опыт совместной работы и общение с лучшими экспертами, пройдите предварительную регистрацию в Летних школах Яндекса 2024! Больше 50% выпускников становятся стажёрами и сотрудниками Яндекса💪 В этом году будет запущено больше школ: 🔸 Школа бэкенд-разработки; 🔸 Школа разработки интерфейсов; 🔸 Школа мобильной разработки; 🔸 Школа менеджеров Яндекса; 🔸 Школа аналитиков-разработчиков. После лекций в онлайне будет практика в офисах Яндекса в Москве, Санкт-Петербурге и Екатеринбурге. Вам оплатят проезд и проживание, если вы из другого города📍 👉Подать заявку

🅰️🅰️🅰️ 7 причин, почему коты делают «тыгыдык» Вчера наконец-то собрался силами и добрался до иммобилайзера, всего-то понадобилась неделя. За 5 дней я знатно себе так жопу отморозил без автозапуска. Починил, правда палец сука порезал. Ну это капля в море, на фоне всратых сервисов и неоправданных счетов за ремонт. Благо сейчас есть интернет, где можно найти буквально любую инфу по багфиксу хоть чего, главное не ссать. Разобрал, посмотрел умным взглядом, собрал, если пару лишних деталей осталось, то уже успех. Ну и вот, к чему это я. Спустя несколько лет жизни на алиасах, у меня дошли руки забиндить себе в bash хитрую хоткейку. Сейчас покажу очередной велосипед, который сэкономит мне еще пару секунд прибывания в консоли. А может быть и ты куда-нибудь себе это присобачишь. Погнали! Есть у меня сервер, на нем крутится самописная bastion оболочка. Как это работает: 1. Цепляюсь в bastion 2. В консоль вываливает список серверов 3. Коннект к серверу ssh <index> То есть bastion у меня единая точка входа чтобы попасть на другие сервера, даже если на них нет белых айпишников.
Bastion я написал, впечатлившись этим решением от ITSumma, которое называется isolate.
Как я подключался раньше
> ssh user@bastion.bashdays.com
Как я подключался потом
> export alias bas="ssh user@bastion.bashdays.com"
> bas
Как я подключаюсь сейчас
> alt+b
Прям эволюционный роадмэп. Интересно, какая стадия будет следующей. Итак, повесил я подключение на хоткей, стало довольно удобно. Только открылась консоль, бряк alt+b и я уже внутри. Хоткей вешал так, добавив это в .bahsrc:
bastion() {
    echo "connect to bastion server"
    ssh -t qa@bastion.bashdays.com 'reset;bash'
}

bind -x '"\eb": bastion'
«ёб» в последней строчке, это как раз клавиша alt+b в кодах ANSI escape sequences. Если нужны другие кнопки, го в гугол, там этого полно. «-t» создаёт псевдотерминал, чтобы команды вводились на сервере, а не в текущей оболочке. А reset;bash понадобился, чтобы победить проблему с отображением команд, которые вводишь. Если убрать это хак, то когда будешь что-то вводить в консоли, это не будет отображаться на экране. В zsh я на быструю руку попытался подобное провернуть, оно даже подключается, но терминал впадает в бэдтрип Read Only, какая-то абстракция с псевдотерминалами. Пока руки не дошли докопаться до сути. Но если у тебя получится это завести, пиши в комменты, сделаешь ОЧЕНЬ нужное и доброе дело. Вот мои наработки для .zshrc:
bastion() {
    echo "connect to bastion server"
    ssh -tt user@bastion.bashdays.com
}

zle -N bastion
bindkey '\eb' bastion
Так, совсем забыл про котов, эту тему обязательно нужно обсудить. И дело тут не в блуждающем нерве. На хоткеи ты можешь повесить любую команду, любой комбайн, который только заблагорассудится, например можешь запускать vim или редактирование файла /etc/hosts. Короче изучай. И давай краба, жду тебя в комментах! tags: #bash #linux @BASHDAYS

💻 Готовим новое исследование отечественного рынка DevOps. Это большой разговор с топ-менеджерами и разработчиками, которые р
💻 Готовим новое исследование отечественного рынка DevOps. Это большой разговор с топ-менеджерами и разработчиками, которые развивают DevSecOps для разработки собственного ПО или внедрения готового продукта. 🔔 Примите участие в исследовании, регистрируйтесь по ссылке и получите результат первым! В фокусе исследования: ⚫️Текущее состояние рынка ИТ с фокусом на DevSecOps ⚫️Готовность перехода компаний на облачные технологии, взаимодействие с DevOps инструментами ⚫️Основные тренды в сфере безопасности DevSecOps ⚫️Рынок специалистов DevSecOps — где искать сотрудников и как изменились зарплаты ⚫️Рейтинги DevOps инструментов и оценка степени использования подходов DevOps в организациях Станьте респондентом Russia DevOps Report 2023. Результаты представим уже в апреле! Реклама. Информация о рекламодателе

Зима меня что-то прям знатно так подзаебала, тысяча одёжек, реанимация автомобиля в -40, то дождь за шиворот, то метель в морду лица. Всё же летом как-то попроще мне кажется, хотя и жара сильно изматывает. Нежные мы стали с этой удалёнкой, жёсткая зависимость от зоны комфорта. Ладно… Начинать неделю с ебобо-постов очень не хочется, поэтому давай расслабим булки и решим одну интересную, нетривиальную задачку. Можно ли после запуска скрипта, перенаправить STDOUT и STDERR в другое место, не останавливая сам скрипт/процесс? Ответ ты и сам знаешь, конечно можно! Ща покажу как. Чтобы все стало понятным, берем для эксперимента такую команду и запускаем ее в терминале.
tail -f /var/log/auth.log &
Запускаем в фоне просмотр логов авторизации. Задачка запустилась в фоне и отдала нам консоль обратно в интерактивное состояние. Как только в файле auth.log появляются новые записи, оно начинает нам срать в терминал, мешая дальнейшей работе. Хоть задача и запущена в фоне, но активно работает с текущим tty и stdout. Чтобы нам все это дело отправить в dev/null не останавливая фоновую задачу/скрипт. Проделываем следующий трюк:
ps aux | grep tail
Узнаём PID процесса, в моём случае это 1327692, далее смотрим файловые дескрипторы этого процесса:
ls -l /proc/1327692/fd
Получаем нечто подобное:
0 -> /dev/pts/1
1 -> /dev/pts/1
2 -> /dev/pts/1
3 -> /var/log/auth.log
Знакомо? stdout = 1 (поток вывода), stderr = 2 (поток с ошибками) и т.п. Уже наталкивает на мысль чо будем делать? Нет? Поехали дальше. Теперь каким-то образом, надо зареврайтить это говнище в dev/null. Для этого будем использовать утилиту gdb, она обычно идет в коробке либо ставится через апт-инсталл.
gdb - отладчик для программ, написанных на Си. Отладчик позволяет выполнить программу пошагово, посмотреть значения всех переменных на каждом из этапов выполнения, а если это необходимо, то и дизассемблировать код и посмотреть состояние регистров процессора.
Запускаем кракена:
gdb -p 1327692 /usr/bin/tail
Подключаемся к процессу 1327692 и указываем путь до tail. На экран вывалит кучу всякого мусора, не пугайся, он тебе не нужен. Всё, теперь ты находишься в «хакерской» оболочке (gdb), начинаем реврайтить говнище. Вводим такие команды:
p (int) dup2((int) open("/dev/null", 0), 1)
p (int) dup2((int) open("/dev/null", 0), 2)
На экран получишь нечто подобное:
$1 = 1
$2 = 2
После этого закрываем gdb:
detach
quit
Вот и всё. Говнище из auth.log перестало выводиться на экран, хотя фоновый процесс продолжает работать. Смотрим что у нас получилось:
ls -l /proc/1327692/fd
И видим что наш реврайт сработал:
0 -> /dev/pts/1
1 -> /dev/null
2 -> /dev/null
3 -> /var/log/auth.log
4 -> anon_inode:inotify
5 -> /dev/null
6 -> /dev/null
Теперь stdout(1) и stderr(2) смотрят в dev/null, собственно этого мы и желали добиться. Разберем команды gdb «p» (print), выводим результат команды на экран. «dup2», дублирует файловый дескриптор. Первым аргументом идет файловый дескриптор, который нужно продублировать. Второй аргумент это новый файловый дескриптор, который нужно использовать. Все это дело приводим к типу Int, хотя раньше и без этого всё отлично работало, видимо что-то поменялось. И получается такое: Команда сначала открывает файл dev/null, затем дублирует его файловый дескриптор, а затем перенаправляет stdout в этот файл. Прозрачно? Прозрачно! Вот такие пироги. Надеюсь было интересно.
Кстати чтобы не упарываться с gdb, существует софтина под названием reredirect, делает то же самое, если интересно, можешь потыкать, ссылка git на репозиторий.
Ставь лайк, подписывайся, рекомендуй друзьям. Хорошей тебе рабочей недели! tags: #bash #linux — 💩 @bashdays

KTS и Yandex Cloud приглашают на вебинар: Динамические окружения для stateless- и stateful-сервисов На совместном вебинаре 12
KTS и Yandex Cloud приглашают на вебинар: Динамические окружения для stateless- и stateful-сервисов На совместном вебинаре 12 марта в 12:00: ❇️ Расскажут, какие проблемы динамические окружения помогают решать в командах разработки ❇️ Рассмотрят тонкости развертывания и тестирования Stateless и Stateful сервисов ❇️ Поделятся опытом KTS в создании подобной инфраструктуры и возможностями улучшения этого процесса ❇️ Расскажут, на что стоит обратить внимание при создании подобных инструментов Посмотреть более подробную программу можно на странице вебинара. 👉 Ссылку на трансляцию можно получить в нашем боте Ждем вас 12 марта! Реклама. ООО «СТУДИЯ КТС», ИНН: 7733257480, erid: 2VtzquprNev

О чо на почту сегодня прилетело. Вчера в чатике видел, ссылка уже пролетала от Константина, но чет значения не придал. А посл
О чо на почту сегодня прилетело. Вчера в чатике видел, ссылка уже пролетала от Константина, но чет значения не придал. А после этого письма придал. Идем по этой ссылке и тыкаем какой сервак запустить в браузере, с виндой или линуксом. Проходим капчу если необходимо. Если не запускается, значит мешают всякие adguard и т.п. плагины. У меня в яндекс браузере сразу не заработало, а вот в чистом фоксе норм взлетело. Короче под капотом Debian 12 или Windows Server 2016 (14393.6709) Длительность онлайн сессии 15 минут. С докой по сервакам, можешь ознакомиться здесь, там с картинками и всеми подробностями. Винда немного подтормаживает, возможно из-за мобильного интернета, но вот пингвин прям как родной запускается. Ради интереса проверил лицензию winrar, на момент закралась мысль - а что если... Но нет, всего лишь пробная версия на 40 дней. Ну да ладно. Не знаю, буду ли я этим пользоваться, но в избранное добавил, возможно когда-нибудь пригодится, что-нибудь потестировать. Выжимка из доки: Мы создали ультимативное решение для частых задач в жизни каждого пользователя сети интернет, включая вашу потребность в: - дополнительном рабочем столе - виртуальном браузере для открытия любых веб-сайтов вне личного ПК - сервере для тестирования той или иной сомнительной программы - проверке собственного ПО и скриптов в виртуальной среде - тестировании консольных команд - проверки доступности вашего сайта или приложения - тестировании сайтов, приложений, программ в виртуальной среде - запуске социальной сети, мессенджера или сайта в режиме полного инкогнито - способе удалить папку system32 без риска для здоровья tags: #services — 💩 @bashdays

Время неумолимо. Кажется ещё сегодня пятница, а уже на горизонте маячит понедельник. Привет. Сегодня про сигналы и как с ними взаимодействовать через bash скрипты. Да те самые SIGINT, SIGTERM, SIGKILL. Вероятно ты про них слышал. Ладно, скажу больше, ты даже ими пользуешься. Банально нажимая CTRL+C, ты посылаешь сигнал SIGINT. Этот сигнал позволяет скрипту корректно завершить работу. Если прервать скрипт по нажатию CTRL+C, то вернется код ошибки 130 (echo $?). А откуда взялось 130? Потому что если процесс завершается из-за полученного сигнала, он возвращает значение, которое является суммой 128 и кода сигнала. SIGINT = 2, итого получаем 128+2=130.
Цифра 128 выбрана не случайно, сделано это для того, чтобы избежать конфликтов с другими возвращаемыми значениями процесса. Linux использует значения от 0-127 для обозначения различных ошибок и успешного завершения процесса. Поэтому значения от 128 и выше можно использовать для обозначения сигналов, приведших к завершению процесса, не создавая путаницы с кодами завершения процесса.
Для обработки сигналов, в Bash можно использовать обработчики. Спасибо, капитан! Пример обработки сигналов:
#!/bin/bash

# Функция для обработки SIGINT (Ctrl+C)
sigint_handler() {
    echo "Caught SIGINT (Ctrl+C). Exiting..."
    exit 1
}

# Функция для обработки SIGTERM
sigterm_handler() {
    echo "Caught SIGTERM. Exiting..."
    exit 1
}

# Установка обработчиков сигналов
trap sigint_handler SIGINT
trap sigterm_handler SIGTERM

# Главный цикл
while true; do
    echo "Script is running..."
    sleep 1
done
Скрипт запустит бесконечный цикл. Если нажать CTRL+C, сработает хендлер sigint_handler и скрипт завершится с кодом 1. Видишь, мы поменяли дефолтный код 130 на 1. А хендлер sigterm_handler сработает в том случае если скрипт убить через kill -TERM PID. Процесс так же завершится с кодом 1. Таким образом в хендлерах мы можем построить любую логику, например вывести слово «хуй». А если выпилить exit 1, то по нажатию CTRL+C скрипт вообще никак не отреагирует на завершение и продолжит выполняться дальше. БЕСКОНЕЧНО! Прям море возможностей открывается. В малварях частенько такой подход используют, именно с перехватом и подавлением сигналов. Но это не наша тема, просто для информации.
SIGTERM
= Этот сигнал обычно отправляется операционной системой при попытке завершения процесса. Обработка SIGTERM позволяет скрипту завершить работу безопасно и корректно освободить ресурсы.
Да, есть еще SIGKILL, а вот его обработать не получится. Он нужен для крайних мер. Например, если из скрипта выше убрать exit 1, то бесконечный цикл удастся завершить только через SIGKILL (kill PID). Ну ту тоже логично, всё продумано. Но я уверен, что и SIGKILL можно перехватить, правда пока лень с этим разбираться, всяко придется в ядро лезть в strace ковыряться и возможно что-то патчить. Существуют и другие сигналы SIGHUP / SIGUSR1 / SIGPIPE / SIGCHLD и т.п. но сути это не меняет, пост про перехват сигналов. Обработка сигналов, это как юнит тесты, они нужны, но никто их не пишет. Но в бест-практиках очень даже рекомендуется использовать такие обработки. В принципе на этом можно и закончить, тему разобрали, база есть, дальше уже от своих потребностей двигайся и наращивай функционал. На собесах кстати иногда спрашивают про обработку сигналов и если на этот вопрос ответить, оффер твой. Всех с пятницей, хороших предстоящих выходных и береги себя! Увидимся! tags: #bash #linux — 💩 @bashdays

Облачная платформа Selectel для любых ваших задач Разместить сайт, запустить приложение и быстро масштабировать проект любой
Облачная платформа Selectel для любых ваших задач Разместить сайт, запустить приложение и быстро масштабировать проект любой сложности можно на облачных серверах Selectel. Настроить базы данных, развернуть кластер Managed Kubernetes или загрузить данные в хранилище с поддержкой S3 API возможно прямо в панели my.selectel.ru. Кроме того, вы можете быстро настроить автоматические бэкапы сетевых дисков, а также настроить бесплатный облачный файрвол для фильтрации входящего или исходящего трафик приватной подсети. Преимущества облака Selectel для клиента: ◽️ Облачные серверы соответствуют 152-ФЗ. Это значит, что вы можете хранить и обрабатывать персональные данные до первого уровня защищенности включительно. ◽️ IAM-система разграничивает доступ к ресурсам и данным, определяет роли пользователей. Возможен вход в панель управления Selectel через SSO. ◽️ Развернуть инфраструктуру можно в удобной панели за пару минут. Если у вас возникнут вопросы, наша техподдержка ответит на них в любое время. Переходите по ссылке, чтобы подобрать решение под ваши задачи: https://slc.tl/bydps Реклама ООО «Селектел» erid 2Vtzqw3t4ZY

Привет друзья. Частый вопрос: Можно ли в bash скрипте, каким-то образом временно изменить текущий рабочий каталог для выполнения команды, но остаться в каталоге запуска? Да всё можно, а если говорят что нельзя, то это пиздёшь. Формулировка вопроса конечно замысловатая. Сходу в голову приходит вариант использовать cd (Change Directory), тип такого:
cd /tmp/test && ./exec_command
После запуска команды, переходим в каталог /tmp/test и выполняем exec_command. Логично? Логично! А что если после запуска этой команды, я хочу остаться в том же каталоге из которого запускал эту команду.
Про символы &&/;/|| и т.п. можешь почитать в этой статье.
Вот наглядно что происходит:
1. > pwd
2. /root
3. > cd /tmp/test && ./exec_command
4. > pwd
5. /tmp/test
В самой последней строке видим, что каталог изменился. А я хочу оставаться в root! Что делать? Есть способы, которые я лично использую в своих bash скриптах. Возможно есть какие-то и другие варианты, если знаешь, пиши в комментарии, будет полезно. Способ первый: Добавим в скрипт exec_command такой код:
ls
Запускаем то же самое в круглых скобках:
1. > pwd
2. /root
3. > (cd /tmp/test && ./exec_command)
4. a.txt  b.txt  c.txt  exec_command
5. > pwd
6. /root
7. > ls
8. profit
Что мы видим: после выполнения команды в скобках, отработала команда ls из скрипта и вывела на экран содержимое каталога /tmp/test. Как только произошла магия, всё вернулось обратно в каталог root и вывело на экран содержимое каталога root.
pwd я использую для наглядности, чтобы ты понял суть, в своих скриптах от этого мусора можно избавиться.
Способ второй pushd/popd:
1. > pwd
2. /root
3. > pushd /tmp/test
4. /tmp/test ~
5. > ./exec_command
6. a.txt  b.txt  c.txt  exec_command
7. > popd
8. ~
9. > pwd
10. /root
Механика аналогична первому способу. Но используются древние, инопланетные технологии pushd и popd, это коробочные аналоги cd из 80x годов. Местоположение предыдущих каталогов сохраняются в стек (массив). А потом уже из этого стека можно вытаскивать необходимое. Погугли если интересно, есть статейки. Ну и бонусом третий способ:
1. > pwd
2. /root
3. cd /tmp/test && ./exec_command
4. a.txt  b.txt  c.txt  exec_command
5. > pwd
6. /tmp/test
7. > cd -
8. /root
Здесь используем чистый cd, но для возврата в предыдущий каталог используем cd с параметром «-». В 99% случаев никто этим не пользуется, все привыкли в скриптах использовать cd туда-сюда с указанием полных/относительных путей. Но если посмотреть в скрипты коммерческих продуктов, в них активно используются методы с pushd и popd. Легаси? Возможно. Тут наверное дело больше в элегантности. У каждого свои бест-практики, нет неправильных решений. Если задача приносит ожидаемый результат, значит ты всё сделал правильно. Ладно, изучай, а я пошёл писать следующий пост про обработку сигналов. И нас тут уже 13к, идем дальше! tags: #bash — 💩 @bashdays

Начни свою карьеру в DevOps с курсом от DevOps фабрики! Без воды и траты времени, решай задачи подобранные из реальной практи
Начни свою карьеру в DevOps с курсом от DevOps фабрики! Без воды и траты времени, решай задачи подобранные из реальной практики. Не конвейер как в этих гигантских академиях, получай личную обратную связь и индивидуальные карьерные рекомендации от DevOps профессионалов. Узнай больше и попробуй бесплатно https://devops-factory.com/ Реклама. ООО Байкалтим, ИНН:3851008933, erid: 2VtzquZnhoG

Внимание, сейчас будем упарываться. Давно не упарывались. Камон в нашу ламповую лабораторию. Сразу не сбегай, возможно узнаешь что-то новенькое или окончательно засвистит фляга. Для начала давай создадим две подопытные папки:
mkdir /tmp/{.libs,.bashdays}
Теперь скопируем в них нативную утилиту cp (copy):
cp "$(which cp)" /tmp/.libs/lt-test
cp "$(which cp)" /tmp/.bashdays/lt-test
Скопировали, файлы назвали lt-test. Далее запускаем:
/tmp/.libs/lt-test example.txt .
В параметрах указываем файл, которого нет. На экран вывелось:
test: cannot stat 'example.txt': No such file or directory
А теперь запускаем:
/tmp/.bashdays/lt-test example.txt .
На экран получаем:
/tmp/.bashdays/lt-test: cannot stat 'example.txt': No such file or directory
Ну и внимательно сравниваем результаты:
1. test: cannot stat 'example.txt'
2. /tmp/.bashdays/lt-test: cannot stat 'example.txt'
Хм, всё же идентично, почему тогда результаты разные? В первом случае кусок названия запускаемого файла lt-test вообще обрезан. В первом случае путь и прёфикс lt был обрезан, потому что запуск утилиты был выполнен из директории .libs. Всё дело в функции set_program_name которую пихают в ГНУтые утилиты и программы. Эта функция модифицирует путь и имя утилиты если запуск был произведен из папки .libs, а затем присваивает результат переменным. А потом эти переменные используются для вывода при ошибках или при выводе страницы хелпа.
В GNU утилитах, функция set_program_name используется для установки имени программы, которое будет использоваться в выводе сообщений об ошибках, помощи и других местах, где требуется указание имени программы.
Ну и на закуску тест:
/tmp/.libs/lt-test --help | head  -1
/tmp/bashdays/lt-test --help | head  -1
Результат тот же:
1. bash: /tmp/.libs/lt-test --help
2. bash: /tmp/bashdays/lt-test --help
Вся эта байда в программах нужна для корректного отображения имени, при использовании ГНУТого инструмента libtool. Как это обрабатывается на самом деле, можешь глянуть в нативном исходнике на СИ здесь, там и про префикс lt и про .libs всё прекрасно структурировано. А здесь можешь ознакомиться с развёрнутым комментарием на эту же тему. Короче голову не грей, на этой неделе постараюсь подобным тебя больше не развлекать. Спасибо за внимание! tags: #linux — 💩 @bashdays

Как сисадмину перейти в DevOps? Чем DevOps отличается от SRE? Где найти работу в DevOps и как успешно пройти собеседование? О
Как сисадмину перейти в DevOps? Чем DevOps отличается от SRE? Где найти работу в DevOps и как успешно пройти собеседование? Ответы на эти вопросы — в канале «Люди и код». Команда канала беседует с опытными и начинающими разработчиками и программистами, находит интересные и неожиданные темы и помогает влюбиться в IT. Про мемы тоже не забываем :) Наши любимые материалы: 1. Кто такой DevOps? Инженер, программист, сисадмин или всё сразу? 2. Антон Косенко: «Работа SRE — это про нежность к инфраструктуре». 3. Ганна Новикова aka Ханна Монтана: «Я пришла в DevOps, потому что удалила прод». 4. Как стать программистом в 37 и найти работу после сотен отказов. 5. Барух Садогурский: «Называя DevOps профессией, мы нивелируем смысл термина». Подписывайтесь на канал «Люди и код»: @skillbox_media_code Реклама. ЧОУ ДПО «Образовательные технологии «Скилбокс (Коробка навыков)», ИНН: 9704088880 2VtzqvZKorY

Сегодня на собесе задал кандидату вопрос, а расскажи чем отличается && и «;» при склейке консольных команд. В ответ получил — а мне это зачем знать? Если с && не заработало, то поменяю на «;». Да и правда, у меня иногда такой же подход. Мне быстрее в моменте поменять одно на другое, чем в гугол лезть. Понятно дело если это выполняешь на критичной инфраструктуре, то такое уже не проканает. Нужно отдавать полный отчет своим действиям. Давай разбираться чем отличается:
command && command
от:
command ; command
&& (AND) это логический оператор, а вот «;» обычная последовательность действий. В первом примере с &&, вторая команда запустится, только в том случае, если первая завершится успешным кодом возврата. Соответственно если первая накроется пиздой, произойдет короткое замыкание и вторая команда даже не соизволит запуститься.
Про статусы и коды возврата можешь почитать в этом посте.
А вот в случае с «;», вторая команда запустится при любых обстоятельствах, конечно если это не kernel panic и при условии если в оболочке не включен set -e (завершение при любых сбоях). Да, есть еще конструкция:
false || echo "hello bashdays"
Тут у нас логический оператор OR (или). Вторая команда будет запущена, только если первая сыграет в ящик. В примере выше выполнится вторая команда, так как первая всегда завершается с ошибкой. Если false заменить на true, соответственно на экране будет пусто. Иногда применяю это в скриптах, когда одна утилита не смогла справиться, подключается вторая. База. Тут хочешь не хочешь, оно должно на подкорке быть. Интересно конечно, как людей на вайтишных курсах обучают. Человек отучился 6 месяцев, администратор Linux, диплом. А в голове обезьяна тарелками стучит, администрирует. Хотя тут всё от человека зависит, если ему это не интересно, то никакие курсы ситуацию не изменят. Ладно, всякое бывает. Не смею больше задерживать. Спокойной ночи. Увидимся! tags: #bash #linux — 💩 @bashdays

Возможность для всех, кто работает с Linux и хочет прокачаться. CROC Cloud Services запускает программу обучения: погружение
Возможность для всех, кто работает с Linux и хочет прокачаться. CROC Cloud Services запускает программу обучения: погружение в DevOps + прокачка в Linux. Если пройдешь на программу — трудоустраивают и платят зарплату, пока учишься. Обучение с практикой, лабораторными и под контролем экспертов из CROC Cloud Services. Курс проходит офлайн в Москве, но регионы могут подключить онлайн — пробуйте. Подробности тут. Реклама. ЗАО “КРОК инкорпорейтед”

Доброе утро! Все выходные разгребал бухгалтерию, да готовил рекламную кампанию на завтра. Даже баг мимолётом поправил у клиента. После подключения ddos-guard, мониторинг сильно засопливил. Ну тут очевидно, docker контейнеры с экспортерами снимают показатели по домену, а домен-то теперь за ddos-guard, пришлось прокинуть hosts файл и ходить напрямую за метриками. Ладно. Сегодня на повестке дня: Зачем добавлять ./ перед исполняемым файлом или скриптом. Когда я только начал изучение linux, я столкнулся с проблемой, что не могу выполнить bash скрипт. Вроде и атрибут +x указан, но после запуска получал идинахуй:
script.sh: command not found
Интернета тогда не было, максимум на что я мог рассчитывать это Фидонет. Но он мне не понадобился, методом тыка я самостоятельно смог решить задачу с запуском. Наверное знания MSDOS как-то натолкнули поставить перед скриптом символы ./ Но почему так? Это же не логично! Нет, всё логично. Это сделано для безопасности и от кривых рук. Например: Работаешь ты под рутом, заходишь в домашнюю папку какого-нибудь пользователя, делаешь ls и хуяк, нет у тебя больше сервера. А что произошло? А произошло то, что в папке пользователя лежал бинарник под названием ls. Который содержал руткит, он то и выполнился. Хотя ты ожидал что выполнится нативная утилита ls. Вот поэтому если запускать какую-то дичь или скрипт БЕЗ ./ то оболочка будет искать эту дичь/скрипт в указанных каталогах. Которые определены в PATH. Соответственно если домашний каталог пользователя не определен в PATH, то и возникает ошибка command not found. А вот когда указываешь ./script.sh ты говоришь оболочке - Эй бля! Игнорируй PATH и запускай мне эту пепяку! Да, вот прям отсюда! Аналогично можно запускать указывая полный путь к программе/скрипту:
cd ~
./script.sh

# или

/home/user/script.sh
Здесь так же PATH будет игнорироваться. Но вопрос остается: Как это может быть мерой безопасности, если эта мера обходится банальным ./ ? Нууу… это больше для предотвращения несчастных случаев. Указав явно ./ ты говоришь оболочке - запусти конкретно этот файл из текущего каталога, а не тот который может лежать в PATH. Как вариант, можешь добавить точку в PATH и тогда можешь запускать скрипты без ./ например:
export PATH=$PATH:.
script.sh
Добавляем текущий каталог в PATH. Теперь script.sh выполнится, без указания этого хитрого ./ Но так делать не рекомендуется, наступишь на грабли или даже на граблища! Так, теперь про cron. Если хочешь чтобы твои скрипты гарантировано запускались в cron, всегда указывай полные пути до программ/утилит. Так как cron может смотреть в какой-то свой PATH или вообще через sh запускаться. Встречал/встречаю я такие случаи. Поэтому рекомендуется писать скрипты в таком духе:
CAT=$(which cat)
$CAT script.sh
Определяем полный путь до утилиты cat, а потом уже используем как переменные. Даже если cat не найдется через PATH, скрипт в кроне будет выполнен, так как указаны полные пути. Заметки про PATH можешь глянуть в этом посте. Вот так. Хорошей тебе рабочей недели. Вечерком после интеграции закину еще чтива. На связи! tags: #bash #linux — 💩 @bashdays

С праздником господа! 🍻
С праздником господа! 🍻

С наступающим! Давным-давно я избавился от OpenVPN и сейчас активно продолжаю использовать WireGuard. Даже порой связываю продакшен сервера wg тоннелями в разных регионах, где нет возможности это сделать из коробки. Стабильно, быстро, бесплатно. Всё было хорошо, пока я не повзрослел и не познал джаззз установил себе Windows. Ну и естественно запихал туда официальный гуёвый клиент от wg. А что могло пойти не так? А всё! Клиент в рандомный момент показывал средний палец и работал через хуй копыто. Приходилось его выгружать, перезапускать службы, иногда передергивать софтверно сетевую карту, чтобы не ребутить машину. Ну такое себе удовольствие… Мне блять/блядь работать надо, а я тут утехами занимаюсь. Так я ебался с полгода, но в этот понедельник меня это окончательно заебало! Пошел искать альтернативы, конкретно гуишного клиента. Потому что сама технология wg меня устраивает, не устраивают эти постоянные глюки. И да, я много гуглил про эти проблемы, они имеются и фиксятся именно, так как я их и фиксил, перезагрузками, службами и другими костылями. Короче перебрал я разные клиенты, всё шлак, ну и наткнулся на гитхабе на что-то приличное, простое и даже с фичами. Называется эта штука TunnlTo. Работает в коллаборации с WireSock. По бенчмаркам обгоняет даже официальный WG клиент. На странице проекта там все подробно описано, можешь самостоятельно ознакомиться. Чо понравилось: 1. Не глючит, шустрый, не виснет 2. Поддержка импорта тоннелей из официального wg клиента 3. При загрузки ОС можно автоматом подключать/не подключать VPN 4. Разделение приложений, кто идет через VPN, а кто нет 5. Ну и конечно другие фичи, какие хз, мне 4х хватает В общем мне пока нравится. Заточено под винду, но у маководов и линукс-гиков и так всё хорошо, мой личный пруф. 💻 Страница проекта на github Неделька выдалась продуктивная и очень нервная, в плане работы, в плане домашней рутины, в плане партнерских интеграций. Надо уже новых коллег к нам приводить, а я всё фигнёй какой-то занимаюсь. Исправлюсь! На выходные сделаем небольшую паузу, буду готовить контент план, чтобы уж совсем из пальца темы не высасывать. Да и ты отдохнешь. В качестве серваков под VPN я использую AEZA. Да, можно оплачивать РФ картами, серваки там честные, даже GPT работает через них, бана пула адресов не замечено. Иногда раздают промо серваки по 1-2 евро. Кого заинтересует, держи рефссылку. Ссылка не моя, это Дмитрий, админ нашего чата порекомендовал этих ребят. Так что, не обессудь, нихуя не реклама, просто полезняшка 👇 https://aeza.net/?ref=370785 Ну а тебе и твоим близким желаю хороших предстоящих выходных, берегите себя ребят. Увидимся! tags: #utils #windows #networks — 💩 @bashdays