Хелоу ворлд, вчера наш с вами товарищ Tagd Tagd попросил опубликовать статью, которую любезно написал для нас с вами. Спасибо дружище! Исполняю, вникайте, пишите комменты.
Я стилистику сохранил, но сверстал и поправил то, что ворд подчеркнул красным, чтобы читалось полегче. Эхх.. как же руки чесались добавить пару забористых фраз, ну да ладно, пусть будет как будет.
👇 👇 👇
Да, я знаю про алиасы и 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).
awk !/^#/ && NF - выводит строки, НЕ начинающиеся с #, и с числом полей >0. (не пустые, без комментов)
|eval $CMD - ПОЗВОЛЯЕТ МЕНЯТЬ ЛОГИКУ цепочки PIPE
|cat - заглушка (nop в мире pipe)
Дальше все просто.
read -i позволяет указать значение по-умолчанию, которое, можно изменить.
Скрипт можно приспособить для любого интерактива: выбор версии скачиваемой программы, монтирование/размонтирование FS, выполнение нужных, но редких скриптов, которые, блин, постоянно забываешь...
tags: #bash
—
🔔 @bashdays
Я стилистику сохранил, но сверстал и поправил то, что ворд подчеркнул красным, чтобы читалось полегче. Эхх.. как же руки чесались добавить пару забористых фраз, ну да ладно, пусть будет как будет.
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
—
Please open Telegram to view this post
VIEW IN TELEGRAM
Здрасти. Ща будет познавательно. Рекомендую почитать.
При установки софта в Linux, иногда требуется предварительно вкорячить какой-то 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 и т.п. Иногда придется все же что-то дополнительно поставить ручками.
Скучный высер из доков:
Поздравляю, теперь ты и это знаешь!
tags: #linux
—
🔔 @bashdays
При установки софта в Linux, иногда требуется предварительно вкорячить какой-то build-essential.
sudo apt install build-essential
В 99% случаев ты бездумно ставишь этот пакет, раз написано, значит нужно. Но всяко не задумывался, а чо блядь это такое?
И правда, а что это такое?
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
—
Please open Telegram to view this post
VIEW IN TELEGRAM
Да вы издеваетесь?!
Никогда такого не было, и вот опять. Короче мы с Дмитрием размутили отдельный канал с «полезняшками».
Ты всяко уже натыкался на посты с такими тэгами в нашем чатике.
Теперь это вылилось в отдельное хранилище🌐 GIT Gate
Зачем оно тебе? А чтобы быть в рынке, перестать деградировать и облегчить свои трудовые будни.
Рекомендую подписаться➡️ @gitgate
Никогда такого не было, и вот опять. Короче мы с Дмитрием размутили отдельный канал с «полезняшками».
Ты всяко уже натыкался на посты с такими тэгами в нашем чатике.
Теперь это вылилось в отдельное хранилище
Зачем оно тебе? А чтобы быть в рынке, перестать деградировать и облегчить свои трудовые будни.
Так же ты можешь принять участие, скинув свою полезняшку в бота «Онотоле».
Рекомендую подписаться
Please open Telegram to view this post
VIEW IN TELEGRAM
Всех с понедельником! Начнем с простого, а вечером обсудим «сосо́чки».
Вопрос от подписчика: а можно ли после обновления linux ядра, сразу применить это ядро, без перезагрузки машины?
Нууу… вообще не рекомендуется заниматься хуйнёй, лучше конечно ребутнуться. Но если очень хочется, то кое что сделать можно, есть такие утилиты, но опять же всё на свой страх и риск.
В продакшене такое делается так — поднимаешь параллельно новую машину с новым ядром и т.п. Если все устраивает, переключаешь DNS, апстримы и т.п. на новую машину и вуаля.
Теперь по утилитам. Из того что вспомнил, это kexec. Позволяет загрузить новое ядро, прямо из текущего работающего ядра.
Решение не является полной заменой перезагрузки, так как система все равно перезапустится, но произойдет это в разы быстрее, поскольку не происходит полная инициализация аппаратного обеспечения.
Дальше существует Live Patching. Эта технология позволяет применять обновления ядра без перезагрузки.
- kpatch от Red Hat
- kGraft от SUSE
- Kernel Live Patching (KLP) с версии ядра 4.0
Live Patching позволяет вносить изменения в ядро, такие как исправления безопасности, без необходимости перезагрузки. Однако, это не подходит для всех видов обновлений ядра, таких как смена версии или значительные изменения в функциональности.
Ну и KernelCare. Это коммерческое решение, которое предоставляет возможность обновлять ядро Linux без перезагрузки. Оно поддерживает различные дистрибутивы Linux и позволяет администраторам систем применять критические обновления безопасности на лету.
Таким образом, полностью избежать перезагрузки при обновлении ядра невозможно в случае, если требуется полная смена версии ядра.
Однако, для большинства критических обновлений безопасности можно использовать технологии Live Patching, что позволяет поддерживать высокую доступность системы.
Такие дела.
tags: #linux
—
🔔 @bashdays
Вопрос от подписчика: а можно ли после обновления 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
—
Please open Telegram to view this post
VIEW IN TELEGRAM
Абракадабра! Сегодня обсудим «сосо́чки» и их версионность.
Как ты знаешь, в linux есть файлы с расширением .so. Это и есть «сосо́чки». А ты думал?
Если такие файлы бездумно удалять или подменять из других дистрибутивов, велика вероятность, что всё встанет раком.
Сосо́чки это разделяемые библиотеки, то бишь shared libraries. Короче если ты немного программист, то знаешь, что эти библиотеки содержат набор неких функций.
Допустим написал ты свой бинарник, а все функции для бинарника вынес в отдельный файл
А зачем так усложнять? Всё просто, ты выносишь протестированные функции в отдельный файл. А потом можешь их использовать совершенно из другого бинарника.
Грубо говоря, у тебя есть 10 софтин и один «сосо́чек». Все эти 10 софтин ходят в сосочек и забирают нужное. Оптимизация? Еще какая!
Ну дак вот. К «сосо́чкам» применяется версионность. То есть у тебя может быть несколько таких библиотек с разными функциями:
Версионность нужна для совместимости. Она позволяет сохранить работоспособность программ при обновлениях.
Ну ты понял. Условный apache использует
✔️ Разделяемая библиотека должна состоять из трёх имен:
- Имя библиотеки
- Метка soname
- Компоновочное имя
Имя библиотеки, в формате
Major - правки приводят к несовместимости
Minor - добавлении функционала
Patch - багфиксы, оптимизации
Метка «Shared Object Name» или soname. Представляет идентификатор, который позволяет системе динамической загрузки (dynamic linker) определить, какая версия библиотеки должна быть загружена для выполнения программ.
Если софтина скомпилирована с использованием
Это значит, что она может работать как с
Создаем
Компоновочное имя — связывает приложение и библиотеку.
В исполняемый файл bashdays будет записан soname, с привязкой к
Чтобы корректно подключать зависимости, создаётся пару символических ссылок.
Старайся чтобы компоновочное имя ссылалось на метку soname. На случай если пользователь-дебил удалит старую версию минорного обновления. И симлинка поломается.
Так. После всех этих танцев с бубном, ссылка на soname должна указывать на самую последнюю её версию. Тогда приложение будет работать с самой актуальной версией библиотеки.
Ну и при обновлениях «Мажорных» версий, используя утилиту ldconfig, автоматически будет создана ссылка, которая свяжет имя библиотеки и метку soname. Приложение будет работать с последней совместимой версии.
Пиздец муть? Аще! Если ты далёк от этих «сосо́чков», не забивай себе голову. Для общего развития пойдет, теперь ты знаешь как это говнище устроенно.
Изучай. Увидимся!
tags: #linux
—
🔔 @bashdays
Как ты знаешь, в 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
—
Please open Telegram to view this post
VIEW IN TELEGRAM
Здравия желаю! Сегодня расскажу про прикол с bash массивами.
А именно — в качестве индекса можно использовать арифметическое выражение.
Чо? Ну смотри, как здоровые люди работают с массивами:
Всё здесь правильно, прям как в книжках! Прочитал и понял, что выведется на экран.
✔️ А вот массив курильщика:
Что думаешь эта херабора выплюнет? А тут «брат»... И выплюнет оно первое слово huy. Но почему?
Потому что гладиолус. Логично делим 6 на 2, получаем 3. Но у нас нет третьего элемента в массиве. WTF!!??
А мы тут как бы не делим! Не путай деление с «%».
После деления 6 на 2 у нас получился остаток 0. То есть это как бы нулевой индекс массива, получаем huy.
Соответственно если сделать 7%2, то выведется слово - pizdec. Потому что после деления получился остаток 1.
Ну а чтобы получить 3 элемент массива, надо подобрать циферки. Ну например 5%3, получим остаток 2. И так далее. Ну ты понял.
Вот и вся математика. Хочешь запутать свои Bash скрипты и порадовать коллег? Нативная обфускация. Дерзай!
tags: #bash
—
🔔 @bashdays
А именно — в качестве индекса можно использовать арифметическое выражение.
Чо? Ну смотри, как здоровые люди работают с массивами:
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
—
Please open Telegram to view this post
VIEW IN TELEGRAM
Господа и дамы, а кто чем делает бэкапы файлов, баз и т.п.? Чо нынче в тренде? Поделитесь пожалуйста в комментариях. Что порекомендуете? Я помню была bakula, rsnapshot, veeam и еще какая-то поебота.
rsnapshot у меня торчит на малине, но что-то мне подсказывается, это какое-то древнее гавнище ))
С последними событиями сдека и смартофиса, появилась потребность подстелить соломки. На bash скриптах конечно можно заколхозить, но мож есть чо мастхевное и менее геморное.
Всем спасибо! Всем котиков🕺 😎 🙃
upd: заходи в комменты, там тонну годноты по этой теме ребята скинули, затэгаю #backups
rsnapshot у меня торчит на малине, но что-то мне подсказывается, это какое-то древнее гавнище ))
С последними событиями сдека и смартофиса, появилась потребность подстелить соломки. На bash скриптах конечно можно заколхозить, но мож есть чо мастхевное и менее геморное.
Всем спасибо! Всем котиков
upd: заходи в комменты, там тонну годноты по этой теме ребята скинули, затэгаю #backups
Please open Telegram to view this post
VIEW IN TELEGRAM
Forwarded from Useful Tools | Linux | GitOps | DevOps (Dmitry Malinin)
Вчера ночью без обьявления войны Docker Hub (hub.docker.com) ввела ограничения на доступ к сервису с территории России. Но нас не победить, ответ молниеносен, хотя и своеобразен.
Использовать для обхода блокировки докерхабом IP адресов России
http://huecker.io
Прислано: @burpsuite_user
И вдогонку альтернативный список прокси серверов
#docker #proxy
Использовать для обхода блокировки докерхабом IP адресов России
http://huecker.io
Прислано: @burpsuite_user
И вдогонку альтернативный список прокси серверов
/etc/docker/daemon.json
{"registry-mirrors": ["https://mirror.gcr.io", "https://daocloud.io", "https://c.163.com/", "https://registry.docker-cn.com"]
}
#docker #proxy
Новый день, новый пост. Привет. Пожалуй начнем.
Если хочешь понять как работает эмулятор терминала (ведущий, ведомый и т.п.), вот тебе инструкция.
Сразу уточню что придется самостоятельно вникать, я лишь покажу как получить нужный выхлоп для дебага.
Всё делаю на десктопной 22й убунте c терминалом «konsole».
Запускаем в первом терминале:
Получаем нечто подобное:
Открываем второй терминал и запускаем от рута, получаем нужные пиды:
Вместо konsole и bash можешь указать свой терминал и оболочку.
Подставляем пиды в команду и опять запускаем от рута:
Возвращаемся в первый терминал, где запускали readlink и что-нибудь начинаем вводить, команды там, текст.
После того как наигрался, возвращайся во второй терминал с strace стопай и открывай на изучение лог
В нем ты найдешь много интересного, если все сделал правильно — придёт озарение.
Штука низкоуровневая, но даёт базовое понимание как устроен эмулятор терминала.
Сегодня в 20:13 МСК залетит связанный с этой темой пост. Будут кишочки, strace и дебаг аномалии. Забегай.
Хорошего тебе дня, изучай!
tags: #linux #debug
—
🔔 @bashdays
Если хочешь понять как работает эмулятор терминала (ведущий, ведомый и т.п.), вот тебе инструкция.
Сразу уточню что придется самостоятельно вникать, я лишь покажу как получить нужный выхлоп для дебага.
Всё делаю на десктопной 22й убунте c терминалом «konsole».
Запускаем в первом терминале:
readlink /proc/self/fd/0
Получаем нечто подобное:
/dev/pts/0
Открываем второй терминал и запускаем от рута, получаем нужные пиды:
pgrep -xo konsole
pgrep -xo bash
24385
24401
Вместо konsole и bash можешь указать свой терминал и оболочку.
Подставляем пиды в команду и опять запускаем от рута:
strace -Yytttf -p 24385 -p 24401 -o bashdays.log
Возвращаемся в первый терминал, где запускали readlink и что-нибудь начинаем вводить, команды там, текст.
После того как наигрался, возвращайся во второй терминал с strace стопай и открывай на изучение лог
bashdays.log
.В нем ты найдешь много интересного, если все сделал правильно — придёт озарение.
Штука низкоуровневая, но даёт базовое понимание как устроен эмулятор терминала.
Сегодня в 20:13 МСК залетит связанный с этой темой пост. Будут кишочки, strace и дебаг аномалии. Забегай.
Хорошего тебе дня, изучай!
tags: #linux #debug
—
Please open Telegram to view this post
VIEW IN TELEGRAM
Грустно признавать, но сегодня под вечер будем ковыряться в кишочках и дебажить аномалию. Но оно того стоит!
Выполняем команду:
И наблюдаем аномалию в названии утилиты: Jase64.
Из команды понятно, что утилита base64 при декодировании обнаружила ошибку в данных. Ошибка — не корректная длина закодированного текста (invalid input).
Но чо за херня с Jase64? Новая попа-группа Юры Шильникова-Томатного? Должно же быть Base64?
Давай посмотрим что и куда пишет base64. Перенаправляем стандартные потоки вывода и ошибки в устройство
Запускаем кишку:
с запущенной кишкой, обычно к практологу
Кратенько по ключам:
LC_ALL = страхуемся
Y = чекаем вызовы ввода-вывода
qqq = меньше мусора
y = показываем пути к файлам
f = чекаем дочерние процессы
e = выбираем вызовы write
P = ограничение трассировки
signals = не следим за сигналами
После запуска получаем:
Уже поинтереснее. Разбираем.
- В первой строке происходит запись части декодированного текста в стандартный вывод (дескриптор 1).
- В следующих двух строках, в стандартный поток ошибок пишется имя утилиты и ошибка (дескриптор 2).
- Ну и последняя строка, запись новой строки.
Теперь снова смотрим первую строку и видим что системный вызов write пишет букву «J» и какой-то магический символ 33.
✔️ «Страус» по умолчанию выводит числовые значения непечатных символов в восьмеричной системе счисления. То есть 033 будет соответствовать символу ESC в кодировке ASCII.
И чо? А то, что для драйвера терминала, этот символ означает начало управляемой последовательности. Вот это поворот!
Скучная теория
Драйвер терминала это код, который распознает управляющие последовательности и интерпретирует их в действия. Например, перемещает курсор.
В моем случае, драйвер это эмулятор терминала (Terminal). А еще есть код в пространстве ядра, который реализует специальные устройства. И этот код может модифицировать данные проходящие через эту линию связи.
Схема терминала:
Bash read это чтение команды, или сочетания клавиш например для редактирования строки.
Возвращаемся к Jase64
Для начала исключаем пространство ядра (Kernel_Space) и проводим проверку данных, которые поступили на устройство читаемое эмулятором терминала.
Видим что на устройстве эмулятора Terminal, данные пришли без искажений. Подозреваемым остается драйвер терминала.
И происходит следующее. Эмулятор терминала получив символ «J» отображает его, но потом натыкается на специальный символ ESC начало управляющей последовательности и слово base64.
Символ «b» распознаётся как часть управляющей последовательности и этот символ не отображается.
Многие терминалы не имеют никаких действий связанных с данной последовательностью «ESCb» и она просто отбрасывается.
Ниже пару примеров, когда часть последующего ввода распознаётся как завершение управляющей последовательности.
Вот такие вот приколы, вот такие вот кишочки. Нельзя просто так взять и насыпать в терминал всё что тебе захочется.
Если после каких-то действий, ты начал замечать аномалии, выполни команду reset и всё встанет на свои места.
Хорошая статья: The TTY demystified.
И да, всем отличных предстоящих выходных, берегите себя❤️
tags: #linux #bash #debug
—
🔔 @bashdays
Выполняем команду:
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.
И чо? А то, что для драйвера терминала, этот символ означает начало управляемой последовательности. Вот это поворот!
Скучная теория
Драйвер терминала это код, который распознает управляющие последовательности и интерпретирует их в действия. Например, перемещает курсор.
В моем случае, драйвер это эмулятор терминала (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 и всё встанет на свои места.
Хорошая статья: The TTY demystified.
И да, всем отличных предстоящих выходных, берегите себя
Не забываем подписываться на пиздатые тулзы.
tags: #linux #bash #debug
—
Please open Telegram to view this post
VIEW IN TELEGRAM
Привет. В пятницу пришел клиент с вопросом — а как вы нам пайплайны со сломанным докером починили после блокировки в РФ?
Вопрос был с явным «подъебом». Почему я так решил? Сейчас объясню.
Как большинство решило проблему? Правильно, прочитали хайповую тему с хуёкером и проксяки ну и в моменте пофиксили, включая продакшены.
Я тоже хотел провернуть нечто подобное, сделать за 5 минут, затрекать 8 часов, получить денежку. Гениальный план! НО, за годы появилось «чутьё».
Поэтому решено было сделать всё правильно — перенести официальные образы в инфраструктуру клиента и поправить пайплайны. По итогу накидал bash скрипт, забрал 200 образов, залил. Делов на полчаса.
Ты спросишь, а как обновлять образы? А никак, все образы зафиксированы на определенные версии, глупо использовать latest. На моей практике, не раз новая версия образа ломала совместимости.
✔️ Вернемся к вопросу клиента.
На вопрос я честно и прозрачно ответил. Клиент одобрительно покивал головой и сказал:
Собственно в этом и скрывался «подъебон». Если бы я сделал как ВСЕ, получается, мне плевать на клиента, на его проекты и бизнес. Хотя отчасти так и есть, чо лукавить😲
Естественно мне пришлось бы всё переделывать, не говоря уже про доверие и дальнейшее сотрудничество.
Всегда думай своей кабиной. Пофиксишь быстро, все обрадуются, получишь денежку, но через неделю будут яростно ебать в жопу. Когда инфраструктура встанет раком из-за какого-нибудь встроенного майнера в образ или MITM атаки.
Дело конечно твоё, с советами не лезу. Личные наблюдения.
Есть такая прекрасная поговорка — мой ишак, хочу еду, хочу ебу!
Так, что если ты CTO, задай вопрос своим девопсам и админам, как они решили эту проблему с образами. Будет прекрасный повод распилить их премию и устроить оргию на ретроспективе.
Короче нормально делай, нормально будет! Хорошей рабочий недели и береги себя!
tags: #рабочиебудни
—
🔔 @bashdays
Вопрос был с явным «подъебом». Почему я так решил? Сейчас объясню.
Как большинство решило проблему? Правильно, прочитали хайповую тему с хуёкером и проксяки ну и в моменте пофиксили, включая продакшены.
Я тоже хотел провернуть нечто подобное, сделать за 5 минут, затрекать 8 часов, получить денежку. Гениальный план! НО, за годы появилось «чутьё».
Поэтому решено было сделать всё правильно — перенести официальные образы в инфраструктуру клиента и поправить пайплайны. По итогу накидал bash скрипт, забрал 200 образов, залил. Делов на полчаса.
Ты спросишь, а как обновлять образы? А никак, все образы зафиксированы на определенные версии, глупо использовать latest. На моей практике, не раз новая версия образа ломала совместимости.
На вопрос я честно и прозрачно ответил. Клиент одобрительно покивал головой и сказал:
Респект и уважуха. Я думал вы как и все, воспользовались инструкцией с хабра, а это категорически недопустимо по нашим политикам безопасности. Спасибо за работу, я никогда не сомневался в ваших компетенциях. Оплатим по двойному тарифу. Сделано быстро и профессионально.
Собственно в этом и скрывался «подъебон». Если бы я сделал как ВСЕ, получается, мне плевать на клиента, на его проекты и бизнес. Хотя отчасти так и есть, чо лукавить
Естественно мне пришлось бы всё переделывать, не говоря уже про доверие и дальнейшее сотрудничество.
Всегда думай своей кабиной. Пофиксишь быстро, все обрадуются, получишь денежку, но через неделю будут яростно ебать в жопу. Когда инфраструктура встанет раком из-за какого-нибудь встроенного майнера в образ или MITM атаки.
В крайнем случае можешь поднять свою доверенную, личную проксюшку и через неё забирать образы.
Дело конечно твоё, с советами не лезу. Личные наблюдения.
Есть такая прекрасная поговорка — мой ишак, хочу еду, хочу ебу!
Так, что если ты CTO, задай вопрос своим девопсам и админам, как они решили эту проблему с образами. Будет прекрасный повод распилить их премию и устроить оргию на ретроспективе.
Короче нормально делай, нормально будет! Хорошей рабочий недели и береги себя!
tags: #рабочиебудни
—
Please open Telegram to view this post
VIEW IN TELEGRAM
Здрасти. Наш товарищ Tagd Tagd написал для канала еще одну статейку, ловите. Предыдущая была тут. В остальном оставляйте свой фидбек в комментах.
👇 👇 👇
Решил написать справочник. Получился консольный гугл для бедных. Консольный справочник для поиска инфы по тегам.
В В ТЭГАХ КОНФИГА ИСПОЛЬЗОВАТЬ СИМВОЛ ПОДЧЕРКИВАНИЯ
Вся инфа хранится в конфигурационном файле в виде:
Набираем
При поиске можно использовать
Обращаю внимание, поиск только по ВХОЖДЕНИЮ тэгов, но не комментов.
В общем, можно быстро получить список телефонов любого филиала, отдела, именинников в этом месяце... Или забить примеры кода и получить справочник для студентов/админов по конструкциям
Если нужно что-то поправить:
✔️ Описание скрипта:
Далее awk.
Передавать
Для строк, начинающихся с символа
Теперь поле №1
Обращаю внимание, изменение переменной
Использовать для хранения учетных данных нежелательно. Для этого есть KeePassXC и аналоги.
tags: #bash
—
🔔 @bashdays
spr.sh
Решил написать справочник. Получился консольный гугл для бедных. Консольный справочник для поиска инфы по тегам.
В В ТЭГАХ КОНФИГА ИСПОЛЬЗОВАТЬ СИМВОЛ ПОДЧЕРКИВАНИЯ
"_"
НЕЖЕЛАТЕЛЬНО.Вся инфа хранится в конфигурационном файле в виде:
# spb director ivanov ivan petrovich may
Иванов Иван Петрович
tel 123456789 director@mail.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
—
Please open Telegram to view this post
VIEW IN TELEGRAM
Что делать если хочется поебаться с Bash, но мамка отключила тебе интернет?
Выход есть!
Я обычно всю эту трихомудию с синтаксисами, ключами и т.п. в голове не таскаю. Серой оперативки вроде хватает, но мозг ленивая штука.
Поэтому если что-то нужно подсмотреть, сразу в гугол. А в последнее время в gpt накидываю.
Когда мы жили в пещерах и подтирались зайцами, таких ништяков у нас не было. А был какой-нибудь blackcat linux и ты. ВСЁ! Ну и фидошка временами.
Ответ на свой вопрос в фидошке иногда приходилось ждать неделями и то не факт.
Книги? Неа, максимум ZX-ревью и прочие нечитабельные клоны. А хотелось Башить!
Оставалось изучать исходники чужих скриптов, которые шли из коробки в дистрибутиве linux.
Ну и естественно man, в который особо никто не въезжал, потому что с английским были небольшие проблемы — заебешься по словарику переводить, а уроки английского успешно прогуляны.
И что самое интересное, это было гораздо эффективнее, чем в нынешние времена. Информация записывалась на подкорку. Как скилл — умение ездить на велосипеде.
А сейчас — прочитал книгу, вроде всё понятно, грейд — крепкий мидл. Прошла неделя, ты отупел и уже ничего не помнишь. Информация записалась в голову, но потом могз — блядь, говнище какое-то, нужно срочно это забыть, есть же интернет!
✔️ Короче, к чему это я.
Если пишешь на каком-то языке и нужны примеры конкретных функций или команд. Далеко ходить не надо, всё нужное хранится на твоём диске.
Давай заглянем на диск и посмотрим на примере Shell скриптов, которые валяются в
Команда идет по каталогам и ищет нужное слово, в нашем случае ищем пример работы с функцией
По итогу отработки этой кишки, получаем пути и имена файлов, где эта функция используется. Открываем и смотрим как оно применяется на практике.
Даже если оказался в глубокойжопе тайге без интернета, один на один с Linux, выход есть! В своё время люди на папирусе код писали. Было бы желание.
Пользуйтесь!
tags: #bash #linux
—
🔔 @bashdays
Выход есть!
Я обычно всю эту трихомудию с синтаксисами, ключами и т.п. в голове не таскаю. Серой оперативки вроде хватает, но мозг ленивая штука.
Поэтому если что-то нужно подсмотреть, сразу в гугол. А в последнее время в gpt накидываю.
Зачем хранить фильмы на dvd дисках и mp3 скачивать, когда есть стриминговые сервисы.
Когда мы жили в пещерах и подтирались зайцами, таких ништяков у нас не было. А был какой-нибудь blackcat linux и ты. ВСЁ! Ну и фидошка временами.
Ответ на свой вопрос в фидошке иногда приходилось ждать неделями и то не факт.
Книги? Неа, максимум ZX-ревью и прочие нечитабельные клоны. А хотелось Башить!
Оставалось изучать исходники чужих скриптов, которые шли из коробки в дистрибутиве linux.
Ну и естественно man, в который особо никто не въезжал, потому что с английским были небольшие проблемы — заебешься по словарику переводить, а уроки английского успешно прогуляны.
И что самое интересное, это было гораздо эффективнее, чем в нынешние времена. Информация записывалась на подкорку. Как скилл — умение ездить на велосипеде.
А сейчас — прочитал книгу, вроде всё понятно, грейд — крепкий мидл. Прошла неделя, ты отупел и уже ничего не помнишь. Информация записалась в голову, но потом могз — блядь, говнище какое-то, нужно срочно это забыть, есть же интернет!
Если пишешь на каком-то языке и нужны примеры конкретных функций или команд. Далеко ходить не надо, всё нужное хранится на твоём диске.
Давай заглянем на диск и посмотрим на примере Shell скриптов, которые валяются в
/usr/bin, /usr/sbin, /bin, /sbin
.file /{,usr/}*bin/* | grep -Po '^.+?(?=:\s+.+?shell script)' | xargs grep -wl -m1 'getopts'
Команда идет по каталогам и ищет нужное слово, в нашем случае ищем пример работы с функцией
«getops»
. По ключам расписывать не буду, интернет у тебя явно пока еще есть.По итогу отработки этой кишки, получаем пути и имена файлов, где эта функция используется. Открываем и смотрим как оно применяется на практике.
Даже если оказался в глубокой
Пользуйтесь!
tags: #bash #linux
—
Please open Telegram to view this post
VIEW IN TELEGRAM
Сегодня заумных простыней не будет, тем не менее следующая кишка на bash тебе пригодится.
✔️ Делает она следующее
При запуске программы (в моём случае это mc), в терминал вываливается список всех файлов, которые программа открывает в домашнем каталоге.
Штука очень полезная для дебага. Когда не знаешь к каким файлам программа обращается, а очень хочется.
Эту команду можно усовершенствовать, поменяв пути и добавив например вызовы write. Тут уже от ситуации зависит.
При первом запуске mc я получил такой список:
Пользуйтесь!
tags: #bash #linux #debug
—
🔔 @bashdays
strace -o "| grep -Eo '/home/[^\"]+' >&2" -zfe '/^open' mc
При запуске программы (в моём случае это mc), в терминал вываливается список всех файлов, которые программа открывает в домашнем каталоге.
Штука очень полезная для дебага. Когда не знаешь к каким файлам программа обращается, а очень хочется.
Эту команду можно усовершенствовать, поменяв пути и добавив например вызовы write. Тут уже от ситуации зависит.
При первом запуске mc я получил такой список:
/home/user/.config/mc/ini
/home/user/.config/mc/ini
/home/user/.config/mc/panels.ini.E4M2O2
/home/user/.config/mc/ini
/home/user/.config/mc/ini
/home/user/.config/mc/ini~
/home/user/.config/mc/ini
/home/user/.bash_history
Если в твоём сознании живёт стройный и прекрасный мир программ, и ты человек с утончённой душевной организацией, воздержись от использования этого инструмента, лучше сходи на pornhub.
Пользуйтесь!
tags: #bash #linux #debug
—
Please open Telegram to view this post
VIEW IN TELEGRAM
Делать если честно совсем ничего не хочется, вчера к примеру закинули охуенную задачу — чтобы внести цифровой продукт в реестр отечественных ПО, нужно написать подробнейшую документацию к проекту.
Чтобы специалисты «миницифер», смогли локально у себя его развернуть и всё проверить.
Ну это ладно, вся соль в том, что нужно это подробно и в мельчайших подробностях расписать (без матов).
От начала создания сервера (консольные команды, пайплайны, апстримы, фаерволы и т.п.) и заканчивая — а теперь открываем браузер и видим главную страницу нашего приложения. Отдать код ансибла — не канает. Заебись да?
Короче пезда какая-то, чувствую себя как ребенок, который ненавидит делать домашку. Ладно, лирика. Поехали по сегодняшней теме.
✔️ Как узнать какие сигналы слушает процесс
Требуется проверить поймает ли запущенный процесс сигнал, проигнорирует или заблокирует его. Короче нужен список сигналов для конкретного приложения.
В Linux ты можешь найти PID процесса, а затем посмотреть:
В выхлопе будут строки описывающие какие сигналы
SigBlk - заблокированы
SigIgn - проигнорированы
SigCgt - перехвачены
Для примера беру PID=1, получаю такое:
Роман ты заебал! Опять какие-то шифры нечитабельные.
Давай разберемся что это значит.
Все эти числа справа, являются битовой маской. Если преобразовать это из шестнадцатеричного в двоичный, то каждый 1 бит представляет собой пойманный сигнал, считая справа налево, начиная с 1.
Итак, интерпретируя строку SigCgt, видим, что мой init процесс улавливает следующие сигналы:
Как сопоставить числовые сигналы с именем? Я выполнил команду:
И получил список всех сигналов от 1-31, а дальше уже дело техники.
И помним, что мы не можем заблокировать сигнал, если программа не готова к его перехвату. Если сигнал не был пойман, происходит действие по умолчанию, обычно это — завершение процесса.
Нахера всё это нужно? Ну если ты рядовой потребитель, то конечно оно тебе и не нужно. А если ты «автомеханик», то извините, хош не хош, а как оно внутри работает знать обязан.
Вот те скрипт, который покажет какие сигналы прослушивает программа. Да, скрипт преобразует криптошифры в нормальные имена сигналов. Избавляю вас от еботни, как говорится все для вас мои дорогие подписчики🙃
При запуске нужно указать PID процесса:
Вроде всё. Если есть чо добавить, велком в комменты. Ну и всех с пятницей, хороших предстоящих выходных, берегите себя!
Пользуйтесь!
tags: #bash #linux #debug
—
🔔 @bashdays
Чтобы специалисты «миницифер», смогли локально у себя его развернуть и всё проверить.
Ну это ладно, вся соль в том, что нужно это подробно и в мельчайших подробностях расписать (без матов).
От начала создания сервера (консольные команды, пайплайны, апстримы, фаерволы и т.п.) и заканчивая — а теперь открываем браузер и видим главную страницу нашего приложения. Отдать код ансибла — не канает. Заебись да?
Короче пезда какая-то, чувствую себя как ребенок, который ненавидит делать домашку. Ладно, лирика. Поехали по сегодняшней теме.
Требуется проверить поймает ли запущенный процесс сигнал, проигнорирует или заблокирует его. Короче нужен список сигналов для конкретного приложения.
➡️ Про сигналы писал тут и тут
В Linux ты можешь найти PID процесса, а затем посмотреть:
cat /proc/$PID/status
В выхлопе будут строки описывающие какие сигналы
SigBlk - заблокированы
SigIgn - проигнорированы
SigCgt - перехвачены
Для примера беру PID=1, получаю такое:
SigBlk: 0000000000000000
SigIgn: fffffffe57f0d8fc
SigCgt: 00000000280b2603
Роман ты заебал! Опять какие-то шифры нечитабельные.
Давай разберемся что это значит.
Все эти числа справа, являются битовой маской. Если преобразовать это из шестнадцатеричного в двоичный, то каждый 1 бит представляет собой пойманный сигнал, считая справа налево, начиная с 1.
Итак, интерпретируя строку SigCgt, видим, что мой init процесс улавливает следующие сигналы:
00000000280b2603 ==> 101000000010110010011000000011
На телефонах вся эта поебота выглядит очень стрёмно, поэтому смотрим картинку к этому посту👆
Как сопоставить числовые сигналы с именем? Я выполнил команду:
kill -l
И получил список всех сигналов от 1-31, а дальше уже дело техники.
И помним, что мы не можем заблокировать сигнал, если программа не готова к его перехвату. Если сигнал не был пойман, происходит действие по умолчанию, обычно это — завершение процесса.
Нахера всё это нужно? Ну если ты рядовой потребитель, то конечно оно тебе и не нужно. А если ты «автомеханик», то извините, хош не хош, а как оно внутри работает знать обязан.
Вот те скрипт, который покажет какие сигналы прослушивает программа. Да, скрипт преобразует криптошифры в нормальные имена сигналов. Избавляю вас от еботни, как говорится все для вас мои дорогие подписчики
#!/bin/bash
set -e
grep -m3 -P '^Sig(?:Blk|Ign|Cgt):' "/proc/$1/status" | while read field value
do
bits=$(printf 'ibase=16; obase=2; %X\n' '0x'$value | bc)
sigs=()
i=0
while [[ $bits ]]
do
((++i))
[[ ${bits:$((${#bits} - 1))} -eq 1 ]] && sigs+=($i)
bits=${bits::-1}
done
(( ${#sigs[*]} )) && sigs=( $(kill -l ${sigs[*]}) )
echo $field ${sigs[*]}
done
exit
При запуске нужно указать PID процесса:
script.sh <pid>
Вроде всё. Если есть чо добавить, велком в комменты. Ну и всех с пятницей, хороших предстоящих выходных, берегите себя!
Пользуйтесь!
tags: #bash #linux #debug
—
Please open Telegram to view this post
VIEW IN TELEGRAM
Прочитал недавно в полезняшках — про кириллические символы, ну и пошел экспериментировать, но немного в другом векторе. Раскроем так сказать тему сисек.
Сегодня займемся поиском шрифтов в Linux, которые поддерживают русскую букву «А». И посмотрим какие из них могут использоваться совместно с утилитой convert.
Чо еще в субботу делать🍷 Завтра пауза с постами, приведу к нам сюда еще единомышленников.
Для начала нужно узнать какие вообще шрифты в системе поддерживают этот символ. Для этого используем утилиту «fc-list» из пакета «fontconfig».
Для поиска возьмем код символа «0410» в utf-8. Он соответствует кириллической букве «А».
Также можно указать диапазон
✔️ Поехали! Выводим все шрифты, которые поддерживают кодовую точку «0410».
Есть нюанс. В список могут попасть шрифты, которые будут содержать кодовые точки, но у них не будет изображений символов.
Далее сопоставляем найденные шрифты, с теми которые поддерживает утилита convert.
Чо тут происходит. Мы отдаём через pipe результаты отработки команды fc-list на стандартный ввод grep.
w = шаблон, соответствует слову
o = выводим только совпадения, а не всю строку
f = файл строки в качестве шаблона поиска
Конструкция
Она имеет вид:
Запускается процесс список и его входной или выходной поток связывается с именованным каналом FIFO или одним из файлов в
Имя этого файла передается в качестве аргумента текущей команде как результат подстановки.
Если использовать >(список), запись в файл будет давать входные данные процессу список.
Если используется <(список), файл, переданный в качестве аргумента, необходимо читать для получения результатов работы процесса список.
Получается в качестве аргумента команда grep получит файл. Содержимым которого будет результат работы команды
Проверяем:
В итоге получаем нужный список шрифтов.
Ну а дальше можем заряжать все это в bash скрипт и гордится, какие мы с тобой охуенные.
Для примера давай сгенерим кучу изображений с русской буквой «А» используя найденные шрифты.
После запуска скрипта, в каталоге появится портянка файлов с изображениями, учти этот момент, чтобы не засрать себе поапочку. Лучше сразу в tmp это делай.
У меня всё, не смею тебя больше отвлекать. Изучай. Увидимся!
tags: #bash #linux
—
🔔 @bashdays
Сегодня займемся поиском шрифтов в Linux, которые поддерживают русскую букву «А». И посмотрим какие из них могут использоваться совместно с утилитой convert.
Чо еще в субботу делать
Для начала нужно узнать какие вообще шрифты в системе поддерживают этот символ. Для этого используем утилиту «fc-list» из пакета «fontconfig».
Для поиска возьмем код символа «0410» в utf-8. Он соответствует кириллической букве «А».
Также можно указать диапазон
:charset=0410-044f
(охватывает все заглавные и строчные буквы русского алфавита от А до Я) ну или язык :lang=ru
.fc-list ':charset=0410' --format '%{file}\n'
Есть нюанс. В список могут попасть шрифты, которые будут содержать кодовые точки, но у них не будет изображений символов.
Далее сопоставляем найденные шрифты, с теми которые поддерживает утилита convert.
Утилита convert является частью пакета программного обеспечения ImageMagick. Это мощный инструмент для создания, редактирования, преобразования и отображения растровых изображений.
fc-list ':charset=0410' --format '%{file}\n' | grep -wof - <(convert -list font)
Чо тут происходит. Мы отдаём через pipe результаты отработки команды fc-list на стандартный ввод grep.
w = шаблон, соответствует слову
o = выводим только совпадения, а не всю строку
f = файл строки в качестве шаблона поиска
Конструкция
<(convert -list font)
это подстановка процессов. Доступна в системах, поддерживающих именованные каналы (FIFO) или метод именования открытых файлов через /dev/fd.
Она имеет вид:
<(список) или >(список)
Запускается процесс список и его входной или выходной поток связывается с именованным каналом FIFO или одним из файлов в
/dev/fd.
Имя этого файла передается в качестве аргумента текущей команде как результат подстановки.
Если использовать >(список), запись в файл будет давать входные данные процессу список.
Если используется <(список), файл, переданный в качестве аргумента, необходимо читать для получения результатов работы процесса список.
Получается в качестве аргумента команда grep получит файл. Содержимым которого будет результат работы команды
convert -list font.
Проверяем:
echo <(convert -list font)
cat <(convert -list font)
В итоге получаем нужный список шрифтов.
Font: URWGothic-Book
family: URW Gothic
style: Normal
stretch: Normal
weight: 400
glyphs: URWGothic-Book.otf
Font: URWGothic-BookOblique
family: URW Gothic
style: Oblique
stretch: Normal
weight: 400
glyphs: URWGothic-BookOblique.otf
Ну а дальше можем заряжать все это в bash скрипт и гордится, какие мы с тобой охуенные.
Для примера давай сгенерим кучу изображений с русской буквой «А» используя найденные шрифты.
#!/bin/bash
code=0410
char=$(printf '%b' '\U'$code)
fc-list ':charset='$code --format '%{file}\n' |\
grep -wof - <(convert -list font) | while read line
do
name=${line##*/}
name=${name%.*}
convert -font "$line" -pointsize 48 label:"$char" ./${name}.png
done
После запуска скрипта, в каталоге появится портянка файлов с изображениями, учти этот момент, чтобы не засрать себе п
У меня всё, не смею тебя больше отвлекать. Изучай. Увидимся!
tags: #bash #linux
—
Please open Telegram to view this post
VIEW IN TELEGRAM
И снова понедельник и снова на работу. Сегодня про оптимизацию и управляющие последовательности. Бест-практики, трувей ёпта!
Если в своих скриптах или программах ты часто используешь одинаковые управляющие последовательности, имеет смысл сохранить результаты работы утилиты tput в переменную.
Скучная теория
✔️ Практика
Чтобы не усложнять, рассмотрим пример на основе clear. Эта команда очищает экран.
Помещаем в переменную очистку экрана. Теперь проверяем:
После выполнения одной из этих команд, экран терминала будет очищен.
А почему просто не выполнить команду clear без этих вонючих tput? Потому, что это самый простой пример, чтобы ты въехал в суть.
Получается мы не плодим в своих скриптах кучу tput clear а используем оптимизированный вариант с переменной.
Чем больше параметров в tput, тем больше треша в скриптах. Проще же один раз закинуть в переменную эту кишку и не маяться хуйнёй.
Посмотреть управляющую последовательно ты можешь так:
На экран выведется:
Конструкция:
Начиная с версии 4.4 в Bash, значение parameter заключаются в одинарные кавычки.
Пример одной строкой:
1. Генерируем управляющую последовательность для перемещения курсора терминала на 20 строку и колонку 60.
2. Передаем полученную строку по пайпу.
3. Читаем строку и присваиваем ее переменной BASHDAYS.
4. Выводим значение переменной BASHDAYS.
По итогу получаем такое:
Еще вариант:
Результат сам посмотришь если интересно.
Для многих это тема не новая, но я частенько наблюдаю в скриптах избыточное применение этих управляющих последовательностей.
Короче пихай это говнище в переменную и будет заебись!
На закуску держи интересный пример определения и сохранения последовательностей.
Давай краба, увидимся!
tags: #bash #linux
—
🔔 @bashdays
Если в своих скриптах или программах ты часто используешь одинаковые управляющие последовательности, имеет смысл сохранить результаты работы утилиты tput в переменную.
Скучная теория
tput используется для управления терминалом и выполнения различных задач, связанных с его настройкой и управлением.
Управляющие последовательности — это специальные последовательности символов, используемые для управления поведением терминала. Они позволяют изменять цвета текста, перемещать курсор, очищать экран и выполнять другие действия, не изменяя сам текст.
Чтобы не усложнять, рассмотрим пример на основе clear. Эта команда очищает экран.
clear=$(tput clear)
Помещаем в переменную очистку экрана. Теперь проверяем:
printf '%s' $clear
echo -n $clear
После выполнения одной из этих команд, экран терминала будет очищен.
А почему просто не выполнить команду clear без этих вонючих tput? Потому, что это самый простой пример, чтобы ты въехал в суть.
Получается мы не плодим в своих скриптах кучу tput clear а используем оптимизированный вариант с переменной.
Чем больше параметров в tput, тем больше треша в скриптах. Проще же один раз закинуть в переменную эту кишку и не маяться хуйнёй.
Посмотреть управляющую последовательно ты можешь так:
echo ${clear@Q}
На экран выведется:
$'\E[H\E[2J\E[3J'
Конструкция:
${clear@Q}
это использование параметра расширения в Bash, который отображает значение переменной clear в форме, пригодной для использования в качестве строки в программном коде. Это означает, что специальные символы будут экранированы.Начиная с версии 4.4 в Bash, значение parameter заключаются в одинарные кавычки.
${parameter@Q}
Экранирование помогает избежать интерпретации специальных символов терминалом и позволяет безопасно выводить последовательности на экран.
Пример одной строкой:
tput cup 20 60 | { read -r BASHDAYS; echo ${BASHDAYS@Q}; }
1. Генерируем управляющую последовательность для перемещения курсора терминала на 20 строку и колонку 60.
2. Передаем полученную строку по пайпу.
3. Читаем строку и присваиваем ее переменной BASHDAYS.
4. Выводим значение переменной BASHDAYS.
По итогу получаем такое:
$'\E[21;61H'
Еще вариант:
tput cup 1 10 | cat -v ; echo
Результат сам посмотришь если интересно.
Для многих это тема не новая, но я частенько наблюдаю в скриптах избыточное применение этих управляющих последовательностей.
Короче пихай это говнище в переменную и будет заебись!
На закуску держи интересный пример определения и сохранения последовательностей.
Давай краба, увидимся!
tags: #bash #linux
—
Please open Telegram to view this post
VIEW IN TELEGRAM
Привет. Завтра оказывается внеплановый выходной, придется вечером идти за пивом и досматривать «Задача трёх тел» и «Сёгуна».
И раз такие пироги, расскажу тебе про очередную хуйню, с помощью которой я в данный момент делаю себе ой как больно.
Все посты для этого канала я пишу в Obsidian, это не только текстовый редактор, но и вообще комбайн для сбора и структурирования информации.
Короче если ищешь куда складировать знания, рекомендую присмотреться к Obsidian, работает на любой операционке, включая мобилки.
✔ И еще это основной инструмент адептов Zetelkasten.
Звучит это правда как — Флюгегехаймен!
Теперь про боли. В последни год я редко пишу код, совсем забросил свой любимый vim и успешно забыл все комбинации клавиш.
Ситуация конечно интересная — тратишь кучу времени на изучение комбинаций в vim, доводишь их до инстинктов и мышечной памяти. Но спустя месяц, все эти скиллы куда-то бесследно испаряются.
Походу как у бодибилдиров, накачал за год банки, на месяц сделал паузу и превратился снова в дрища. Ну пиздец же.
А чтобы не просрать эти скиллы, нужно ежедневно их применять. А как их применять, если нет необходимости?
Просто так дрочить вприсядку тоже не хочется, хочется чем-то полезным заниматься и не деградировать.
В общем в Obsidian есть нативная поддержка vim. Я конечно знатно прихуел, но воодушевился.
То есть я могу теперь писать для вас посты в комфортной для себя среде и не проёбывать скиллы по виму.
Это же прекрасно!🤙
Правда я растерял всю свою прыть и поэтому приходится заново затачивать свои зажившие пальцы под аккорды вима.
Мыши кололись, плакали, но продолжали есть кактус…
Ты наверное предложишь мне писать посты сразу в виме, идея хорошая, но от Obsidian я тащусь не меньше чем от вима. Все же это немного разные инструменты.
Вот те ссылка на Obsidian чтоб не искать
Так что, теперь я совмещаю приятное с полезным. Люблю изобретать.
Может и тебя этот пост натолкнет на какие-то правильные мысли. И ты скрестишь своего бульдога с носорогом.
Кстати когда я в Obsidian включил режим VIM, он мне выдал интересный попапчик, в котором до включения режима, предложил пройти небольшой квест. Прям повеселило!👇
tags: #рабочиебудни
—
🔔 @bashdays
И раз такие пироги, расскажу тебе про очередную хуйню, с помощью которой я в данный момент делаю себе ой как больно.
Все посты для этого канала я пишу в Obsidian, это не только текстовый редактор, но и вообще комбайн для сбора и структурирования информации.
Короче если ищешь куда складировать знания, рекомендую присмотреться к Obsidian, работает на любой операционке, включая мобилки.
Цеттелькастен (нем. Zettelkasten, буквальный перевод «ящики для заметок») — система ведения заметок и управления личными знаниями, используемая в исследованиях и учёбе.
Звучит это правда как — Флюгегехаймен!
Теперь про боли. В последни год я редко пишу код, совсем забросил свой любимый vim и успешно забыл все комбинации клавиш.
Ситуация конечно интересная — тратишь кучу времени на изучение комбинаций в vim, доводишь их до инстинктов и мышечной памяти. Но спустя месяц, все эти скиллы куда-то бесследно испаряются.
Походу как у бодибилдиров, накачал за год банки, на месяц сделал паузу и превратился снова в дрища. Ну пиздец же.
А чтобы не просрать эти скиллы, нужно ежедневно их применять. А как их применять, если нет необходимости?
Просто так дрочить вприсядку тоже не хочется, хочется чем-то полезным заниматься и не деградировать.
В общем в Obsidian есть нативная поддержка vim. Я конечно знатно прихуел, но воодушевился.
То есть я могу теперь писать для вас посты в комфортной для себя среде и не проёбывать скиллы по виму.
Это же прекрасно!
Правда я растерял всю свою прыть и поэтому приходится заново затачивать свои зажившие пальцы под аккорды вима.
Мыши кололись, плакали, но продолжали есть кактус…
Ты наверное предложишь мне писать посты сразу в виме, идея хорошая, но от Obsidian я тащусь не меньше чем от вима. Все же это немного разные инструменты.
Вот те ссылка на Obsidian чтоб не искать
Так что, теперь я совмещаю приятное с полезным. Люблю изобретать.
Может и тебя этот пост натолкнет на какие-то правильные мысли. И ты скрестишь своего бульдога с носорогом.
Кстати когда я в Obsidian включил режим VIM, он мне выдал интересный попапчик, в котором до включения режима, предложил пройти небольшой квест. Прям повеселило!
tags: #рабочиебудни
—
Please open Telegram to view this post
VIEW IN TELEGRAM
Как говорится никогда не строй планы заранее. Вчера я успешно задрых и проебал момент с чаркой пива и сериальчиками. Ну хоть выспался, 12 часов сна пошли на пользу.
А сегодня я принес тебе Puter. Это операционка прям в браузере. Даже терминал есть, но урезанный.
Фишка этой операционки — ты можешь ее в докере поднять у себя и радоваться, прекрасно подходит для всяких малинок если иксы ставить прям впадлу. Ну и куча софта предустановлено, открывай и пиши код до посинения.
✔ Вся эта кухня в оупенсорсе на гитхабе.
В демо версии есть хром браузер. Через него можно побегать по сайтам не светя свою жопку с айпишником.
Айпишники кстати там разные попадаются, сейчас мне показывает — Пиздастан Редмонд.
Ну ты понял, как этим можно воспользоваться😲
Короче я принес, а ты уже сам смотри, мож где сгодится в хозяйстве. Увидимся!
tags: #services
—
🔔 @bashdays
А сегодня я принес тебе Puter. Это операционка прям в браузере. Даже терминал есть, но урезанный.
Фишка этой операционки — ты можешь ее в докере поднять у себя и радоваться, прекрасно подходит для всяких малинок если иксы ставить прям впадлу. Ну и куча софта предустановлено, открывай и пиши код до посинения.
В демо версии есть хром браузер. Через него можно побегать по сайтам не светя свою жопку с айпишником.
Айпишники кстати там разные попадаются, сейчас мне показывает — Пиздастан Редмонд.
Ну ты понял, как этим можно воспользоваться
Кстати отлично запускается порнохабина, даже ЗВУК есть!
Короче я принес, а ты уже сам смотри, мож где сгодится в хозяйстве. Увидимся!
tags: #services
—
Please open Telegram to view this post
VIEW IN TELEGRAM