Bash Days | Linux | DevOps
23.3K subscribers
152 photos
25 videos
665 links
Авторский канал от действующего девопса

Самобытно про разработку, devops, linux, скрипты, сисадминство, техдирство и за айтишную жизу.

Автор: Роман Шубин
Реклама: @maxgrue

MAX: https://max.ru/bashdays

Курс: @tormozilla_bot
Блог: https://bashdays.ru
Download Telegram
Задался вопросом какая же все-таки оболочка быстрее? У меня на серверах можно встретить такой зоопарк: sh, bash, ksh, mksh, posh, zsh. Почему так много? Не знаю, сервера достались по наследству, видимо остатки от давно сгинувших девопсов по реке Стикс.

На своей локальной машине использую исключительно zsh со всякими наворотами:

🐱 Oh My Zsh - прибомбасина для zsh
🐱 autosuggestions - автокомплит

На серверах алогично Oh My Zsh + autosuggestions ну и нативный bash для скриптов, все остальное — неведомая хрень.

Автокомплит мастхев, экономит кучу времени, чтобы не тыкать стрелочку вниз вверх. Вводишь начало команды и оно тебе с хистори автоматом уже подгоняет варианты. Не надо каждый раз упарываться и писать всю команду целиком. Удобно!

Дополнительно из плагинов включаю 🐱 zsh-syntax-highlighting чтобы красивенько было. Ну а чтобы каждый раз не указывать ssh ключи при подключении к серверам, использую встроенный плагин ssh-agent.

plugins=(git zsh-syntax-highlighting zsh-autosuggestions ssh-agent)
zstyle :omz:plugins:ssh-agent agent-forwarding on
zstyle :omz:plugins:ssh-agent identities home_rsa work_rsa2 her_rsa3
zstyle :omz:plugins:ssh-agent lifetime

Вернемся в теме - кто быстрее. Очевидно же что bash! Давай убедимся.

Запустим этот скрипт в bash:

for i in $(seq 1 1000);
do bash -c ":" ;
done

Запускаем через time: time bash speed.sh

time - оценивает по времени производительность любой задачи, выводя после её завершения затраченное время: реальное, пользователя и системы. Через time можешь оценивать производительность по времени любых своих скриптов.

После запуска получаю: 0m1.242s

Скрипт отслеживает точное время открытия шелла 1000 раз без выполнения каких-либо операций.

Ок, теперь давай запустим этот скрипт в zsh: time zsh speed.sh

Результат: 0m1.344s

Не такие и большие различия. Даже можно сказать ничтожные. Но это всего лишь один тест. Чтобы получить какие-то средние значения воспользуемся утилитой:

🐱 shellbench

Устанавливаем
и запускаем:

git clone https://github.com/shellspec/shellbench.git .
shellbench -s bash,zsh sample/*

По итогу получаем около 28ми тестов. На картинке можешь глянуть мои результаты. Числа в таблице это - количество выполнений в секунду.

Хм, в совокупности тестов получается что zsh где-то прям намного шустрее, да даже ни где-то, а прям почти лидирует в производительности.

По большей части это писькомерство, ну работает оно и работает, какая разница насколько быстрее. Да, соглашусь, но пару раз встречал ребят которым ставили задачу на оптимизацию выполнения скриптов, где важна каждая секунда. Это как у оверклокеров, где каждый герц и фпс это уже победа.

Вывод: По результатам тестов, zsh оказался быстрее чем bash, но не везде. Опять-же тут все индивидуально.

Кстати когда запускаешь на macos midnight commander + zsh в роле оболочки, то mc запускается прям кое как, секунды три наверное. Поэтому с mc я использую bash, можно конечно этот момент отдебажить, но мне лень. Если когда-нибудь руки дойдут, напишу как пофиксил.

А вообще самая быстрая оболочка это Dash (Debian Almquist Shell). Это POSIX-совместимая реализация Bourne Shell. Она заменяет /bin/sh в скриптах по умолчанию и обеспечивает улучшенную скорость, потребляя при этом меньше ресурсов. Dash превосходит bash/zsh по производительности, но его нельзя использовать, так как он не предназначен для взаимодействия.

А какую оболочку используешь ты и почему?

Кстати всем привет! Надеюсь твои выходные прошли без проишествий. Увидимся!

tags:
#linux #utils

💩 @bashdays
Please open Telegram to view this post
VIEW IN TELEGRAM
👍81
Часто люди бездумно засовывают в крон запуск долгоиграющих скриптов и потом ловят кучу багов.

К примеру некий скрипт запускается в кроне каждый час. В какой-то момент, время выполнения скрипта начинает составлять 70 и более минут. Соответственно следующий джоб через 60 минут запустит еще одну копию этого скрипта. И понеслась 3.14зда по кочкам.

Я ловил у ребят подобные перлы, когда сервер просто раком встает, а в фоне крутятся 100500 процессов, которые насилуют mysql как портовую шлюху, вдоль и поперек.

На такие случаи необходимо проверять запущен ли скрипт в данный момент. И если запущен, то при повторном запуске - ничего не делать.

Как такое реализовать? В бест-практиках это реализуется через lock файлы. Для удобства работы с lock файлами, в linux есть коробочный вариант утилиты, которая называется flock.

flock
— утилита, которая позволяет использовать лок-файл для предотвращения запуска копии процесса (вашего скрипта, крона или чего-то еще). Например, используя cron нужно быть уверенным, что предыдущий запуск вашего скрипта уже завершен.

Пишем обработчик:

#!/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
Please open Telegram to view this post
VIEW IN TELEGRAM
👍145
Вчера посмотрел спокойной ночи малыши и отрубился, каково было моё удивление, что в 6 утра не пришлось вставать и отвозить ребенка в школу. Каникулы же! Эхх… Ладно, а у нас бесконечные рабочие будни.

Сегодня обсудим интересную команду в bash, которая называется enable. Эта команда включает или отключает встроенные команды оболочки. Чтобы проще было понять эту шляпу, разберем на практике.

Отключение встроенных команды позволяет выполнить дисковую команду, имеющую то же имя, что и встроенная команда оболочки, без указания полного пути, даже если оболочка ищет встроенные команды перед дисковыми командами.
Запускаем:

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
Please open Telegram to view this post
VIEW IN TELEGRAM
👍89
Сегодня необычный скрипт, который позволит тебе сгенерировать пароль состоящий из пробелов и прочих невидимых символов. Что-то из оперы Шрёдингера — ты никогда не узнаешь гениально это или ужасно, пока сам не попробуешь.

От этой штуки тестировщики разбегаются в ужасе. А веб-сайты на которых ты попытаешься использовать такой пароль, просто-напросто порвутся и выпустят 500ю соплю.

Забрать и потыкать этот прекрасный скрипт можешь из нашей репы.

Не знаю где это можно применить, но идея с паролем которого не видно, очень интересная. Я попробовал сохранить то, что получилось в bitwarden, отлично сохранился. Да, пароль получается с симметричной защитой 128 бит.

tags: #linux #bash #utils

💩 @bashdays
Please open Telegram to view this post
VIEW IN TELEGRAM
👍81
This media is not supported in your browser
VIEW IN TELEGRAM
Хеллоу май диа френдз! Я тот еще любитель интерактивных штук, особенно консольных, где чето можно стрелочками побегать, понажимать, с минимумом геморроя. Короче фетиш у меня на всякие потыкать.

Приобщился тут к утилите hstr, которая выводит историю команд в формате списка. А в этом списке уже стрелками можно перемещаться по истории. Но это не главное. Лично я использую ее исключительно в режиме фильтрации.

HSTR (HiSToRy) - это утилита командной строки, которая обеспечивает улучшенное bash/zsh выполнение команд из истории. Она направлена на то, чтобы сделать твою работу проще и эффективнее, чем Ctrl-r.

Запускаю hstr, на экран вываливается вся история, я ввожу к примеру prometheus и получаю выборку из истории, конкретно где я задрачивал prometheus. Выбираю курсором нужную мне команду и вуаля! Никаких тебе грепов и лишних телодвижений.

Рекомендую попробовать, весьма топовая штука, боюсь приживется надолго.

🐱 Страница проекта на гитхаб
💩 Лендинг по установке

tags: #linux #utils

💩 @bashdays
Please open Telegram to view this post
VIEW IN TELEGRAM
👍94
Фух, закончились 2 часа партнерских интеграций... Недавно я делал пост по отличиям su от sudo, но есть еще одна вкусная альтернатива, которая называется doas.

doas – утилита, которая позволяет обычным пользователям выполнять задачи от имени root, так же как это делает sudo. Она была разработана проектом OpenBSD как минималистичная альтернатива sudo.

Интересно кстати звучит: do ass (делать жопу)

Утилита доступна в большинстве официальных репозиториев. Поэтому с установкой проблем не возникает.

Запускай apt install «делатьжопу» (или какой там у тебя пакетный менеджер) и погнали смотреть на эти булки поближе.

Так как doas не входит по умолчанию в коробочные версии linux, утилита требует немного бОльших настроек, в отличие от sudo. Но конфигурация намного проще для понимания чем sudo. Настраивается все это через файл /etc/doas.conf. Если файла нет, создай!

Цель doas - решить сложность sudo.

Давай эмитируем поведение sudo и позволим пользователю выполнять любые команды от пользователя root. Добавляем в конфиг такую херабору:

permit persist user as root


Теперь пользователь user сможет выполнять команды от root + пользователь получает льготный период, когда не нужно вводить пароль в течение нескольких минут после последовательных команд doas.

Допустим мне нужно сделать подобное, но для определенной группы, добавляем в конфиг строчку:

permit persist :wheel as root


Теперь все кто заключен в группу wheel смогут побыть рутом. Также и с белым списком команд, которые можно выдать для запуска без пароля:

permit persist user as root
permit nopass :user as root cmd apt


Да, конфиг более читабельный чем у sudo. И в обозримом будущем есть очень большая вероятность того, что sudo закинут в деприкейтед, а doas сделают основным рабочим инструментом. Так как sudo уже непроходимое гавно болото в плане поддержки кода, который трудно понимать и использовать.

Возьмем даже валидатор конфига visudo. Который проверяет синтаксис конфига. А это говорит о том, что синтаксис файла sudoers ну совсем фу и воняет. Требует проверки. Да и 99% пользователей используют sudo исключительно для установки софта.

Разница налицо (попахивает порнохабом):

Конфиг sudo
%wheel ALL=(ALL) NOPASSWD: ALL


Конфиг «делать жопу»
permit nopass :wheel as root


Ну и с помощью doas можно запустить root shell такой командой:

doas -s


Кстати был казус с портированием под FreeBSD, спустя несколько часов после публикации doas, в ней нашли критическую уязвимость. Которая позволяла выполнить привилегированные операции даже если был указан неверный пароль пользователя. Как обычно накосячил разработчик, который раздеплоился в прод без тестирования. Ну либо специально заложил бекдор, история умалчивает.

Вот такие пироги. Увидимся совсем скоро и сделаем что-нибудь полезное, например сломаем прод, ну или ногу...

tags: #linux #utils

💩 @bashdays
Please open Telegram to view this post
VIEW IN TELEGRAM
👍93
Надо было тут провести экстренные технические работы на сервере. Сервер публичный и смотрит жопой в интернет.

Клиенты это обычные пользователи, которые заходят по ssh и пытаются на практике изучать bash и linux. Короче студенты какого-то крупного ВУЗа, а сервер выступает подопытным стендом для всяких лабораторных работ.

Клиентов дофига (человек 800) предупредить о технических работах нет никакой возможности. А если бы и была, то 99% не увидят электронных писем с важной информацией и начнут долбать саппорт.

Задача вроде тривиальная, но нужно было предварительно задропать все сессии + не разрешать повторно подключить. Ну и естественно каким-то хреном выслать уведомление всем тем, кого задропали в моменте.

На самом деле тут все просто. Создаем пустой файл /etc/nologin. Теперь только root сможет авторизоваться по ssh. Да, предварительно нужно разрешить вообще заходить под root’ом.

Часть задачи решили. Теперь нужно уведомить бедолаг, которые в данный момент что-то делают в терминале. Пусть сохраняют свои поделки и отправляются на заслуженный отдых.

Для этого воспользуемся утилитой wall.

Wall — утилита командной строки, которая отображает сообщение на терминалах всех вошедших в систему пользователей.

Запускаем команду:

wall "Быстренько сохраняемся и валим с сервера. В 10:15 сервер уходит в запой."


Все кто был подключен к серверу, получают сообщение:

Broadcast message from root@dev (pts/0) (Sun Dec 17 11:38:21 2023):
Быстренько сохраняемся и валим с сервера. В 10:15 сервер уходит в запой.


И неважно что делает человек и где находится, сообщение появится у него на экране. Через wall кстати можно спамить определенным группам пользователей.

Ну все, ответственность с себя сняли. В 10:15 запускаем ассасина:

pkill -9 -u `who | awk '{print $1}'| grep -v root|head -1


Вот так вот грубо мы выгнали всех с сервера, кроме root’а. Вот и все, спокойно проводим технические работы, удаляем /etc/nologin и радуемся какие мы молодцы.

Wall можно заменить например на такое:

echo "Hello from BashDays" | write user


Но тут сообщение уйдет конкретному пользователю user. Конечно если по какой-то причине отсутствует wall в системе, можно и через цикл выгрести всех юзеров и через echo скормить им уведомление.

write - утилита, позволяющая отправить сообщение другому пользователю, который имеет сессию в этой же системе.

Ну либо так:

echo "Hello from BashDays" > /dev/pts/1


Пытался сделать так /dev/pts/[0-9]*, но чет не проканало, заорала как потерпевшая. Ну это всё костыли, в общем неважно.

Ладно, хорошо тебе провести остаток выходного, увидимся завтра.

tags: #bash #linux #utils

💩 @bashdays
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2052
Привет. Утренний микропост. Короче когда перенаправляешь вывод результатов в файл, то на экране нифига не видно. Но порой это бывает критично, а нужно и в файл записать и глазками позырить в реалтайме.

На этот случай у нас есть утилита tee, которая как раз этой хераборой и занимается.

command | tee log.txt


На картинке хорошо видно, откуда произошло название tee, это буква T в произношении. Вывод затекает сверху слева и вытекает в двух направлениях. Ты видишь происходящее на экране, а параллельно это происходящее записывается и в файл. Удобно.

Вот как нужно называть утилиты! Взял произношение буквы и можно в коробку упаковывать. Кстати пока писал, вспомнил что английская «H», взяло название от Eighth - то есть восьмая буква алфавита. Короче никто особо не заморачивался с неймингом.

Ну а еще есть подобная утилита, называется просто script. Она позволяет записать всё происходящее на экране сразу в файл. Работает даже в интерактивном режиме. Запустил ты ее и работаешь в консоли, а она пишет все твои действия в кабачок.

Ключей у нее много разных, если интересно можешь глянуть хелпину. Видел что её подключают в bashrc чтобы логировать все действия криворуких обезьян.

Я ни tee ни script не использую, потому что всё время про них забываю, да и особой необходимости нет.

Такие дела. Вечерком закину еще чтива, увидимся!

tags: #bash #utils

💩 @bashdays
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1509
Сегодня вынужденно весь день работал инженером электроником. Три компьютера собрал, винду накатил, дату перенес, господи, как это выматывает. Я лучше ELK лишний раз настрою, чем всё это железо разгребать, стар я для этого дерьма стал.

Ну и тут одно событие как-то вскользь прошло и связано оно с нативным файловым менеджером «FAR» который теперь можно без лишнего геморроя поставить на новые линуксы прям из официального репозитория.

Да, когда я начинал свой путь в айти, FAR был как правая рука для окошечников. Все активно призывали пересесть на total commander, но сколько я не делал попыток, так и не смог себя пересилить. Ну люблю я все эти консольные штуки и минимализм.

У меня знакомый большую часть жизни вообще в FAR фронтенд делал, плагинами обвешал и получилась неплохая IDE.

А вот когда я начал знакомство с linux, то второе, что я запустил (после vi), это был как раз midnight commander. Ну и все. FAR и mc стали маст-хэв штуками. Вот даже сейчас сидя на винде у меня вкорячен FAR и я даже раза два в месяц им пользуюсь.

Мой роадмеп был такой - Norton commander → Dos navigator → FAR → Midnight commander.

Короче в новых убунтах ставится так:

sudo apt install far2l


Кому подойдет FAR? Все просто, тому, кому не нравится midnight commander.

Я попробовал ради прикола воткнуть его на 23ю убунту (в wsl), взлетело, выглядит как FAR, даже alt+f1 работает для выбора дисков. Ну и по ssh запускается, в смысле подключаешься к серверу по ssh и запускаешь там FAR, работает.

Не знаю, но я уже точно ни на что не променяю Midnight commander. Даже в винде его использую. Мы связаны одной цепью.

А какой у тебя был путь с файловыми менеджерами? Чем нынче пользуешь?

tags: #рабочиебудни #utils #linux

💩 @bashdays
Please open Telegram to view this post
VIEW IN TELEGRAM
79
С наступающим! Давным-давно я избавился от OpenVPN и сейчас активно продолжаю использовать WireGuard. Даже порой связываю продакшен сервера wg тоннелями в разных регионах, где нет возможности это сделать из коробки. Стабильно, быстро, бесплатно.

Всё было хорошо, пока я не повзрослел и не познал джаззз установил себе Windows. Ну и естественно запихал туда официальный гуёвый клиент от wg. А что могло пойти не так? А всё!

Клиент в рандомный момент показывал средний палец и работал через хуй копыто.

Приходилось его выгружать, перезапускать службы, иногда передергивать софтверно сетевую карту, чтобы не ребутить машину. Ну такое себе удовольствие… Мне блять/блядь работать надо, а я тут утехами занимаюсь.

Так я ебался с полгода, но в этот понедельник меня это окончательно заебало! Пошел искать альтернативы, конкретно гуишного клиента. Потому что сама технология wg меня устраивает, не устраивают эти постоянные глюки.

И да, я много гуглил про эти проблемы, они имеются и фиксятся именно, так как я их и фиксил, перезагрузками, службами и другими костылями.

Короче перебрал я разные клиенты, всё шлак, ну и наткнулся на гитхабе на что-то приличное, простое и даже с фичами.

Называется эта штука TunnlTo. Работает в коллаборации с WireSock. По бенчмаркам обгоняет даже официальный WG клиент. На странице проекта там все подробно описано, можешь самостоятельно ознакомиться.

Чо понравилось:

1. Не глючит, шустрый, не виснет
2. Поддержка импорта тоннелей из официального wg клиента
3. При загрузки ОС можно автоматом подключать/не подключать VPN
4. Разделение приложений, кто идет через VPN, а кто нет
5. Ну и конечно другие фичи, какие хз, мне 4х хватает

В общем мне пока нравится. Заточено под винду, но у маководов и линукс-гиков и так всё хорошо, мой личный пруф.

💻 Страница проекта на github

Неделька выдалась продуктивная и очень нервная, в плане работы, в плане домашней рутины, в плане партнерских интеграций. Надо уже новых коллег к нам приводить, а я всё фигнёй какой-то занимаюсь. Исправлюсь! На выходные сделаем небольшую паузу, буду готовить контент план, чтобы уж совсем из пальца темы не высасывать. Да и ты отдохнешь.

Ну а тебе и твоим близким желаю хороших предстоящих выходных, берегите себя ребят. Увидимся!

tags: #utils #windows #networks

💩 @bashdays
Please open Telegram to view this post
VIEW IN TELEGRAM
112
This media is not supported in your browser
VIEW IN TELEGRAM
Если пишешь говнокод, неважно куда он попадет, в GIT репозиторий или унитаз. Суть одна.

Привет отдыхающим. Нашел на github неплохую пепяку «config-file-validator», которая из консольки валидирует файлы в форматах:

Apple PList XML, CSV, ENV, HCL, HOCON, INI, JSON, Properties, TOML, XML, YAML


Работает на всём, линуксы, винда, макоська, малина. Надо только установить. В репах увы её нет. Написано на golang.

✔️ Репа с рейтингом, люди пользуются, форкают.

Я качнул с репозитория zip’ник и закинул в /usr/local/sbin

cd /tmp
wget https://github.com/Boeing/config-file-validator/releases/download/v1.6.0/validator-v1.6.0-linux-amd64.tar.gz
tar -xf validator-v1.6.0-linux-amd64.tar.gz
mv validator /usr/local/sbin


А если любишь docker, то можно прям контейнер подтянуть с этим валидатором.

Теперь в каталоге с файлами запускаем: validator и смотрим:

root@dev:# validator
× bashdays.json
error: Error at line 3 column 2: invalid character '"' after object key:value pair
✓ bashdays.yml
Summary: 1 succeeded, 1 failed


Отличное решение, когда лень или нет возможности запускать IDE. Быстро, просто, бесплатно.

Люблю такие тулзы, вроде нихера не делают, но пользу приносят. Взял к себе на вооружение. Рекомендую.

🌐 Страница проекта на github

tags: #utils

@BАSHDАYS | BАSHDАYS.CОM
Please open Telegram to view this post
VIEW IN TELEGRAM
129