Сегодня за девопс, gitlab и как сделать комфортный pipeline с выпадающими списками Variables + Бонусы.
Из коробки, когда ты жмешь кнопку Run Pipeline, тебе нужно руками вбивать нужные Variables, например, чтобы указать окружение, в которое будет раскатан релиз.
Каждый раз вбивать руками
Хочется чтобы был выпадающий список со всеми параметрами. Накликал мышкой и в продакшен.
Выпадающие списки можно делать не только с окружениями, но и добавить банальные вопросы YES/NO и прочее. А затем в секции rules уже все это разруливать и обрабатывать.
✔️ Ниже базовая болванка
Создаем файл
В первой секции variables, описываем выпадающий список. Из него будем выбирать мышкой, куда деплоить.
N/A (выбран по умолчанию) добавлено для дураков, которые ничего не выбирают и сразу тыкают Run Pipeline. В таком случае пайплайн зафейлится и ничего не пострадает.
Дальше идут две секции, которые описывают окружения stage и production, там указываем айпишинки и вообще всё, что захотим для каждого окружения. Можно флагов навтыкать и прочего говна.
Ну и основная секция deploy, у меня указан раннер с тэгом common-runner, а потом полезная нагрузка которая будет выполнена.
В секции rules зашита логика. В зависимости от того, какое окружение было выбрано из выпадающего списка, применяются настройки либо от stage, либо от production. Короче инклудится нужное.
Собственно всё. Если нужно добавить еще каких-то выпадающих списков, добавляем в первую секцию всё необходимое, аналогично ENVIRONMENT. Ну и потом в rules все это обрабатываем. Например, так:
В общем всё элементарно. По итогу получаем незамысловатый пайплайн, всё в одном месте и ничего не раскидано по самому gitlab.
Бонусы. Да, если нужен общий пайплайн для нескольких проектов, делаем так:
Создаем репу dev/pipelines, кидаем туда файл .gitlab-ci.yml, настраиваем в нем всё под свои реалии.
Дальше в нужных проектах добавляем файл .gitlab-ci.yml с таким содержимым:
Всё, теперь не надо плодить кучу .gitlab-ci.yml с одинаковым содержимым, все инклудится из одного места. Ну и если нужно что-то поменять, меняем один раз и все проекты автоматически это подхватывают.
Максимально попытался упростить и сделать наглядно, а дальше уже включай фантазию и твори.
Хорошего тебе дня, увидимся!
tags: #devops
@ВАSНDАYS | BАSHDАYS.CОM
Из коробки, когда ты жмешь кнопку Run Pipeline, тебе нужно руками вбивать нужные Variables, например, чтобы указать окружение, в которое будет раскатан релиз.
Каждый раз вбивать руками
Variable ENVIRONMENT=stage / production ну пиздец тяжко и неудобно. А если таких переменных овердохуя, то всё желание пропадает что-то делать.Хочется чтобы был выпадающий список со всеми параметрами. Накликал мышкой и в продакшен.
Выпадающие списки можно делать не только с окружениями, но и добавить банальные вопросы YES/NO и прочее. А затем в секции rules уже все это разруливать и обрабатывать.
Создаем файл
.gitlab-ci.yml в корне проекта и добавляем в него:variables:
ENVIRONMENT:
value: "N/A"
options:
- "N/A"
- "STAGE"
- "PRODUCTION"
description: "Deployment environment"
.stage_server:
&stage_server
WEB_NODE: "xx.xx.xx.xx"
DB_NODE: "xx.xx.xx.xx"
.production_server:
&production_server
WEB_NODE: "xx.xx.xx.xx"
DB_NODE: "xx.xx.xx.xx"
deploy:
tags:
- common-runner
script:
- echo $ENVIRONMENT
- echo "build & deploy here"
rules:
- if: '$ENVIRONMENT == "STAGE"'
variables:
<<: *stage_server
- if: '$ENVIRONMENT == "PRODUCTION"'
variables:
<<: *production_server
В первой секции variables, описываем выпадающий список. Из него будем выбирать мышкой, куда деплоить.
N/A (выбран по умолчанию) добавлено для дураков, которые ничего не выбирают и сразу тыкают Run Pipeline. В таком случае пайплайн зафейлится и ничего не пострадает.
Дальше идут две секции, которые описывают окружения stage и production, там указываем айпишинки и вообще всё, что захотим для каждого окружения. Можно флагов навтыкать и прочего говна.
Ну и основная секция deploy, у меня указан раннер с тэгом common-runner, а потом полезная нагрузка которая будет выполнена.
В секции rules зашита логика. В зависимости от того, какое окружение было выбрано из выпадающего списка, применяются настройки либо от stage, либо от production. Короче инклудится нужное.
Собственно всё. Если нужно добавить еще каких-то выпадающих списков, добавляем в первую секцию всё необходимое, аналогично ENVIRONMENT. Ну и потом в rules все это обрабатываем. Например, так:
- if: '$JOB == "YES" && $ENVIRONMENT == "STAGE"'
В общем всё элементарно. По итогу получаем незамысловатый пайплайн, всё в одном месте и ничего не раскидано по самому gitlab.
Бонусы. Да, если нужен общий пайплайн для нескольких проектов, делаем так:
Создаем репу dev/pipelines, кидаем туда файл .gitlab-ci.yml, настраиваем в нем всё под свои реалии.
Дальше в нужных проектах добавляем файл .gitlab-ci.yml с таким содержимым:
include:
- project: "dev/pipelines"
file: ".gitlab-ci.yml"
Всё, теперь не надо плодить кучу .gitlab-ci.yml с одинаковым содержимым, все инклудится из одного места. Ну и если нужно что-то поменять, меняем один раз и все проекты автоматически это подхватывают.
Максимально попытался упростить и сделать наглядно, а дальше уже включай фантазию и твори.
Хорошего тебе дня, увидимся!
tags: #devops
@ВАSНDАYS | BАSHDАYS.CОM
Please open Telegram to view this post
VIEW IN TELEGRAM
Чипи-чипи, чапа-чапа. Привет, на скрине 🚫 некий Linux бедолага очень обрадовался, когда нашел пасхалку в команде date. Этакий нигде недокументированный аргумент.
Ну да, если запросить help либо глянуть в гуглах, такая конструкция нигде не упоминается.
Молодец чо. НО, если бы он знал про функцию getopt_long, то вряд ли сделал открытие. Ща расскажу в чем прикол.
Короче, куча программ и утилит используют функцию getopt_long для перебора командной строки. И эта функция распознает сокращения в длинных аргументах и опциях.
Собственно вот оригинальная команда:
Но если пропустить её через getopt_long, получим ту самую «пасхалку»:
✔️ Еще примеры для понимания:
Понял в чем прикол? Но это еще не всё!
Утилиты из состава пакета coreutils, поддерживают сокращения аргументов и опций. Смотри:
Аналогично с длинными опциями:
Ну и на примере ls и sort:
Вся эта байда с сокращением, реализуется с помощью функций из библиотеки Gnulib, которые в свою очередь опираются на функции glibc.
Что имеем? Не нужно искать пасхалки, там где их нет.
Такие дела!
tags: #linux
—
🔔 @bashdays
date --iso=seconds
Ну да, если запросить help либо глянуть в гуглах, такая конструкция нигде не упоминается.
Молодец чо. НО, если бы он знал про функцию getopt_long, то вряд ли сделал открытие. Ща расскажу в чем прикол.
Короче, куча программ и утилит используют функцию getopt_long для перебора командной строки. И эта функция распознает сокращения в длинных аргументах и опциях.
Функция getopt_long входит в состав пакета GNU C (glibc)
Собственно вот оригинальная команда:
date --iso-8601=seconds
Но если пропустить её через getopt_long, получим ту самую «пасхалку»:
date --iso=seconds
1. nano --smart --book
2. ls --hyper --show
3. du --one --human --sum
1. --smarthome --bookstyle
2. --hyperlink --show-control-chars
3. --one-file-system --human-readable --summarize
Понял в чем прикол? Но это еще не всё!
Утилиты из состава пакета coreutils, поддерживают сокращения аргументов и опций. Смотри:
for i in d h m s n; do date -I"$i"; done
2024-05-14
2024-05-14T09+00:00
2024-05-14T09:59+00:00
2024-05-14T09:59:37+00:00
2024-05-14T09:59:37,850707267+00:00
-Id == -Idate
-Ih == -Ihours
-Im == -Iminutes
-Is == -Iseconds
-In == -Ins
Аналогично с длинными опциями:
for i in d h m s n; do date --iso="$i"; done
2024-05-14
2024-05-14T10+00:00
2024-05-14T10:01+00:00
2024-05-14T10:01:57+00:00
2024-05-14T10:01:57,460027853+00:00
--iso=d == --iso-8601=date
--iso=h == --iso-8601=hours
--iso=m == --iso-8601=minutes
--iso=s == --iso-8601=seconds
--iso=n == --iso-8601=ns
Ну и на примере ls и sort:
ls --col=al | cat
--col=al == --color=always
printf '%s\n' {20..1} | sort --so=n--so=n == --sort=numeric
Вся эта байда с сокращением, реализуется с помощью функций из библиотеки Gnulib, которые в свою очередь опираются на функции glibc.
Что имеем? Не нужно искать пасхалки, там где их нет.
Такие дела!
tags: #linux
—
Please open Telegram to view this post
VIEW IN TELEGRAM
Упоримся? А давай!
Открывай терминал с башем и запускай команду:
По идее тут что-то вроде бесконечного цикла, который будет cat’ить на экран файл hosts, предварительно грепнув содержимое по символу «a».
Запустил? И всё зависло! По крайней мере у меня вывелась только одна строчка вида:
Но почему оно зависло? А потому, что утилита cat при попытке записать данные в сломанный канал, завершается сигналом.
✔️ Давай убедимся:
Получаем цифру 13. Откуда она взялась? Смотри! Если команда завершается сигналом, тогда статус ошибки ($?) == 128 + Номер сигнала.
А дальше вычитаем, делим, умножаем, корень квадратный вычисляем, заводим в дискриминант по синусу. Пеню. Короче получили цифру 13.
Более подробно про сигналы мы с тобой разбирали в этом посте.
Давай посмотрим, что такое 13:
Вывелось PIPE, что равносильно SIGPIPE (Broken Pipe). Ага!
Получается что наш бесконечный цикл постоянно запускает утилиту cat, которая тут же завершается.
Раньше эта ситуация была очевидна и на экран выводилась ошибка. А вот с версии Bash 3.1-alpha1 это пофиксили, вот выжимка из спеков:
Нахуй так сделали, непонятно, скорее всего ушли в сторону set pipefail, типа кому надо тот включит, чтобы лишнее гавно на экран не сыпалось.
Ладно. После запуска этого бесконечного цикла, можешь запустить htop и визуально глянуть как порождается бесконечное количество процессов, растет счетчик PID. А как только выработан лимит PID, пиды начинают использоваться повторно. В общем это хорошо видно.
Ну либо так можно глянуть:
Увидишь большую разницу между значениями PID.
Теперь как это пофиксить. Если уж захотелось упороться, нужно упарываться правильно.
Вот несколько вариантов:
Если присмотреться, может возникнуть вопрос — а откуда выходит exit? Цикл выполняется в подоболочке, потому что является участником канала.
Давай проверим:
Запускаем конвейер в фоне. Команда cat без указания аргументов будет читать стандартный ввод, который в данной ситуации ассоциирован с терминалом и ждет ввода данных.
А такое не позволительно фоновым процессам, поэтому такие задания будут приостановлены.
Проверяем, что оно действительно приостановлено:
Ну и теперь смотрим, кто есть кто:
Процесс 251913/251893 и есть подоболочка, в котором крутится наш цикл. Вот с этой подоболочки и выходит exit.
Сложно? Да не… азы с некоторыми нюансами. Изучай!
tags: #linux #bash
—
🔔 @bashdays
Открывай терминал с башем и запускай команду:
while :; do cat /etc/hosts ; done | grep -m1 'a'
По идее тут что-то вроде бесконечного цикла, который будет cat’ить на экран файл hosts, предварительно грепнув содержимое по символу «a».
Аргумент -m1 = выход после первого вхождения искомой подстроки. После этого, конец канала закрывается для чтения.
Запустил? И всё зависло! По крайней мере у меня вывелась только одна строчка вида:
127.0.0.1 localhost bashdays
Но почему оно зависло? А потому, что утилита cat при попытке записать данные в сломанный канал, завершается сигналом.
set -o pipefail
cat /etc/hosts | exit 0
echo $(( $? > 128 ? $? - 128 : $? ))
Получаем цифру 13. Откуда она взялась? Смотри! Если команда завершается сигналом, тогда статус ошибки ($?) == 128 + Номер сигнала.
А дальше вычитаем, делим, умножаем, корень квадратный вычисляем, заводим в дискриминант по синусу. Пеню. Короче получили цифру 13.
Более подробно про сигналы мы с тобой разбирали в этом посте.
Давай посмотрим, что такое 13:
kill -l 13
Вывелось PIPE, что равносильно SIGPIPE (Broken Pipe). Ага!
Получается что наш бесконечный цикл постоянно запускает утилиту cat, которая тут же завершается.
Раньше эта ситуация была очевидна и на экран выводилась ошибка. А вот с версии Bash 3.1-alpha1 это пофиксили, вот выжимка из спеков:
This document details the changes between this version, bash-3.1-alpha1,
and the previous version, bash-3.0-release.
By default, the shell no longer reports processes dying from SIGPIPE.
Нахуй так сделали, непонятно, скорее всего ушли в сторону set pipefail, типа кому надо тот включит, чтобы лишнее гавно на экран не сыпалось.
Ладно. После запуска этого бесконечного цикла, можешь запустить htop и визуально глянуть как порождается бесконечное количество процессов, растет счетчик PID. А как только выработан лимит PID, пиды начинают использоваться повторно. В общем это хорошо видно.
Ну либо так можно глянуть:
ps --no-headers --sort=pid -eo pid
Увидишь большую разницу между значениями PID.
Теперь как это пофиксить. Если уж захотелось упороться, нужно упарываться правильно.
Вот несколько вариантов:
while : ; do cat /etc/hosts || { echo $? >&2 ; exit; } ;done | grep -m1 'a'
while : ; do cat /etc/hosts || break ; done | grep -m1 'a'
while : ; do cat /etc/hosts || exit ; done | grep -m1 'a'Если присмотреться, может возникнуть вопрос — а откуда выходит exit? Цикл выполняется в подоболочке, потому что является участником канала.
Давай проверим:
while : ; do cat ; done | grep -m1 'a' &
Запускаем конвейер в фоне. Команда cat без указания аргументов будет читать стандартный ввод, который в данной ситуации ассоциирован с терминалом и ждет ввода данных.
А такое не позволительно фоновым процессам, поэтому такие задания будут приостановлены.
Проверяем, что оно действительно приостановлено:
jobs -l
[1]+251913 Stopped (tty input) while :; do
cat;
done
251921 | grep --color=auto -m1 'a'
Ну и теперь смотрим, кто есть кто:
ps --forest -o pid,ppid,stat,comm
PID PPID STAT COMMAND
251893 251854 Ss bash
251913 251893 T \_bash
251924 251913 T | \_cat
251921 251893 T \_grep
251962 251893 R+ \_ps
Процесс 251913/251893 и есть подоболочка, в котором крутится наш цикл. Вот с этой подоболочки и выходит exit.
Сложно? Да не… азы с некоторыми нюансами. Изучай!
tags: #linux #bash
—
Please open Telegram to view this post
VIEW IN TELEGRAM
Привет. В Linux есть утилита basenc, которая входит в состав пакета coreutils. С помощью неё можно конвертировать данные в двоичный формат. Это который
Видел на днях как люди упарывались и писали свои велосипеды, банально не зная о существовании этой утилиты и её возможностях.
А всё просто, давай закодируем название деревни:
По итогу получаем набор 0 и 1. Ключ -w16 я указываю, чтобы выводить по 16 символов в строке. Для удобства. Так как русские символы кодируются двумя байтами.
✔️ Вывод получился таким:
А почему в последней строке какой-то обрубок?
Это не обрубок, это 8 бит! И эти 8 бит == символу новой строки, который закодирован одним байтом, о чем нам говорит левый бит первого и единственного октета (00001010).
А декодируется всё это безобразие так:
Просто указываем ключ -d и вуаля!
Если тема интересна, можешь почитать более подробно про кодирование UTF-8 здесь.
⚡ Вага-вага!
Сегодня чуть позже (16:00 МСК) залетит еще один партнерский пост, но это будет не просто рекламная интеграция.
Ниже я сделаю кнопку (в 16:02 МСК). Нажав на нее ты сможешь выиграть 1 бесплатный купон на неплохую онлайн конфу. Всего будет 3 таких купона. Всю эту кухню контролирую лично я, поэтому наёба тут нет.
А на следующей неделе будет еще одна движуха, но там уже более интересная и интерактивная, с денежными призами и облачными серверами, вчера в чатике подробности озвучивал.
Короче если интересно, не пропусти. Давай, хорошего дня!
tags: #linux #bash
—
🔔 @bashdays
00110010.Видел на днях как люди упарывались и писали свои велосипеды, банально не зная о существовании этой утилиты и её возможностях.
А всё просто, давай закодируем название деревни:
echo 'пиздачосово' | basenc -w16 --base2msbf
По итогу получаем набор 0 и 1. Ключ -w16 я указываю, чтобы выводить по 16 символов в строке. Для удобства. Так как русские символы кодируются двумя байтами.
1101000010111111
1101000010111000
1101000010110111
1101000010110100
1101000010110000
1101000110000111
1101000010111110
1101000110000001
1101000010111110
1101000010110010
1101000010111110
00001010
А почему в последней строке какой-то обрубок?
Это не обрубок, это 8 бит! И эти 8 бит == символу новой строки, который закодирован одним байтом, о чем нам говорит левый бит первого и единственного октета (00001010).
А декодируется всё это безобразие так:
str="1101000010111111110100001011100011010000101101111101000010110100110100001011000011010001100001111101000010111110110100011000000111010000101111101101000010110010110100001011111000001010"
echo $str | basenc -d --base2msbf
Просто указываем ключ -d и вуаля!
Если тема интересна, можешь почитать более подробно про кодирование UTF-8 здесь.
Сегодня чуть позже (16:00 МСК) залетит еще один партнерский пост, но это будет не просто рекламная интеграция.
Ниже я сделаю кнопку (в 16:02 МСК). Нажав на нее ты сможешь выиграть 1 бесплатный купон на неплохую онлайн конфу. Всего будет 3 таких купона. Всю эту кухню контролирую лично я, поэтому наёба тут нет.
А на следующей неделе будет еще одна движуха, но там уже более интересная и интерактивная, с денежными призами и облачными серверами, вчера в чатике подробности озвучивал.
Короче если интересно, не пропусти. Давай, хорошего дня!
tags: #linux #bash
—
Please open Telegram to view this post
VIEW IN TELEGRAM
Здрасти. Утренний мини пост, вечером еще закину чтива.
Как ты знаешь, утилита false возвращает всегда ошибку (код завершения 1). Давай запустим и убедимся:
Все правильно. В этом примере была запущена встроенная команда false в оболочку Bash. Но как мы знаем, существует альтернативная реальность и альтернативная команда false, которая лежит тут:
Теперь сделаем такое:
Используя env, мы запустили альтернативную версию false. И что мы видим? Вывалилась страница help. Очевидно? Ага!
А теперь давай посмотрим код выхода, после вывода help.
Чо блядь? Почему единица? Команда по выводу справки отработала корректно? Корректно! Ожидаем ноль? Ага! Но вот хуюшки! Получите единицу!
Баг? Не думаю. Давай проверим на выводе версии:
Неа, не баг, команда false настолько суровая, что возвращает единицу, там где это не нужно.
Специально ли это сделали, никто не знает. Но факт остается фактом.
✔️ Посмотреть чем является команда, можно с помощью команды type:
Вот такие вот перлы порой случаются. Ошибка и точка!
tags: #bash #linux
—
🔔 @bashdays
Как ты знаешь, утилита false возвращает всегда ошибку (код завершения 1). Давай запустим и убедимся:
false
echo $?
1
Все правильно. В этом примере была запущена встроенная команда false в оболочку Bash. Но как мы знаем, существует альтернативная реальность и альтернативная команда false, которая лежит тут:
whereis false
false: /usr/bin/false
Теперь сделаем такое:
env false --help
Используя env, мы запустили альтернативную версию false. И что мы видим? Вывалилась страница help. Очевидно? Ага!
А теперь давай посмотрим код выхода, после вывода help.
echo $?
1
Чо блядь? Почему единица? Команда по выводу справки отработала корректно? Корректно! Ожидаем ноль? Ага! Но вот хуюшки! Получите единицу!
Баг? Не думаю. Давай проверим на выводе версии:
env false --version
echo $?
1
Неа, не баг, команда false настолько суровая, что возвращает единицу, там где это не нужно.
Всё дело в том, что во всех этих примерах в качестве кода выхода используется значение одной и той же константы.
Специально ли это сделали, никто не знает. Но факт остается фактом.
type -a false
false is a shell builtin
false is /usr/bin/false
false is /bin/false
Вот такие вот перлы порой случаются. Ошибка и точка!
tags: #bash #linux
—
Please open Telegram to view this post
VIEW IN TELEGRAM
Если испытываешь проблемы с написанием постов, есть пиздатый лайкфак!
А далее пост пишется на одном дыхании. Кстати этот способ отлично работает для всяких документаций, планирования спринтов и т.п.
Ну чо — Короче блядь. Пятничная математика!
Массив bin содержит 256 восьмиразрядных числа в двоичной системе счисления.
Получаем:
Количество разрядов двоичного числа (длина любого индекса)
Получаем:
Количество двоичных чисел (длина массива)
Получаем:
Разрядность можно регулировать количеством списков начиная с
✔️ Раз зашел разговор за память...
Иииииии… Получаемпо ебалу :
А почему так? Минус каким хером тут? А все правильно!
Эта ситуация называется — Целочисленное переполнение. И оно НЕ отслеживается в Bash!
Начиная с версии 2.05b-alpha1 используется тип intmax_t.
Ну и смотрим маны:
Давай затестим:
У меня такое:
Это границы для положительных и отрицательных чисел.
Чо еще…
Перевод из двоичной системы счисления в десятичную.
Получаем:
В арифметических операциях Bash можно задавать систему счисления.
В общем случае в данных конструкциях не обязательно указывать знак $ перед именем переменной. Но при указании системы счисления это всё же нужно.
Получаем:
Наверное на этом всё, если есть что добавить, пиши в комменты. Хороших тебе предстоящих выходных и береги себя!
tags: #bash #linux
—
🔔 @bashdays
Открываешь свой любимый редактор и пишешь — Короче блядь!
А далее пост пишется на одном дыхании. Кстати этот способ отлично работает для всяких документаций, планирования спринтов и т.п.
Ну чо — Короче блядь. Пятничная математика!
Массив bin содержит 256 восьмиразрядных числа в двоичной системе счисления.
bin=({0..1}{0..1}{0..1}{0..1}{0..1}{0..1}{0..1}{0..1})Особенность этого массива — значение любого элемента массива, соответствует индексу элемента в двоичном представлении. Таким образом перевод числа из десятичной в двоичную систему счисления, сводится к заданию числа (дес) в качестве индекса.
echo ${bin[101]}Получаем:
01100101Количество разрядов двоичного числа (длина любого индекса)
echo ${#bin[0]}Получаем:
8Количество двоичных чисел (длина массива)
echo ${#bin[@]}Получаем:
256Разрядность можно регулировать количеством списков начиная с
{0..1}{0..1}. Но будь очень осторожен, память не резиновая!echo $((2**63))
Иииииии… Получаем
-9223372036854775808А почему так? Минус каким хером тут? А все правильно!
Эта ситуация называется — Целочисленное переполнение. И оно НЕ отслеживается в Bash!
Про Целочисленное переполнение читай тут
help let
Начиная с версии 2.05b-alpha1 используется тип intmax_t.
This document details the changes between this version, bash-2.05b-alpha1, and the previous version, bash-2.05a-release.
The shell now performs arithmetic in the largest integer size the machine supports (intmax_t), instead of long.
Ну и смотрим маны:
man 7 system_data_types
Давай затестим:
echo "Дипазон: От $((2**63)) до $((2**63-1))"
У меня такое:
-9223372036854775808 до 9223372036854775807Это границы для положительных и отрицательных чисел.
Чо еще…
Перевод из двоичной системы счисления в десятичную.
echo $(( 2#1000 ))
Получаем:
8В арифметических операциях Bash можно задавать систему счисления.
echo $(( 2#1000 + 2#1000 ))
let dec=2#0001
echo $dec
В общем случае в данных конструкциях не обязательно указывать знак $ перед именем переменной. Но при указании системы счисления это всё же нужно.
bin=0011
echo $(( 2#$bin ))
Получаем:
3Наверное на этом всё, если есть что добавить, пиши в комменты. Хороших тебе предстоящих выходных и береги себя!
tags: #bash #linux
—
Please open Telegram to view this post
VIEW IN TELEGRAM
Грузить не буду, как-никак выходные. Подкину интересного чтива. Если коротко — автор статьи предлагает использовать в скриптах для комментариев, команду «:» вместо символа «#».
Это позволяет видеть комментарии в режиме отладки. Подход имеет ряд некоторых проблем, но общая концепция весьма интересна.
✔️ COLODEBUG: a simple way to improve bash script debugging.
Статья на иностранном, но с переводчиком всё понятно. Изучайте.
tags: #bash #linux
—
🔔 @bashdays
Это позволяет видеть комментарии в режиме отладки. Подход имеет ряд некоторых проблем, но общая концепция весьма интересна.
Статья на иностранном, но с переводчиком всё понятно. Изучайте.
tags: #bash #linux
—
Please open Telegram to view this post
VIEW IN TELEGRAM
Сегодня дождливый день, даже материться не хочется.
Поэтому потыкаем strace и файловый менеджер.
Для экспериментов я взял десктопный линукс на 22 убунте + gnome. Внутри моего гнома зашит файловый менеджер Nautilus. Но подойдет абсолютно любой дистрибутив и любой файловый менеджер например kde/dolphin.
Для начала создаём файл:
Этот файл я приправил магическими числами
Так, запускаем:
Не забудь указать актуальное название своего файлового менеджера, у меня nautilus, у тебя может быть другой.
После запуска в файловом браузере откроется папка tmp, в ней мы увидим наш файл bashdays. Иконка у этого файла соответствует иконке bz2 архива.
Теперь возвращаемся в терминал с strace и смотрим что произошло.
В выводе наблюдаем обращение к файлу
Отлично! Мы на верном пути. Теперь закрываем файловый менеджер, тормозит ранее запущенный strace. И добавляем к файлу расширение txt.
Снова запускаем strace:
И видим другую картину:
Отсутствуют системные вызовы связанные с чтением файла. А файловый менеджер интерпретировал это как текстовый файл. Сменилась иконка.
Если сейчас кликнуть на этом файле 2 раза, то файл откроется в текстовом редакторе.
✔️ Делаем выводы
Если у файла есть расширение, то файловый менеджер полагается на него и не производит никаких действий с файлом.
А если расширение не указано, то происходит анализ содержимого. В моём случае файловый менеджер нашел сигнатуру bz2 и автоматически решил что это архив.
Чтобы определить тип файла, можешь воспользоваться командой:
Вот такая вот логика зашита в кишочках.
Хорошей тебе рабочей недели, изучай!
tags: #linux #debug
—
🔔 @bashdays
Поэтому потыкаем strace и файловый менеджер.
Для экспериментов я взял десктопный линукс на 22 убунте + gnome. Внутри моего гнома зашит файловый менеджер Nautilus. Но подойдет абсолютно любой дистрибутив и любой файловый менеджер например kde/dolphin.
Для начала создаём файл:
echo -ne '\x42\x5a\x68' > /tmp/bashdays
Этот файл я приправил магическими числами
hex:42 5a 68, что равносильно формату файла: bz2.Так, запускаем:
strace -o'|cat' -P /tmp/bashdays -qqqyf nautilus /tmp 2> /dev/null
Не забудь указать актуальное название своего файлового менеджера, у меня nautilus, у тебя может быть другой.
После запуска в файловом браузере откроется папка tmp, в ней мы увидим наш файл bashdays. Иконка у этого файла соответствует иконке bz2 архива.
Теперь возвращаемся в терминал с strace и смотрим что произошло.
openat("/tmp/bashdays", O_RDONLY) = 25</tmp/bashdays>
read(25</tmp/bashdays>, "BZh", 4096) = 3
close(25</tmp/bashdays>) = 0В выводе наблюдаем обращение к файлу
/tmp/bashdays, дополнительно видим что файл был прочитан. Также видим что была определена сигнатура файла BZh.Отлично! Мы на верном пути. Теперь закрываем файловый менеджер, тормозит ранее запущенный strace. И добавляем к файлу расширение txt.
mv /tmp/bashdays /tmp/bashdays.txt
Снова запускаем strace:
strace -o'|cat' -P /tmp/bashdays.txt -qqqyf nautilus /tmp 2> /dev/null
И видим другую картину:
statx("/tmp/bashdays.txt")Отсутствуют системные вызовы связанные с чтением файла. А файловый менеджер интерпретировал это как текстовый файл. Сменилась иконка.
Если сейчас кликнуть на этом файле 2 раза, то файл откроется в текстовом редакторе.
Если у файла есть расширение, то файловый менеджер полагается на него и не производит никаких действий с файлом.
А если расширение не указано, то происходит анализ содержимого. В моём случае файловый менеджер нашел сигнатуру bz2 и автоматически решил что это архив.
Чтобы определить тип файла, можешь воспользоваться командой:
file /tmp/bashdays.txt
Вот такая вот логика зашита в кишочках.
Хорошей тебе рабочей недели, изучай!
tags: #linux #debug
—
Please open Telegram to view this post
VIEW IN TELEGRAM
Лидером, конечно же остается Linux.
А сегодня на повестке дня, снова твой любимый strace и замечательная опция -T, которая позволяет находить ботлнэк (узкое место).
В посте будут встречаться лютые «франкенштейны», но ты сразу не уходи, я кратенько всё разжую и ты проникнешься. Бля буду!
Опция -T выводит разницу во времени между запуском и завершением системного вызова. Применяется для того, чтобы увидеть момент, когда конкретный вызов начал тормозить (встал раком) на фоне предыдущих.
Запускаем «франкенштейна»
strace -s0 -o'|nl >&2' -Tyqqqfe write dd if=/dev/random bs=4096 count=23 status=none | while read -rn1;do : ;done
s0 = размер буфера, строки не обрезаются
o/nl/&2 = вывод в стандартную ошибку на утилиту nl
nl = утилита нумерует строки
T = затраченное время на системный вызов
y = показывать симлинки для файловых дескрипторов
qqq = отключаем лешний шлак
f = трассируем дочерние процессы
e = трассировка только write
dd = читает из random блоками 4096 и пишем по 23 блока
дальше скармливаем это while
while = читает данные побайтно (-n1) без обработки символов конца строки (-r)
Вывод сокращаю, чтобы не так погано смотрелось:
01 write() = 4096 <0.004691>
02 write() = 4096 <0.000010>
03 write() = 4096 <0.000009>
04 write() = 4096 <0.000009>
05 write() = 4096 <0.000009>
06 write() = 4096 <0.000009>
07 write() = 4096 <0.000009>
08 write() = 4096 <0.000009>
09 write() = 4096 <0.000009>
10 write() = 4096 <0.000009>
11 write() = 4096 <0.000009>
12 write() = 4096 <0.000009>
13 write() = 4096 <0.000009>
14 write() = 4096 <0.000009>
15 write() = 4096 <0.000009>
16 write() = 4096 <0.000009>
17 write() = 4096 <0.014406>
18 write() = 4096 <0.023782>
19 write() = 4096 <0.023870>
20 write() = 4096 <0.023944>
21 write() = 4096 <0.023815>
22 write() = 4096 <0.024032>
23 write() = 4096 <0.024088>
Смотрим на последний столбик, видим аномалию после 16 строки, время выполнения существенно увеличилось. Поздравляю мы нашли bottleneck (узкое место).
Теперь давай разберемся с этим узким местом. Что произошло, почему все стало тормозить?
Умножаем блок 4096 на номер строки 16, получаем = 65536. Знакомая цифра? Знакомая!
65536 это ёмкость пайпа (канала), по достижению предела пишущий процесс заблокировался, пока не было прочитано и освобождено достаточно места.
Подробнее можешь почитать в мане:
man 7 pipe (раздел Pipe capacity).Бонусом команда, которая протестирует ёмкость пайпа:
sh -c '( dd if=/dev/zero obs=1 oflag=nonblock || pkill -P $$ -x "sleep" ) | sleep 300'
Если dd сообщает о недоступности стандартного вывода, значит тест удался. У меня получилось так:
dd: writing to 'standard output': Resource temporarily unavailable
129+0 records in
65536+0 records out
65536 bytes (66 kB, 64 KiB) copied, 0.0195754 s, 3.3 MB/s
Terminated
Вот так находясь на границе между кодом приложения и кодом ядра можно увидеть тонкие моменты. Изучай!
tags: #linux #debug
—
Please open Telegram to view this post
VIEW IN TELEGRAM
Привет. Я обычно предпочитаю строгие терминалы, которые — белым по черному. Но вчера у коллеги подсмотрел свистоперделку и тоже захотелось. Эх, вроде всегда топлю против новогодних ёлок, но тут не устоял и захуячил себе.
Обращаем внимание на задний фон в терминале, в нем проигрывается gif’ка.
А всё что выводится на экран это результат работы утилиты lolcat, которая делает праздник из любого тухлого выхлопа.
Как поставить такой видео фон? Для WSL это не проблема, добавляем строчки в json конфиг и всё из коробки поднимается:
Регулируем прозрачность и наслаждаемся.
А вот в нативном линуксе, придется изъебнуться. 99999% терминалов не поддерживает gif и mp4.
Некий персонаж смог такое реализовать через terminology. Но тут уже сам ковыряй. Единственное, что могу скинуть, это как случайным образом выставлять фон через сниппет:
Это пример для оболочки fish, но думаю и в Bash это сработает, только нужно будет изменить на
tags: #linux #рабочиебудни
—
🔔 @bashdays
Обращаем внимание на задний фон в терминале, в нем проигрывается gif’ка.
А всё что выводится на экран это результат работы утилиты lolcat, которая делает праздник из любого тухлого выхлопа.
Эту утилиту я привел для примера, так, поугарать, мож пранканешь кого-нибудь.
Как поставить такой видео фон? Для WSL это не проблема, добавляем строчки в json конфиг и всё из коробки поднимается:
"backgroundImage": "C:\\\\pixelart\\b1.gif",
"backgroundImageOpacity": 0.28,
Регулируем прозрачность и наслаждаемся.
Гифки в стиле пиксель арт я собрал и залил на яндекс-диск, забирай.
А вот в нативном линуксе, придется изъебнуться. 99999% терминалов не поддерживает gif и mp4.
Некий персонаж смог такое реализовать через terminology. Но тут уже сам ковыряй. Единственное, что могу скинуть, это как случайным образом выставлять фон через сниппет:
~/.config/fish/config.fish
if test -n "$TERMINOLOGY"
tybg (ls ~/.config/terminology/background/ | shuf -n 1 | xargs -I '{}' echo "~/.config/terminology/background/{}")
end
Это пример для оболочки fish, но думаю и в Bash это сработает, только нужно будет изменить на
tybg $(...). Такие дела!tags: #linux #рабочиебудни
—
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
Здрасти. Если открыть два терминала, в первом ввести команду ls -la, а во втором history, то во втором терминале, ты не увидишь в истории команду ls -la.
Хотя сервер один и тот же. И не увидишь ты эту команду в истории, пока не завершишь сессию в первом терминале, либо не сделаешь определенный финт ушами. Пиздец неудобно!
✔️ Финт ушами в первом терминале:
a = пишем текущую историю сессии в файл
с = очищаем текущую сессию
r = перезагружаем файл истории
Теперь если перезайти во второй терминал, то увидишь там команду ls -la, то есть история как бы синхронизировалась. Это хорошо, но недостаточно хорошо!
Как это можно автоматизировать?
Добавляем в .bashrc:
ignoredups:erasedups
1. Команды, вводимые несколько раз, не дублируются в истории.
2. Повторная команда заменяет все предыдущие в истории.
shopt -s histappend
Эта команда включает опцию histappend, которая добавляет новые команды в конец файла истории (~/.bash_history) при завершении сессии, вместо перезаписи файла. Это позволяет сохранить команды из разных сессий и объединить их в единую историю.
А кишка PROMPT_COMMAND = Назначает значение переменной PROMPT_COMMAND, которая используется в bash для выполнения команды перед отображением командной строки (приглашения).
Теперь твоя история команд будет автоматически синхронизирована с файлом истории. Это полезно, если ты работаешь с несколькими терминалами и хочешь иметь актуальную историю без хуйни.
А еще есть фича:
После выполнения любой команды, на экран будет выводиться «привет осёл». Эту команду можно заменить на любую другую, например триггерить bash скрипт, который будет отправлять введенные команды сразу тебе в телеграм. Ну или забить exit 1 по приколу.
Ёмко? Ёмко! Изучай!
tags: #linux #bash
—
🔔 @bashdays
Хотя сервер один и тот же. И не увидишь ты эту команду в истории, пока не завершишь сессию в первом терминале, либо не сделаешь определенный финт ушами. Пиздец неудобно!
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
—
Please open Telegram to view this post
VIEW IN TELEGRAM
Хелоу ворлд, вчера наш с вами товарищ 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.1gcc -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