Линукс и DevOps Дни
2.03K subscribers
108 photos
8 videos
194 links
Самобытно про разработку, devops, linux, скрипты, тестирование, сисадминство, техдирство, пиэмство и за айтишную жизу.
Download Telegram
Как в 20 выглядеть на 40?

Правильно! Установить Linux!

Я всегда обходил стороной команду find, наверное потому что я никогда не умел ее готовить. Мне всегда было проще находить нужное в midnight commander.

У меня кстати даже постов про find не было в этом канале.


Но для bash скриптов mc это не панацея, поэтому изредка приходилось гуглить про find и что-то лепить.

Сегодня затрём как раз про find. Но не за Базу, а за его скорость и бест-практики.

С помощью find мы ищем по разным паттернам и условиям. Порой необходимо совершить какие-то действия с найденными результатами. И find не может нас этим порадовать. Приходится передавать данные внешним утилитам.

У find есть пару опций:

exec = запускает утилиту и передает в неё аргументы
execdir = перед запуском утилиты, переходит в каталог с найденным

Синтаксис этих штук такой:

-exec команда {} суффикс


команда = утилита, которую запускаем
{} = развернется в найденные файлы
; = суффикс, на каждый файл запускается команда
+ = суффикс, команда запускается с группой файлов

Символ ; обязательно нужно экранировать либо поместить в кавычки.


Хорош с теорией, погнали в практику:

find ~/ -type f -exec sh -c 'echo $$' {} \;


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

По итогу на экран я получил 100500 строчек такого вида:

26719
26720
26721


Это список процессов, которые были задействованы в результате поиска. Чёто прям дохуя. Если надоело ждать результата, жми CTRL+C.

✔️ А теперь давай оптимизируем!

find ~/ -type f -exec sh -c 'echo $$' {} +


По итогу я получаю одну цифру 27413, один идентификатор процесса, в отличие от предыдущего варианта. Круто? Да охуеть не встать!

Но что произошло? Ща объясню. В оптимизированном варианте, имена файлов разбиваются на максимально большие группы и затем передаются в утилиту. Вот в этом и есть разница.

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

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

Стопэ. Это еще не всё, можно еще больше разогнать 👇

Включаем режим оверклоакинга!

Будем использовать утилиту xargs, она как раз входит в пакет с find. Утилита xargs запускает процессы параллельно. Уже понимаешь чо щас будет?

find ~/ -type f -print0 | xargs -0 -n4 -P2 команда


Xargs читает стандартный ввод и разбивает его на группы аргументов. А после этого запускает команду с данной группой аргументов.

По ключам:

0 = аргументы разделяются символами NUL ASCII. А спецсимволы косой черты \ и кавычками, воспринимаются как обычные.

n = максимально количество аргументов переданных за один раз

P = максимально количество процессов запущенных одновременно. Если указать 0, запустится как можно больше таких процессов.

команда = внешняя команда которая будет запущена. Если ничего не указывать, на экран выведутся группы аргументов, удобная фича для отладки.

А еще если во время работы xargs, ей послать сигнал SIGUSR1 (kill), то количество одновременно запускаемых процессов будет увеличено. А для SIGUSR2, будет уменьшено.

SIGUSR1 и SIGUSR2 могут быть использованы программой для произвольных нужд, например для межпроцессной (или межпоточной) синхронизации, управления фоновыми процессами (демонами) и т. п. По умолчанию, сигналы SIGUSR1 и SIGUSR2 завершают выполнение процесса.


Это базовая команда для правильной работы find + xargs:

find -print0 | xargs -0 command


Но учти, если command у тебя будет оболочкой sh/bash, тогда нужно правильно обработать аргументы и учесть всякие splitting, globbing и т.п.

Ладно чо. Всем хорошего отдыха и заебатых шашлычков. На 01.05 я возьму отгул, а там дальше уже всё по плану: за кишочки подергаем, да на страусе (strace) покатаемся. Будет охуенно!

tags: #bash #linux

@ВАSНDАYS | BАSHDАYS.CОM
Курс «Быстрый старт в DevOps» бесплатно. Как забрать?

Меня зовут Марсель Ибраев, и на своем канале я делюсь фишками, которые помогут вам начать путь в DevOps.

2 апреля стартовал курс, созданный на основе ваших пожеланий. Мы с командой учебного центра Слёрм ответили на самые актуальные вопросы начинающих девопсеров:
⚡️ что такое DevOps, и как выстроить работу команды в рамках этой методологии;
⚡️ Kubernetes, Docker и т.д.: как базовые инструменты выстраивают работу в DevOps;
⚡️ DevOps и компания: как состыковать критерии успеха.

1 неделя = 1 открытый модуль. В первом модуле разберем как быстро и эффективно освоить профессию с высокой зарплатой, с каких инструментов начинать, и какую роль в девопсе играют софт-скиллы.

🔗 ЗАБРАТЬ КУРС

erid: 2Vtzqv8A2ek
Привет. Сегодня шифруем пиксели!

Если кратко, берем png картинку и шифруем ее с помощью парольной фразы.

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

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


А поможет нам в этом старый и добрый ImageMagic

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

convert wizard: bashdays.png


Эта команда создаст изображение bashdays.png с волшебником, который хуячит живопись. Выглядит это так: bashdays.png

Хорошо. Теперь нужно зашифровать это изображение. Выполняем команду:

echo 'пароль' | convert bashdays.png -encipher - -depth 8 png24:hidden.png


Получаем файл hidden.png с пикселями. Файл прекрасно открывается, но волшебника мы уже не видим. Лишь какой-то цветной шум. Выглядит это так.

Шифрование делаем через опцию encipher, в качестве аргумента эта опция принимает имя файла с парольной фразой. Дефис после encipher означает - стандартный ввод, который в данном случае указывает на канал «|».

Ну и дешифровка:

echo 'пароль' | convert hidden.png -decipher - restored.png


Если проебал пароль или ввел неправильно, получишь тот же набор цветных пикселей. Пароль восстановить увы не получится. Так что запиши на бумажку и повесь на монитор, как в лучших практиках ИБ.

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

convert bashdays.png -encipher key.gif result.png


В этом примере, key.gif это ключ для шифрования. Без этого файла расшифровать изображение уже не получится. Заебись? Заебись!

✔️ А какие нюансы?

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

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

Шифрование идет через AES в режиме счетчика. Первая половина парольной фразы это одноразовый номер, вторая половина это ключ шифрования.

Если далёк от криптографии, то забей хуй, работает да и ладно.


Где можно применить?

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

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

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

Изучай!

tags: #security

@ВАSНDАYS | BАSHDАYS.CОM
Сегодня про RANDOM и револьвер

В бородатые 2000е была такая консольная игруля «Русская рулетка», состояла она из одной строчки:

[ $[ $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
Хотели в детстве сыграть в «Самый умный»?💡
Реализуйте мечту в IT-квизе


Активируйте Telegram-бота и проверьте свои знания сразу в восьми темах:

▫️ Дата-центры и железо
▫️ Разработка и soft skills
▫️ ИБ и сети
▫️ Kubernetes и ML

Отвечайте на технические вопросы каждый день и побеждайте в мини-играх — за каждый верный ответ начислим баллы. Игроки с самым высоким рейтингом получат крутые подарки от Selectel. Старт с 22 апреля.

Перейти в бота → https://slc.tl/6evat

Реклама ООО «Селектел» erid 2VtzqvpmxJc
🔤🔤🔤🔤🔤🔤🔤🔤🔤

shopt -s extglob; : "${PS1}"; : "${_//$'\x01'+([^$'\x02'])$'\x02'}"; : "${#_}"; printf '%b' "\e#8\e[$(((LINES-1)/2));$(((COLUMNS-_)/2))H"


tags:
#bash

@ВАSНDАYS | BАSHDАYS.CОM
⚡️ Появление технологической базы ПО отечественных вендоров и рост приложений, использующих алгоритмы на основе ИИ, — одни из главных трендов 2023 года. А что еще?

Мы опросили 800+ ИТ-специалистов, включая топ-менеджеров компаний, чтобы понять, как за год трансформировался отечественный рынок DevOps. Упаковали все это в отчет, который сейчас можно бесплатно скачать по ссылке.

📊 Из отчета вы узнаете:
- как российские компании преодолевают технологические и кадровые вызовы;
- планы и прогнозы развития рынка DevOps в ближайшем будущем;
- актуальные вопросы безопасной разработки (DevSecOps);
- в каком состоянии кадровый рынок DevOps.

Наши партнеры: МТС, IBS, Яндекс, Лаборатория Касперского, а также НИУ ВШЭ, ИСП РАН и ЭКОПСИ Консалтинг.

Забирайте ежегодный отчет по ссылке.

Реклама. Информация о рекламодателе
Всем привет. Записал сегодня пилотный выпуск на ютубину, изредка буду заходить с подобным контентом. Над звуком еще поработаем, есть нюансы. Завтра отдельным постом продолжу эту тему, так сказать вывернем наизнанку.

Поддержи подпиской и лайком! Спасибо!👇

https://youtu.be/gTwpoAaB_dY
Привет, это Девопс фабрика! Мы обучаем желающих перейти в DevOps.

Приглашаем на МОК интервью по DevOps! Сделаем бесплатно для первых десяти человек.

МОК интервью - это отличный способ подготовиться к реальным собеседованиям и проверить свои знания в дружелюбной обстановке.

Что вас ждет?

- Реальные вопросы от лидов, проводивших сотни собеседований по DevOps.
- Подробная обратная связь по вашему собеседованию и рекомендации по улучшению.
- Опыт, который поможет вам стать увереннее и легче пройти реальное собеседование.
- Внимательное и дружелюбное отношение, все проводится спокойно и без стресса :)

Посмотреть видео предыдущих интервью и записаться можно по ссылке в канале

Реклама. ООО «Байкалтим», ИНН: 3851008933, erid: 2Vtzqx3bUA5
Официальные тренинги по Zabbix на русском языке от Галс Софтвэр

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

Предлагаем ознакомиться с расписанием ближайших публичных тренингов:

Zabbix Certified Specialist (ZCS) 3-7 июня 2024 года (оффлайн + онлайн)

Zabbix Certified Professional (ZCP) 1-3 июля 2024 года (оффлайн + онлайн)

Оплата в рублях для юридических и и физических лиц по договору, счету или карте. Возможно проведение приватных тренингов.

Задать вопросы и получить дополнительную информацию вы можете у или по запросу на welcome.com.
Тут у безопасников жопы сгорели после предыдущего поста.

Нужно ли на приватный ssh ключ устанавливать пароль?


Давай сравним с ключом от квартиры. Поставил ты к примеру пиздатый замок на свою входную дверь и у тебя есть связка ключей.

А дальше? А дальше ты берешь эту связку ключей и помещаешь в сейф, ставишь код и радуешься. Радуешься до того момента, когда тебе нужно выйти из дома.

Приходится брать сейф с собой и везде с ним таскаться. Потому что это безопасно! Код от сейфа же никто не знает, поэтому не получит доступ к ключу, который открывает твою пиздатую дверь.

Удобно? Охуенно удобно! Главное практично.

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

Добавь тогда уж туда еще один фактор авторизации через QR код и Яндекс.Ключ. Лишним не будет 😲

✔️ Пароль на ключ тебе нужен — если ты рукожопая обезьяна, сосёшься в засос с ослами, качаешь сомнительный со...
Если команда разработки расширяется, DevOps-инженеров становится меньше, а инфраструктура активно развивается и растет, поддерживать сразу несколько архитектурных решений становится сложно и невыгодно. 

На встрече Алексей Подольский, инженер внутренней разработки в Cloud․ru, расскажет, как безболезненно объединить кластеры Kubernetes, оптимизировать инфраструктуру и повысить безопасность трафика внутри кластера.

На вебинаре вы узнаете:

▪️ как сделать процесс объединения более простым и комфортным — 4 основных условия;
▪️ какие этапы объединения кластеров Kubernetes можно выделить;
▪️ как не только объединить несколько архитектурных решений, но и оптимизировать инфраструктуру и снизить стоимость ее обслуживания;
▪️ как усилить безопасность периметра с помощью тонкой фильтрации трафика;
▪️с какими проблемами можно столкнуться на этапе миграции и как их лучше решать.

Также на встрече покажем готовое решение — поделимся результатом слияния нескольких кластеров и создания целостной инфраструктуры.

Веб...
Привет, сегодня коротко, очередная внеплановая пятница. Короче в продолжение к постам про повышение привилегий.

Если звезды сошлись (suid/guid и прочая хуйня), то через vim ты можешь получить интерактивный root shell.

Делается так:

vim -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
This media is not supported in your browser
VIEW IN TELEGRAM
Майские праздники равносильны новогодним, уже на третий день начинаешь деградировать и превращаться в обезьяну. После таких затяжных выходных, нужно еще пару недель, чтобы вернуться к нормальной жизни.

Привет. Сегодня расскажу про штуку, которой одно время пользовался на локальной машине и снова к ней вернулся.

✔️ Называется Atuin — Magical shell history.

Если коротко, эта тулза заменяет стандартный поиск в командной строке по ctrl+r на красивенький и достаточно удобный.

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

По сути у тебя одна общая история на нескольких машинах. Очень удобно если бегаешь между ноутом и стационарным компом.

Ты скажешь — фи, это же не безопасно! Согласен, поэтому есть варик поднять свой сервачок и синхронизировать через него.

Все в лучших традициях selfhosted. Мануал по установке сервера. Через docker-compose за пару минут все расчехляется.

Кстати если нажать стрелочку вверх, сработает триггер и откр
...
Сегодня за девопс, gitlab и как сделать комфортный pipeline с выпадающими списками Variables + Бонусы.

Из коробки, когда ты жмешь кнопку Run Pipeline, тебе нужно руками вбивать нужные Variables, например, чтобы указать окружение, в которое будет раскатан релиз.

Каждый раз вбивать руками 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
Java — один из самых популярных языков программирования, который используют разработчики для создания игр и приложений. Если вы давно мечтаете попробовать себя в этой сфере, скорее записывайтесь на мини-курс по Java-разработке. Подойдёт новичкам разного возраста, а ещё это полностью бесплатно!

Регистрируйтесь: https://epic.st/0gaPiE?erid=2VtzqvfS5WZ
🎉 И получите первый подарок — гайд по профессии Java-разработчика.

Что будем делать на мини-курсе:

🔹 Обсудим, почему Java — один из самых востребованных языков
🔹 Познакомимся с кодом Java и рассмотрим ключевые элементы приложений на этом языке
🔹 Определим навыки для трудоустройства
🔹 Сравним Java и Python
🔹 Сделаем Java-приложения по инструкции

Формат мини-курса отлично подойдёт для обучения из любой точки мира: смотрите видео в удобное время и закрепляйте навыки на практике.

Успейте записаться бесплатно!

Реклама. ЧОУ ДПО «Образовательные технологии «Скилбокс (Коробка навыков)», ИНН: 9704088880
Люди любят жаловаться на жизнь, а когда предлагаешь обратиться к психологу — это «дорого», «некогда», «я им не доверяю».

Кому действительно важно разобраться в себе и изменить жизнь, видит возможности, а не препятствия

Первый шаг к решению проблемы — это её осознание. В этом может помочь канал доказательного врача-психиатра и психотерапевта , через терапевтические тексты которого можно поработать над:

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

Реклама. Ковалев К.И. ИНН: 325502816794
Чипи-чипи, чапа-чапа. Привет, на скрине 🚫некий Linux бедолага очень обрадовался, когда нашел пасхалку в команде date. Этакий нигде недокументированный аргумент.

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


Понял в чем прикол? Но это еще не всё!

Утил...
Скидка 20% на комплект сервисов: Managed Kubernetes, объектное хранилище S3 и облачные базы данных

Запускайте и развивайте веб-проекты любой сложности с помощью отказоустойчивых и масштабируемых сервисов Selectel. До 30 июня подключите три сервиса и пользуйтесь ими со скидкой 20%. Скидка не ограничена по времени и действует, пока вы используете все три сервиса.

Преимущества PaaS-сервисов в Selectel:

◽️ Быстрый запуск, отказоустойчивость и легкое масштабирование.

◽️Вы можете размещать и хранить персональные данные пользователей по закону, ведь сервисы соответствуют 152-ФЗ.

◽️Для того, чтобы развернуть проект в удобной панели my.selectel достаточно несколько кликов.

Переходите по ссылке, что зарегистрироваться и подключить сервисы со скидкой: https://slc.tl/ycean

Реклама ООО «Селектел» erid 2VtzquePgc2
Упоримся? А давай!

Открывай терминал с башем и запускай команду:

while :; do cat /etc/hosts ; done | grep -m1 'a'


По идее тут что-то вроде бесконечного цикла, который будет cat’ить на экран файл hosts, предварительно грепнув содержимое по символу «a».

Аргумент -m1 = выход после первого вхождения искомой подстроки. После этого, конец канала закрывается для чтения.


Запустил? И всё зависло! По крайней мере у меня вывелась только одна строчка вида:

127.0.0.1 localhost bashdays


Но почему оно зависло? А потому, что утилита cat при попытке записать данные в сломанный канал, завершается сигналом.

✔️ Давай убедимся:

set -o pipefail
cat /etc/hosts | exit 0
echo $(( $? > 128 ? $? - 128 : $? ))


Получаем цифру 13. Откуда она взялась? Смотри! Если команда завершается сигналом, тогда статус ошибки ($?) == 128 + Номер сигнала.

А дальше вычитаем, делим, умножаем, корень квадратный вычисляем, заводим в дискриминант по синусу. Пеню. Короче получили цифру 13.

Более подробно про сигналы мы с тобой разбирали в этом посте.

Давай посмотрим, что такое 13:

kill -l 13


Вывелось PIPE, что равносильно SIGPIPE (Broken Pipe). Ага!

Получается что наш бесконечный цикл постоянно запускает утилиту cat, которая тут же завершается.

Раньше эта ситуация была очевидна и на экран выводилась ошибка. А вот с версии Bash 3.1-alpha1 это пофиксили, вот выжимка из спеков:

This document details the changes between this version, bash-3.1-alpha1,
and the previous version, bash-3.0-release.

By default, the shell no longer reports processes dying from SIGPIPE.


Нахуй так сделали, непонятно, скорее всего ушли в сторону set pipefail, типа кому надо тот включит, чтобы лишнее гавно на экран не сыпалось.

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

Ну либо так можно глянуть:

ps --no-headers --sort=pid -eo pid


Увидишь большую разницу между значениями PID.

Теперь как это пофиксить. Если уж захотелось упороться, нужно упарываться правильно.

Вот несколько вариантов:

while : ; do cat /etc/hosts || { echo $? >&2 ; exit; } ;done | grep -m1 'a'
while : ; do cat /etc/hosts || break ; done | grep -m1 'a'
while : ; do cat /etc/hosts || exit ; done | grep -m1 'a'


Если присмотреться, может возникнуть вопрос — а откуда выходит exit? Цикл выполняется в подоболочке, потому что является участником канала.

Давай проверим:

while : ; do cat ; done | grep -m1 'a' &


Запускаем конвейер в фоне. Команда cat без указания аргументов будет читать стандартный ввод, который в данной ситуации ассоциирован с терминалом и ждет ввода данных.

А такое не позволительно фоновым процессам, поэтому такие задания будут приостановлены.

Проверяем, что оно действительно приостановлено:

jobs -l

[1]+251913 Stopped (tty input) while :; do
cat;
done
251921 | grep --color=auto -m1 'a'


Ну и теперь смотрим, кто есть кто:

ps --forest -o pid,ppid,stat,comm

PID PPID STAT COMMAND
251893 251854 Ss bash
251913 251893 T \_bash
251924 251913 T | \_cat
251921 251893 T \_grep
251962 251893 R+ \_ps


Процесс 251913/251893 и есть подоболочка, в котором крутится наш цикл. Вот с этой подоболочки и выходит exit.

Сложно? Да не… азы с некоторыми нюансами. Изучай!

tags: #linux #bash

🔔