Линукс и DevOps Дни
2.04K subscribers
108 photos
8 videos
194 links
Самобытно про разработку, devops, linux, скрипты, тестирование, сисадминство, техдирство, пиэмство и за айтишную жизу.
Download Telegram
Привет. Я обычно предпочитаю строгие терминалы, которые — белым по черному. Но вчера у коллеги подсмотрел свистоперделку и тоже захотелось. Эх, вроде всегда топлю против новогодних ёлок, но тут не устоял и захуячил себе.

Обращаем внимание на задний фон в терминале, в нем проигрывается gif’ка.

А всё что выводится на экран это результат работы утилиты lolcat, которая делает праздник из любого тухлого выхлопа.

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


Как поставить такой видео фон? Для WSL это не проблема, добавляем строчки в json конфиг и всё из коробки поднимается:

"backgroundImage": "C:\\\\pixelart\\b1.gif",
"backgroundImageOpacity": 0.28,


Регулируем прозрачность и наслаждаемся.

Гифки в стиле пиксель арт я собрал и залил на яндекс-диск, забирай.


А вот в нативном линуксе, придется изъебнуться. 99999% терминалов не поддерживает gif и mp4.

Некий персонаж смог такое реализовать через terminology. Но тут уже сам ковыряй. Единственное, что могу скинуть, это как случа...
🔥 Positive Technologies представила коммерческую версию второго метапродукта — MaxPatrol Carbon

По данным исследования готовности российских организаций противостоять кибератакам, основными сложностями при выполнении задач по усилению защищенности ИТ-инфраструктуры являются:

• Дефицит времени на выполнение всех поставленных задач.
• Недостаток компетенций для формирования задач.
• Отсутствие эффективной коммуникации между командами ИБ и ИТ.

MaxPatrol Carbon берет эти задачи на себя: метапродукт помогает подготовить ИТ-инфраструктуру к отражению атак и обеспечивает непрерывный контроль киберустойчивости, делая невозможным причинение ущерба компании.

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

Все подробности о новинке можно найти на сайте вендора.
Здрасти. Если открыть два терминала, в первом ввести команду ls -la, а во втором history, то во втором терминале, ты не увидишь в истории команду ls -la.

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

✔️ Финт ушами в первом терминале:

history -a
history -c
history -r


a = пишем текущую историю сессии в файл
с = очищаем текущую сессию
r = перезагружаем файл истории

Теперь если перезайти во второй терминал, то увидишь там команду ls -la, то есть история как бы синхронизировалась. Это хорошо, но недостаточно хорошо!

Как это можно автоматизировать?

Добавляем в .bashrc:

HISTCONTROL=ignoredups:erasedups
shopt -s histappend
PROMPT_COMMAND="${PROMPT_COMMAND:+$PROMPT_COMMAND$'\n'}history -a; history -c; history -r"


ignoredups:erasedups

1. Команды, вводимые несколько раз, не дублируются в истории.
2. Повторная команда заменяет все предыдущие в истории.

shopt -s histappend

Эта команда включает опцию histappend, которая добавляет новые команды в конец файла истории (~/.bash_history) при завершении сессии, вместо перезаписи файла. Это позволяет сохранить команды из разных сессий и объединить их в единую историю.

А кишка PROMPT_COMMAND = Назначает значение переменной PROMPT_COMMAND, которая используется в bash для выполнения команды перед отображением командной строки (приглашения).

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

А еще есть фича:

declare -r PROMPT_COMMAND="echo 'привет осёл'"


После выполнения любой команды, на экран будет выводиться «привет осёл». Эту команду можно заменить на любую другую, например триггерить bash скрипт, который будет отправлять введенные команды сразу тебе в телеграм. Ну или забить exit 1 по приколу.

Как взаимодействовать с телегой через консольку, писал в этом посте. А про облачную синхронизацию истории упоминал в этом посте.


Ёмко? Ёмко! Изучай!

tags: #linux #bash

🔔
4 июня пройдёт большая конференция по инфраструктуре от Яндекса — infra.conf 2024!

Вас ждёт 18 докладов-кейсов от разработчиков и техлидов из Тинькофф, Ozon Tech, Яндекса, «Лаборатории Касперского» и других крупных компаний, активный нетворкинг, игры, Q&A-сессии и вечеринка.

Поговорим о платформенной разработке, тестировании и эксплуатации инфраструктуры, базах данных и хранилищах, облачных технологиях, CI/CD-пайплайнах и Kubernetes, ML-инфраструктуре, безопасности, опенсорс-решениях и о многом другом.

📍 4 июня, Москва, площадка Bounce & Pulsar, а также онлайн.

➡️ Участие бесплатное. Рекомендуем зарегистрироваться уже сейчас.
Хелоу ворлд, вчера наш с вами товарищ Tagd Tagd попросил опубликовать статью, которую любезно написал для нас с вами. Спасибо дружище! Исполняю, вникайте, пишите комменты.

Я стилистику сохранил, но сверстал и поправил то, что ворд подчеркнул красным, чтобы читалось полегче. Эхх.. как же руки чесались добавить пару забористых фраз, ну да ладно, пусть будет как будет.

👇👇👇

redirall.sh


Да, я знаю про алиасы и ssh_config. Скрипт предназначен для ИНТЕРАКТИВНОГО проброса TCP-портов через jump-серверы, средствами ssh.

Позволяет пробрасывать порт с удаленной машины на 127.0.0.1 и коннектиться к службам компов, доступных из подсети jump-сервера (в скрипте gate сервер) за firewall.

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

Кому это не интересно, рассматривайте скрипт, как учебный, потому как
тут есть некоторые фишки, которые поясню ниже.

В инете есть машина IP=1xx.2xx.2xx.54, у которой на порту 13527 висит ssh.

После подключения у нас на машине по адресу 127.0.0.1:8080 будет висеть служба 192.168.1.10:443 из локальной сети шлюзовой машины.

Кстати, dest_ip, dest_port, lo_port - значения по-умолчанию. При подключении их можно менять, не трогая конфиг.

Если кто заинтересовался пробросом портов через ssh рекомендую смотреть ключи -L -R -D.

✔️ Теперь к скрипту.

MULTICOLUMN=0 - список подключений в один столбец. Подходит, когда список до 20-30 строк.

MULTICOLUMN=1
список в несколько столбцов. Некрасиво, но много...

function ini() - список параметров, для тех, кто хранит данные в скрипте (можно еще heredoc).

Для тех, кто обожает конфиги - просто вставьте cat file.conf внутрь функции ini.


awk !/^#/ && NF - выводит строки, НЕ начинающиеся с #, и с числом полей >0. (не пустые, без комментов)

|eval $CMD - ПОЗВОЛЯЕТ МЕНЯТЬ ЛОГИКУ цепочки PIPE

|cat - заглушка (nop в мире pipe)

Дальше все просто.

read -i позволяет указать значение по-умолчанию, которое, можно изменить.

Скрипт можно приспособить для любого интерактива: выбор версии скачиваемой программы, монтирование/размонтирование FS, выполнение нужных, но редких скриптов, которые, блин, постоянно забываешь...

Советы приветствуются. Конфиг можно загружать и из сети, но перед объявлением ini.


#!/bin/bash

declare -i MULTICOLUMN=0
function ini(){ echo '

#name ssh_gate_ip gate_port ssh_user dest_ip dest_port lo_port

Filial1 1xx.2xx.2xx.54 13527 u232sr 192.168.1.10 80 8080
Filial2 9y.1yy.1yy.66 13531 u232sr 192.168.1.18 5432 5432
Firma2 1zz.2zz.2zz.53 22 p183975 192.168.1.100 3389 3388

'
}
declare -i COLS=$(echo "cols"|tput -S)
declare -i NUM=0
clear
[[ $MULTICOLUMN -eq 0 ]] && CMD='cat' || CMD='column -x -c$COLS'
#autonum & print list
ini |awk '!/^#/ && NF {print ++i, $1 }' |eval $CMD
#protection
declare -i MAX=$(ini |awk '!/^#/ && NF {++i}END{print i}')
while [[ $NUM -le 0 ]] || [[ $NUM -gt $MAX ]];do
read -p "select connection number = " NUM
done
#get default param for selected num
read -r NAME GATE_IP GATE_PORT USR DEST_IP DEST_PORT LO_PORT <<< \
$(ini | awk -v n="$NUM" '!/^#/ && NF {if(++i==n){print $0;exit}}') #'
clear
echo -e \\n"Connect to $NAME $GATE_IP"\\n
#modify param
read -e -p "DESTINATION_IP " -i "$DEST_IP" DEST_IP;echo
read -e -p "DESTINATION_PORT " -i "$DEST_PORT" DEST_PORT;echo
read -e -p "LOCAL PORT >1024 " -i "$LO_PORT" LO_PORT
#prompt
echo -e "127.0.0.1:$LO_PORT ~> $NAME" "$DEST_IP:$DEST_PORT"\\n\\n
#connect
ssh -L ${LO_PORT}:${DEST_IP}:${DEST_PORT} -p ${GATE_PORT} ${USR}@${GATE_IP}


tags: #bash

🔔
Сегодня специалисты DevOps — одни из самых востребованных на рынке. По данным hh.ru, на 2000 вакансий приходится 1900 соискателей. Если вы хотите работать с методологией DevOps — попробуйте курс Практикума.

После курса вы:

— начнёте применять DevOps в работе,
— разберётесь в Docker и Kubernetes,
— изучите современные инструменты,
— почувствуете себя опытным SRE.

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

Программа рассчитана на 6 месяцев, учёба займет от 15 часов в неделю. В финале — итоговый проект для портфолио, в котором нужно подготовить инфраструктуру и настроить конвейер деплоя.

Осваивать принципы DevOps начнём уже 5 июня. Приходите учиться!

Начать курс
Здрасти. Ща будет познавательно. Рекомендую почитать.

При установки софта в Linux, иногда требуется предварительно вкорячить какой-то build-essential.

sudo apt install build-essential


В 99% случаев ты бездумно ставишь этот пакет, раз написано, значит нужно. Но всяко не задумывался, а чо блядь это такое?

И правда, а что это такое?

build-essential это «метапакет», который устанавливает набор необходимых инструментов. Эти инструменты требуются для компиляции исходников.

✔️ В состав build-essential обычно входят:

gcc — основной компилятор для языков C и C++.
g++ — компилятор для языка C++.
make
— утилита для автоматизации сборки программ.
libc6-dev — заголовочные файлы и библиотеки C стандартной библиотеки.
dpkg-dev — утилиты для работы с исходными пакетами Debian.

ну и другие…

Грубо говоря, build-essential это швейцарский нож, всё в одном.

Ну и чо?

Да ничо, либо ты руками будешь ставить 10 софтин для компиляции своих поделок, либо один раз установишь build-essential и у тебя под рукой уже есть все самое необходимое.

Короче build-essential создан для твоего удобства. Этакий билдер старт-пак. Но никак не отдельная утилита/программа.

Нужно всегда помнить, что это не серебреная пуля для установки рабочих окружений Golang, Python и т.п. Иногда придется все же что-то дополнительно поставить ручками.

Скучный высер из доков:

Мета-пакет - это удобный способ массовой установки групп приложений, их библиотек и документации. Многие дистрибутивы Linux используют их для различных целей, от создания образов дисков, которые впоследствии станут новыми выпусками, до создания программных «пакетов», которые пользователь может легко установить.

Мета-пакет редко содержит что-либо, кроме журнала изменений и, возможно, информации об авторских правах, он не содержит внутри себя приложений или библиотек. Способ их работы заключается в наличии списка «зависимостей», который считывает менеджер пакетов. Затем менеджер пакетов обращается к репозиториям, находит зависимости и устанавливает их.


Поздравляю, теперь ты и это знаешь!

tags: #linux

🔔
Ворвусь на секундочку, нативка от нашей хорошей коллеги.

Кто угарает со скрама и аджайла, велком в авторские мемы «Кринжайл». Не уговариваю, пока вспомнил, решил поделиться, мож зайдет конкретно тебе 👇
Всех с понедельником! Начнем с простого, а вечером обсудим «сосо́чки».

Вопрос от подписчика: а можно ли после обновления linux ядра, сразу применить это ядро, без перезагрузки машины?

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

В продакшене такое делается так — поднимаешь параллельно новую машину с новым ядром и т.п. Если все устраивает, переключаешь DNS, апстримы и т.п. на новую машину и вуаля.

Теперь по утилитам. Из того что вспомнил, это kexec. Позволяет загрузить новое ядро, прямо из текущего работающего ядра.

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

kexec -l /boot/vmlinuz-new-kernel --initrd=/boot/initrd-new-kernel --command-line="root=/dev/sda1" kexec -e


Дальше существует Live Patching. Эта технология позволяет применять обновления ядра без перезагрузки.

- kpatch от Red Hat
- kGraft от SUSE
- Kernel Live Patching (KLP) с версии ядра 4.0

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

Ну и KernelCare. Это коммерческое решение, которое предоставляет возможность обновлять ядро Linux без перезагрузки. Оно поддерживает различные дистрибутивы Linux и позволяет администраторам систем применять критические обновления безопасности на лету.

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

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

Такие дела.

tags: #linux

🔔
📌 Воркшоп «Как быстро настроить сеть?»
🕓 28 мая, 16:00


Хотите узнать больше про масштабирование из выделенных серверов в облако? Коллеги из подготовили онлайн-разбор практических кейсов🦖

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

Основные темы:
🔹 масштабирование выделенных серверов в облачную платформу через Глобальный роутер,
🔹 связность выделенных и облачных серверов,
🔹 связность выделенного сервера с Managed Kubernetes и облачными базами данных,
🔹 связность выделенного сервера и файлового хранилища (SFS).

Регистрируйтесь на мероприятие по ссылке, задавайте вопросы в форме и участвуйте в розыгрыше Тирекса ➡️ https://slc.tl/bakep

Реклама ООО «Селектел» erid 2VtzqvR3iTM
Абракадабра! Сегодня обсудим «сосо́чки» и их версионность.

Как ты знаешь, в linux есть файлы с расширением .so. Это и есть «сосо́чки». А ты думал?

Если такие файлы бездумно удалять или подменять из других дистрибутивов, велика вероятность, что всё встанет раком.

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

Лошара чо, так я получил новое достижение — седой волос на жопе.


Сосо́чки это разделяемые библиотеки, то бишь shared libraries. Короче если ты немного программист, то знаешь, что эти библиотеки содержат набор неких функций.

Допустим написал ты свой бинарник, а все функции для бинарника вынес в отдельный файл bashdays.so. Теперь бинарник будет ходить в этот «сосочек» и читать от туда нужные ему функции.

Ранее я писал пост, как создавать свои «сосо́чки» и обращаться к ним из Bash скриптов.


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

Грубо говоря, у тебя есть 10 софтин и один «сосо́чек». Все эти 10 софтин ходят в сосочек и забирают нужное. Оптимизация? Еще какая!

Ну дак вот. К «сосо́чкам» применяется версионность. То есть у тебя может быть несколько таких библиотек с разными функциями:

libbashdays.so.1.0.0
libbashdays.so.1.1.0
libbashdays.so.1.1.1


Версионность нужна для совместимости. Она позволяет сохранить работоспособность программ при обновлениях.

Ну ты понял. Условный apache использует libbashdays.so.1.0.0, а условный nginx который был обновлен уже хочет версию 1.1.1. Чтобы не сломать apache, нужно иметь 2 версии «сосо́чка».

✔️ Разделяемая библиотека должна состоять из трёх имен:

- Имя библиотеки
- Метка soname
- Компоновочное имя

Имя библиотеки, в формате lib<name>.so.<major>.<minor>.<patch>

Major - правки приводят к несовместимости
Minor - добавлении функционала
Patch - багфиксы, оптимизации

Метка «Shared Object Name» или soname. Представляет идентификатор, который позволяет системе динамической загрузки (dynamic linker) определить, какая версия библиотеки должна быть загружена для выполнения программ.

Если софтина скомпилирована с использованием libbashdays.so.1.0.0, она будет искать libbashdays.so с soname 1 при запуске.

Это значит, что она может работать как с libbashdays.so.1.0.0, так и с libbashdays.so.1.1.0, поскольку у них одинаковый soname. Однако, она не будет работать с libbashdays.so.2.0.0, так как у этой версии другой soname.

Создаем libbashdays.so.1.0.0 с меткой libbashdays.so.1

gcc -shared -Wl,-soname=libbashdays.so.1 -o libbashdays.so.1.0.0 module.o


Компоновочное имя — связывает приложение и библиотеку.

gcc -g -Wall -o bashdays main.o libbashdays.so


В исполняемый файл bashdays будет записан soname, с привязкой к libbashdays.so.

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

libbashdays.so -> libbashdays.so.1
libbashdays.so.1 -> libbashdays.1.0.0
libbashdays.1.0.0


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

Так. После всех этих танцев с бубном, ссылка на soname должна указывать на самую последнюю её версию. Тогда приложение будет работать с самой актуальной версией библиотеки.

libbashdays.so.1 -> libbashdays.so.1.0.1


Ну и при обновлениях «Мажорных» версий, используя утилиту ldconfig, автоматически будет создана ссылка, которая свяжет имя библиотеки и метку soname. Приложение будет работать с последней совместимой версии.

ldconfig -v | grep libbashdays
libbashdays.so.2 -> libbashdays.so.2.0.0 (changed)

$ ldd bashdays
libbashdays.so.1 => ./libbashdays.so.1 (0x0000ffff6f680000)
libc.so.6 => /lib/libc.so.6 (0x0000ffff7ff50000)


Пиздец муть? Аще! Если ты далёк от этих «сосо́чков», не забивай себе голову. Для общего развития пойдет, теперь ты знаешь как это говнище устроенно.

Изучай. Увидимся!

tags: #linux

🔔
Кластеры кубера для сладкой жизни!

Немного фактов:
▫️ Цена мастер-ноды: 0,00 ₽/мес.
▫️ Цена кластера в целом: от 304,65 ₽/мес. Ну прямо дешевле пачки пельменей😳
▫️ Автоматическое масштабирование и восстановление нод

Все классно, но вы кто?
Мы — современный провайдер серверов и услуг на базе дата-центров Selectel. Предлагаем инфраструктуру для любого проекта в удобной панели по выгодным ценам!

Еще у нас есть:

▫️ Выделенные серверы от 2,6 ₽/час (1900 ₽/месяц)
▫️ Облачные серверы от 0,26 ₽/час (187,61 ₽/месяц)

1 Гбит/с безлимитного интернета и бесплатная защита от DDoS-атак (L3/L4)!

Держи ПРОМОКОД на 300 рублей >>>>>>VSCALEKUBER300<<<<<<<<<
(для активации промокода нужно занести на баланс 100 рублей на кофе сисадмину)

Переходи по ссылке сразу в панель (1 минута на регистрацию, изи пизи) https://slc.tl/6bqcc

Реклама ООО «Селектел» erid 2VtzqvCyj1u
Здравия желаю! Сегодня расскажу про прикол с bash массивами.

А именно — в качестве индекса можно использовать арифметическое выражение.

Чо? Ну смотри, как здоровые люди работают с массивами:

arr=('huy' 'pizdec')

echo "${arr[@]}"
echo "${arr[0]}"
echo "${arr[1]}"


Всё здесь правильно, прям как в книжках! Прочитал и понял, что выведется на экран.

Кто не знает, символ «собакена» выведет все элементы массива.


✔️ А вот массив курильщика:

arr=('huy' 'pizdec')

echo "${arr[6%2]}"


Что думаешь эта херабора выплюнет? А тут «брат»... И выплюнет оно первое слово huy. Но почему?

Потому что гладиолус. Логично делим 6 на 2, получаем 3. Но у нас нет третьего элемента в массиве. WTF!!??

А мы тут как бы не делим! Не путай деление с «%».

Символ «%» означает — взять остаток от деления.


После деления 6 на 2 у нас получился остаток 0. То есть это как бы нулевой индекс массива, получаем huy.

Соответственно если сделать 7%2, то выведется слово - pizdec. Потому что после деления получился остаток 1.

Ну а чтобы получить 3 элемент массива, надо подобрать циферки. Ну например 5%3, получим остаток 2. И так далее. Ну ты понял.

Вот я вся математика. Хочешь запутать свои Bash скрипты и порадовать коллег? Нативная обфускация. Дерзай!

tags: #bash

🔔
Хуйня! Зато разомнёмся!
Грустно признавать, но сегодня под вечер будем ковыряться в кишочках и дебажить аномалию. Но оно того стоит!

Выполняем команду:

echo Shs | base64 -d  
Jase64: invalid input


И наблюдаем аномалию в названии утилиты: Jase64.

Из команды понятно, что утилита base64 при декодировании обнаружила ошибку в данных. Ошибка — не корректная длина закодированного текста (invalid input).

Но чо за херня с Jase64? Новая попа-группа Юры Шильникова-Томатного? Должно же быть Base64?

Если что-то пошло попесде, нам поможет «страус». Расчехляем strace.


Давай посмотрим что и куда пишет base64. Перенаправляем стандартные потоки вывода и ошибки в устройство /dev/null. Дополнительно говорим «страусу», чтобы выводил системные вызовы write.

Запускаем кишку:

с запущенной кишкой, обычно к практологу

LC_ALL=C strace -Yqqqyfe write -P /dev/null --signal=none bash -c 'echo Shs | base64 -d &>/dev/null'


Кратенько по ключам:

LC_ALL = страхуемся
Y = чекаем вызовы ввода-вывода
qqq = меньше мусора
y = показываем пути к файлам
f = чекаем дочерние процессы
e = выбираем вызовы write
P = ограничение трассировки
signals = не следим за сигналами

После запуска получаем:

[<base64>] write(1</dev/null>, "J\33", 2) = 2
[<base64>] write(2</dev/null>, "base64: ", 8) = 8
[<base64>] write(2</dev/null>, "invalid input", 13) = 13
[<base64>] write(2</dev/null>, "\n", 1) = 1


Уже поинтереснее. Разбираем.

- В первой строке происходит запись части декодированного текста в стандартный вывод (дескриптор 1).

- В следующих двух строках, в стандартный поток ошибок пишется имя утилиты и ошибка (дескриптор 2).

- Ну и последняя строка, запись новой строки.

Теперь снова смотрим первую строку и видим что системный вызов write пишет букву «J» и какой-то магический символ 33.

✔️ «Страус» по умолчанию выводит числовые значения непечатных символов в восьмеричной системе счисления. То есть 033 будет соответствовать символу ESC в кодировке ASCII.

И чо? А то, что для драйвера терминала, этот символ означает начало управляемой последовательности. Вот это поворот!

Скучная теория

Драйвер терминала это код, который распознает управляющие последовательности и интерпретирует их в действия. Например, перемещает курсор.

В моем случае, драйвер это эмулятор терминала (Terminal). А еще есть код в пространстве ядра, который реализует специальные устройства. И этот код может модифицировать данные проходящие через эту линию связи.

Схема терминала:

Bash write stdout -> /dev/pts/number Kernel_Space <- /dev/ptmx Terminal read

Terminal write -> /dev/ptmx Kernel_Space <- /dev/pts/number Bash read


Bash read это чтение команды, или сочетания клавиш например для редактирования строки.

Возвращаемся к Jase64

Для начала исключаем пространство ядра (Kernel_Space) и проводим проверку данных, которые поступили на устройство читаемое эмулятором терминала.

Видим что на устройстве эмулятора Terminal, данные пришли без искажений. Подозреваемым остается драйвер терминала.

write(30</dev/ptmx>, "\33[200~echo Shs | base64 -d \33[201"..., 33) = 33


Как это 👆 получить, я рассказал утром в этом посте.


И происходит следующее. Эмулятор терминала получив символ «J» отображает его, но потом натыкается на специальный символ ESC начало управляющей последовательности и слово base64.

Символ «b» распознаётся как часть управляющей последовательности и этот символ не отображается.

Многие терминалы не имеют никаких действий связанных с данной последовательностью «ESCb» и она просто отбрасывается.

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

echo -ne 'J\033' ; sleep 3 ; echo base64 >&2  
echo -ne 'J\033[64' ; sleep 3 ; echo bashdays >&2


Вот такие вот приколы, вот такие вот кишочки. Нельзя просто так взять и насыпать в терминал всё что тебе захочется.

Если после каких-то действий, ты начал замечать аномалии, выполни команду reset и всё встанет на свои места.

Хорошая ст...
One Day Offer для DevOps

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

Облачная платформа SberInfra.Cloud — фундамент для всех сервисов Группы Сбер. Команда разрабатывает самый ответственный и масштабный слой облака — эластичный сервис виртуальных и физических серверов.

В работе мы используем Linux, Kubernetes, Ansible, PostgreSQL, MySQL, Redis.

Какие задачи будут в вашем планере:
✔️ Администрировать внутрибанковские системы: обеспечивать отказоустойчивость и высокую доступность сервисов.
✔️ Описывать «инфраструктуру как код» с помощью Ansible и Terraform.
✔️ Настраивать процессы CI/CD.
✔️ Настраивать мониторинг.

Масштабные проекты и работа в крупнейшем IT-сообществе ждут вас.

Регистрируйтесь на One Day Offer 8 июня 👌
Вендор и производитель IT-инфраструктуры, пользовательского и телеком - оборудования YADRO в поиске опытных DevOps-специалистов:

1️⃣ Senior DevOps engineer/Старший DevOps инженер
2️⃣ DevOps engineer (telecom)

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

А ещё у тебя будут:

– Гибридный или удалённый формат работы;
– Возможность гибкого начала и окончания рабочего дня;
– Конкурентный уровень заработной платы и премирование по результатам работы;
– Возможность горизонтального и вертикального роста;
– Обучение за счёт компании: учебный портал с курсами и лекциями от экспертов, дополнительное профессиональное обучение, изучение английского, участие в конференциях;
– Личное участие в становлении процессов и продуктов, возможность увидеть результат своей работы;
– Большое инженерное сообщество, которое постоянно развивается;
– ДМС со стоматологией с первого дня, консультации юристов, психологов, экспертов по ЗОЖ и...
Привет. В пятницу пришел клиент с вопросом — а как вы нам пайплайны со сломанным докером починили после блокировки в РФ?

Вопрос был с явным «подъебом». Почему я так решил? Сейчас объясню.

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

Я тоже хотел провернуть нечто подобное, сделать за 5 минут, затрекать 8 часов, получить денежку. Гениальный план! НО, за годы появилось «чутьё».

Поэтому решено было сделать всё правильно — перенести официальные образы в инфраструктуру клиента и поправить пайплайны. По итогу накидал bash скрипт, забрал 200 образов, залил. Делов на полчаса.

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

✔️ Вернемся к вопросу клиента.

На вопрос я честно и прозрачно ответил. Клиент одобрительно покивал головой и сказал:

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


Собственно в этом и скрывался «подъебон». Если бы я сделал как ВСЕ, получается, мне плевать на клиента, на его проекты и бизнес. Хотя отчасти так и есть, чо лукавить 😲

Естественно мне пришлось бы всё переделывать, не говоря уже про доверие и дальнейшее сотрудничество.

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

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


Дело конечно твоё, с советами не лезу. Личные наблюдения.

Есть такая прекрасная поговорка — мой ишак, хочу еду, хочу ебу!

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

Короче нормально делай, нормально будет! Хорошей рабочий недели и береги себя!

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

🔔
Онлайн-запуск MaxPatrol VM 2.5
13 июня в 14:00 (мск)

Веб-приложения стали неотъемлемой частью ИТ-инфраструктуры и популярной точкой проникновения в периметр компании. По статистике, эксплуатация их уязвимостей входит в топ-3 методов реализации кибератак. CRM-системы, интернет-магазины, веб-порталы — все это находится под угрозой.

13 июня Positive Technologies представят новую версию системы MaxPatrol VM, которая выявляет уязвимости веб-приложений раньше, чем их обнаружат хакеры.

Подключайтесь, чтобы узнать, почему нужно включать веб-уязвимости в процесс vulnerability management, как правильно выстроить работу с ними и обеспечить защищенность внешнего периметра компании.
Здрасти. Наш товарищ Tagd Tagd написал для канала еще одну статейку, ловите. Предыдущая была тут. В остальном оставляйте свой фидбек в комментах.

👇👇👇

spr.sh


Решил написать справочник. Получился консольный гугл для бедных. Консольный справочник для поиска инфы по тегам.

В В ТЭГАХ КОНФИГА ИСПОЛЬЗОВАТЬ СИМВОЛ ПОДЧЕРКИВАНИЯ "_" НЕЖЕЛАТЕЛЬНО.

Вся инфа хранится в конфигурационном файле в виде:

# spb director ivanov ivan petrovich may
Иванов Иван Петрович
tel 123456789 director.ru
ats 12587
loip 10.10.18.07
birth 22.05.1956
https://ya.ru


# bash if then else fi
declare -i $COND=0
if [[ "$COND" -eq 1 ]];then
echo "FALSE"
else
echo "TRUE"
fi


Набираем spr.sh regexp mail и получаем все записи, содержащие эти оба тэга. Порядок не важен.

При поиске можно использовать "_" для уточнения.

spr.sh bcd   = вхождение bcd (найдет bcd, abcd, bcde, abcde)
spr.sh _bcd = начинается на bcd (найдет _bcd, _bcde)
spr.sh bcd_ = заканчивается на bcd (найдет bcd, abcd)
spr.sh _bcd_ = строго bcd (найдет bcd)


Обращаю внимание, поиск только по ВХОЖДЕНИЮ тэгов, но не комментов.

В общем, можно быстро получить список телефонов любого филиала, отдела, именинников в этом месяце... Или забить примеры кода и получить справочник для студентов/админов по конструкциям bash sed awk grep regexp в одном флаконе.

Если нужно что-то поправить: spr.sh edit и конфигурашка открывается в редакторе. Этот режим можно использовать для поиска средствами редактора по всему конфигу, включая комменты.

✔️ Описание скрипта:

EDITOR - в каком редакторе открывать конфиг (vim mcedit)
CONF - имя конфига получаем из текущего имени скрипта.
$# -eq 0 - если нет параметров - выводим help.
${0##*/} - bash-аналог basename
eval "$(which $EDITOR) $CONF" ищем редактор и открываем конфиг


Далее awk.

Передавать $* (параметры скрипта) внутрь через переменную не стал, сразу встроил в однострочник (да-да. это однострочник)

BEGIN{split("'"$*"'",s," ")} до начала чтения файла разбиваем тэги по разделителю " " и записываем в массив s. обработка строк файла: ($0 ~ /^#/)

Для строк, начинающихся с символа # (тэг-строка)

k0=$0 - сохраняем строку тэгов на время поиска.
gsub(/^#/, "# ") - добавляем пробел после #


Теперь поле №1

for(i=2;i<=NF;i++){$i="_" $i "_"} обрамляем тэги "_" для более удобного поиска.

p=1 и проверяем в цикле наличие КАЖДОГО тэга во всей строке.

($0 !~ s[i]) Если искомого тэга в строке нет, p=0 и выход из цикла.

$0=k0 - восстанавливаем строку тэгов.

Если p=1 - (флаг печати) выводим строки.

Обращаю внимание, изменение переменной p только в тэг-строках

Использовать для хранения учетных данных нежелательно. Для этого есть KeePassXC и аналоги.

#/bin/bash
declare -r EDITOR=nano
declare -r CONF=${0%.*}.conf
declare -r SCR=${0##*/}
if [[ $# -eq 0 ]];then
echo "Search by tag1 && tag2 && ... in $CONF"
echo "Usage: $SCR tag1 [tag2 ...[tagN]]"
echo "Example:"
echo "$SCR bcd ~> (seek bcd, abcd, bcde, abcde)"
echo "$SCR _bcd ~> (seek bcd, bcde)"
echo "$SCR bcd_ ~> (seek bcd, abcd)"
echo "$SCR _bcd_ ~> (seek bcd)"
echo
echo "To edit conf: $SCR edit"
exit
fi
if [[ "$1" == "edit" ]];then
eval "$(which $EDITOR) $CONF"
exit
fi
awk 'BEGIN{split("'"$*"'",s," ")}
{if($0 ~ /^#/){
k0=$0
gsub(/^#/, "# ")
for(i=2;i<=NF;i++){
$i="_" $i "_"}
p=1
for(i in s){
if($0 !~ s[i]){
p=0
break}}
$0=k0}
if(p){print}
}' "$CONF"


tags: #bash

🔔