Привет! При работе с длинными консольными командами, возникает некий дискомфорт. Буквально вчера пришлось запускать docker контейнер без всяких композов и прочих обвязок. Команда получилась НУ 3.14здец длинной и не читаемой.
Почесал я свою лысую кабину и решил поискать тулзу, чтобы избавиться от этого дискомфорта. Ну и нашел неплохой форматер.
Вставляешь в инпут свою монструозную команду и на выходе получаешь человеческое чтиво, разделенное символам переноса. Короче тулза ништяк все это форматирует и по итогу не надо самостоятельно бегать и тыкать 100500 раз кнопку Enter. Скопипастил себе в блокнотик и редактируешь в своё удовольствие.
Разработал и реализовал эту штуку, естественно ленивый девопс, у которого глаза выпали от консольных конструкций при работе с гугол облаком.
💩 Сервис в онлайне
🐱 Исходники на github
Можно на свой сервак поставить, если есть желание, там typescript. Но думаю тебе и онлайн сервиса за глаза хватит.
Вечером поговорим наверное про хердок «HEREDOC» или про что-то другое. Увидимся! Лови котиков🥺 👍 🏃♂️
Ну и всем лёгкой рабочей пятницы и хороших предстоящих выходных!
tags: #bash #services
—
💩 @bashdays
Почесал я свою лысую кабину и решил поискать тулзу, чтобы избавиться от этого дискомфорта. Ну и нашел неплохой форматер.
Вставляешь в инпут свою монструозную команду и на выходе получаешь человеческое чтиво, разделенное символам переноса. Короче тулза ништяк все это форматирует и по итогу не надо самостоятельно бегать и тыкать 100500 раз кнопку Enter. Скопипастил себе в блокнотик и редактируешь в своё удовольствие.
Разработал и реализовал эту штуку, естественно ленивый девопс, у которого глаза выпали от консольных конструкций при работе с гугол облаком.
Можно на свой сервак поставить, если есть желание, там typescript. Но думаю тебе и онлайн сервиса за глаза хватит.
Вечером поговорим наверное про хердок «HEREDOC» или про что-то другое. Увидимся! Лови котиков
Ну и всем лёгкой рабочей пятницы и хороших предстоящих выходных!
tags: #bash #services
—
Please open Telegram to view this post
VIEW IN TELEGRAM
Так, давай сегодня обмусолим «HEREDOC». На вписках башников его гордо величают «Хердок».
Что это такое? Ну смотри, допустим ты пишешь башник и оказываешься в ситуации, когда тебе нужно передать многострочный кусок текста, какой-нибудь команде типа cat, tee, ssh и т.п.
Вот с помощью «хердок» такое можно провернуть. Пока не очень понятно, давай разбираться на примерах.
По итогу выхлоп будет такого плана:
Теперь давай выполним такой код:
Короче на экран выведется такая шляпа:
Заебись Хорошо!
Теперь давай рассмотрим такую конструкцию:
Символ «-» приводит к игнорированию всех ведущих символов табуляции, что позволяет использовать отступы в синтаксисе «хердока». Пробелы не допускаются, только символ табуляции.
Перед «Привет» и «Пляж» я нажал TAB. Короче символ «-» позволяет делать отступы в коде с лидирующим Табом.
Не знаю, я этим минусом вообще не пользуюсь, мне хватает того, что есть в коробке.
Теперь запускаем такое:
Ну а если хочешь файл дополнить, то вместо «>» используй двойные символы «>>», но думаю ты это и так знаешь.
Передавать поток, можно не только в файл, но и в другие команды. Давай возьмем sed:
Ну и как обычно на закуску, практическое применение этого самого «хердока»:
Если продакшен перестал падать, значит его больше нет, значит по ночам тебя перестанут будить.
На этой ноте, собственно всё. Больше тут и рассказать нечего.
Я редко пользуюсь «хердоком», но часто встречаю его в чужих скриптах. Тут скорее важен момент понимания, что происходит, а не момент использования. Вот теперь ты знаешь и сможешь читать более вдумчиво чужой говнокод.
Давай! Еще раз хороших тебе выходных, увидимся!
tags: #bash #linux
—
💩 @bashdays
Что это такое? Ну смотри, допустим ты пишешь башник и оказываешься в ситуации, когда тебе нужно передать многострочный кусок текста, какой-нибудь команде типа cat, tee, ssh и т.п.
Вот с помощью «хердок» такое можно провернуть. Пока не очень понятно, давай разбираться на примерах.
cat << EOFВ этом примере я передаю команде cat две строки текста, в первой есть переменная среды PWD, во второй команда whoami.
SUKA BLYA CURRENT DIR: $PWD
YOU ARE LOGGED IN ASS: $(whoami)
EOF
По итогу выхлоп будет такого плана:
SUKA BLYA CURRENT DIR: /home/userКак видишь PWD и $(whoami) автоматически подставились. Ну и главная фича, что я не использовал для вывода команду echo. При другом раскладе код был бы таким:
YOU ARE LOGGED IN ASS: user
echo "SUKA BLYA CURRENT DIR:" $PWDСогласись, что с «хердоком» это выглядит более лаконичным. Не нужно писать 100500 echo. Хердокаешь и меньше говнокода становится.
echo "YOU ARE LOGGED IN ASS:" $(whoami)
Теперь давай выполним такой код:
cat << "EOF"Заключив EOF в кавычки, я запретил заменять переменные, команды и спецсимволы.
SUKA BLYA CURRENT DIR: $PWD
YOU ARE LOGGED IN ASS: $(whoami)
EOF
Короче на экран выведется такая шляпа:
SUKA BLYA CURRENT DIR: $PWDВидал да? PWD и $(whoami) не заменились, а остались в прежнем виде.
YOU ARE LOGGED IN ASS: $(whoami)
Теперь давай рассмотрим такую конструкцию:
cat <<- EOFВ первой строке я добавил символ «-».
Hello
Bitch
EOF
Символ «-» приводит к игнорированию всех ведущих символов табуляции, что позволяет использовать отступы в синтаксисе «хердока». Пробелы не допускаются, только символ табуляции.
Перед «Привет» и «Пляж» я нажал TAB. Короче символ «-» позволяет делать отступы в коде с лидирующим Табом.
Не знаю, я этим минусом вообще не пользуюсь, мне хватает того, что есть в коробке.
Теперь запускаем такое:
cat << EOF > output.txtА чо произошло? Хе… а весь выхлоп, который должен был вывестись на экран — сохранился в файл output.txt. Вот такая магия! Если файл не существует, то создастся новый.
SLUNI DO POLU $PWD
HERANUKA PO ROYALU $(whoami)
EOF
Ну а если хочешь файл дополнить, то вместо «>» используй двойные символы «>>», но думаю ты это и так знаешь.
Передавать поток, можно не только в файл, но и в другие команды. Давай возьмем sed:
cat <<'EOF' | sed 's/i/ee/g'По итогу получим, что все символы «i» заменятся на «ee». На экран выведется:
Rich
Bitch
EOF
ReechКонструкция напоминает франкенштейна, но если базу понимать, то все легко и просто. Но я думаю, что хорошо объясняю и тебе всё понятно. Если чо, спрашивай в комментах, раскидаем.
Beetch
Ну и как обычно на закуску, практическое применение этого самого «хердока»:
ssh -T user@bashdayz.ru << EOFКонектимся по ssh на сервер и выполняем пачкой задачи. Получается засылаем подготовленный пакет с командами и что-то делаем. Можно сделать скрипт базовой настройки сервера, чтобы ansible к примеру не городить. А можно циклом пройтись по списку серверов и избавиться от продакшена.
ls -la
date
apt update
uptime
cat /etc/issue
EOF
Если продакшен перестал падать, значит его больше нет, значит по ночам тебя перестанут будить.
На этой ноте, собственно всё. Больше тут и рассказать нечего.
Я редко пользуюсь «хердоком», но часто встречаю его в чужих скриптах. Тут скорее важен момент понимания, что происходит, а не момент использования. Вот теперь ты знаешь и сможешь читать более вдумчиво чужой говнокод.
Давай! Еще раз хороших тебе выходных, увидимся!
tags: #bash #linux
—
Please open Telegram to view this post
VIEW IN TELEGRAM
Купил сегодня вентилятор для малины (raspberry pi) на 12v и только потом понял, что на борту платы есть лишь 3v и 5v. Короче собрал из старого и нового один рабочий, взлетело, хорошо быть инженером.
Ладно, давай про strace. Сегодня научимся смотреть что запускает программа и с какими параметрами она это запускает.
Возьмем для испытаний программу man и распотрошим её.
Команда man позволяет получить доступ к общей базе справки по команде, функции или программе. Обычно для просмотра справки программе надо передать название команды или другого объекта в системе.
Екзекутим такую штуку:
Давай теперь по ключам, а потом уже разберемся что произошло.
s = длина выводимой строки
f = отслеживаем дочерние процессы
e = какой системный вызов отслеживаем
o = куда сохраним результаты трассировки
Если не указывать ключ «o», то результаты запишутся в стандартный поток STDERR.
И чо? А ничо, давай смотреть результаты, которые записались в файл с именем logs.
Вот таким образом мы узнали какие утилиты и с какими аргументами запускается программа man для распаковки и форматирования man страниц.
То есть ты можешь отдебажить свою собственную программу, которая запускает какие-то внешние утилиты и т.п. И посмотреть что конкретно она запускает и с какими параметрами. Я так недавно php дебажил, который запускал ffmpeg из скрипта.
Ладно, пойду дальше пиво пить. Не отвлекаю, увидимся!
UPD: Кстати чтобы сделать cat красивым, как на картинке, читай это.
tags: #bash #linux #debug
—
💩 @bashdays
Ладно, давай про strace. Сегодня научимся смотреть что запускает программа и с какими параметрами она это запускает.
Возьмем для испытаний программу man и распотрошим её.
Команда man позволяет получить доступ к общей базе справки по команде, функции или программе. Обычно для просмотра справки программе надо передать название команды или другого объекта в системе.
Екзекутим такую штуку:
strace -o logs -s1024 -fe execve man bashАга, запустилось. Перед тобой открылась страница помощи bash. Что дальше. Дальше нажимаешь клавишу «q», все это дело закрывается.
Давай теперь по ключам, а потом уже разберемся что произошло.
s = длина выводимой строки
f = отслеживаем дочерние процессы
e = какой системный вызов отслеживаем
o = куда сохраним результаты трассировки
Если не указывать ключ «o», то результаты запишутся в стандартный поток STDERR.
И чо? А ничо, давай смотреть результаты, которые записались в файл с именем logs.
cat logsНа экран вывелись результаты трассировки команды man. На картинке к этому посту, можешь посмотреть результат.
Вот таким образом мы узнали какие утилиты и с какими аргументами запускается программа man для распаковки и форматирования man страниц.
То есть ты можешь отдебажить свою собственную программу, которая запускает какие-то внешние утилиты и т.п. И посмотреть что конкретно она запускает и с какими параметрами. Я так недавно php дебажил, который запускал ffmpeg из скрипта.
Ладно, пойду дальше пиво пить. Не отвлекаю, увидимся!
UPD: Кстати чтобы сделать cat красивым, как на картинке, читай это.
tags: #bash #linux #debug
—
Please open Telegram to view this post
VIEW IN TELEGRAM
Привет, всем, ага. С утра разминочка, а ближе к обеду про более серьезные вещи поговорим.
Наверняка ты знаешь, что при нажатии сочетания клавиш CTRL+D завершится текущая интерактивная оболочка. То есть если ты сидишь на сервере по ssh и нажал CTRL+D, сессия прервется. ОК.
При нажатии такого сочетания, оболочка при чтении устройства терминала получит признак конца файла и завершится если строка пуста. Нюанс, если в командной строке набрать какие-то символы и нажать CTRL+D, то ничего не произойдет.
Как еще можно завершить сессию с командной оболочкой? Ну например установить значение переменной TMOUT больше нуля. Цифра будет означать секунды.
Следующий вариант это активировать параметр оболочки «t» с помощью команды set.
Так. Еще есть вариант с параметром «e». Указав его оболочка завершает работу после возникновения ошибки. Например:
Более человеческий пример:
Что еще упустили… Упустили команду exec. Подвешиваем на стандартный ввод устройство /dev/null.
Ааа, еще же exit есть. Не буду его обижать, пусть тоже в этом посте присутствует.
Ну и как обычно, на закуску.
stty (Set Teletype) - Эта команда управляет настройками терминала и позволяет пользователю вносить изменения в терминал и отображать его характеристики.
Всё, стоп! После обеда покажу, как с помощью strace можно инжектить в системные вызовы процессов для отладки некоторых ёбнутых случаев. Увидимся!
tags: #bash #linux
—
💩 @bashdays
Наверняка ты знаешь, что при нажатии сочетания клавиш CTRL+D завершится текущая интерактивная оболочка. То есть если ты сидишь на сервере по ssh и нажал CTRL+D, сессия прервется. ОК.
При нажатии такого сочетания, оболочка при чтении устройства терминала получит признак конца файла и завершится если строка пуста. Нюанс, если в командной строке набрать какие-то символы и нажать CTRL+D, то ничего не произойдет.
Как еще можно завершить сессию с командной оболочкой? Ну например установить значение переменной TMOUT больше нуля. Цифра будет означать секунды.
# TMOUT=5Текущая сессия закроется через 5 секунд.
Следующий вариант это активировать параметр оболочки «t» с помощью команды set.
set -tВыбросило! НО! Оболочка прекратит свою работу, только после того, как завершится работа запущенных команд в текущий строке. Например:
set -t ; readВыход произойдет, только после нажатия клавиши Enter. А в примере ниже:
set -t ; read -t3Выход будет произведен после нажатия Enter ИЛИ по прошествию 3х секунд.
Так. Еще есть вариант с параметром «e». Указав его оболочка завершает работу после возникновения ошибки. Например:
set -e ; falseКоманда false ничего не делает, но завершается всегда с ошибкой. Как правило, используется при написании bash скриптов.
Более человеческий пример:
set -e ; ПаравозблятьИ снова выкинуло. Потому что вернулась ошибка - Паравозблять: command not found.
Что еще упустили… Упустили команду exec. Подвешиваем на стандартный ввод устройство /dev/null.
exec </dev/nullПри чтении этого устройства оболочка получит признак конца файла и успешно завершится.
Ааа, еще же exit есть. Не буду его обижать, пусть тоже в этом посте присутствует.
Ну и как обычно, на закуску.
stty eof $'\t'Ёпта, что это? Это хак. После выполнения этой команды у тебя появится возможность закрыть текущую оболочку по нажатию на клавишу TAB. Ввод символа табуляции, посылает сигнал конца файла и оболочка прекращает свою работу.
stty (Set Teletype) - Эта команда управляет настройками терминала и позволяет пользователю вносить изменения в терминал и отображать его характеристики.
Всё, стоп! После обеда покажу, как с помощью strace можно инжектить в системные вызовы процессов для отладки некоторых ёбнутых случаев. Увидимся!
tags: #bash #linux
—
Please open Telegram to view this post
VIEW IN TELEGRAM
Большинство утилит/программ/скриптов и т.п. работают с временными файлами. Сначала они создают этот временный файл, пишут в него какие-то данные, а на выходе отдают готовый результат, будь то файл с выгрузкой либо что-то другое. А временный файл с которым производилась работа, естественно зачищается.
Наша задача на сегодня, перехватить этот временный файл, до того как он удалится. А для чего? Ситуации разные бывают.
Недавно я дебажил проблему с выгрузкой, которая годами работала, а потом сломалась, на выходе я получал пустой файл. Эту выгрузку делал как раз бинарник неизвестного происхождения. Отследить логику работы само собой не представлялось возможным.
Этот случай я успешно отдебажил. Временный файл удалялся ДО того как стать файлом выгрузки. Почему? Потому что процесс удаления временного файла работал в отдельном потоке (thread) и удалял временный файл спустя 30 секунд.
А так как выгрузка с каждым годом становилась все больше, 30ти секунд стало мало. По итогу временный файл удалялся, а на выходе создавался пустой файл без каких либо данных. Естественно никакой обработки эксепшенов в бинарнике не было, вечный статус - завершено успешно! Файл же есть на выходе, значит успешно. Не поспоришь.
На такие ёбнутые случаи и нужен strace, чтобы хоть немного понять, что происходит.
Короче расчехляем нашу лабораторию и создаем скрипт. Бинарники мучить не будем, bash скрипта будет достаточно для понимания.
1. Записываем во временный файл /tmp/test.txt этот самый UID.
2. Удаляем временный файл.
Почему не rm а unlink? Потому что в моём случае это был именно unlink, который я нашел просматривая лог strace. Чем отличается unlink от rm, расскажу в следующих постах.
Так, подопытный скрипт есть. Запускаем так:
В тот момент когда скрипт попытается удалить временный файл, наша инъекция не даст ему это сделать и завершит скрипт с ошибкой:
По умолчанию инъекция будет сделана всем системным вызовам unlink, но есть возможность указать диапазон или конкретный индекс срабатывания. В этом посте можешь глянуть как узнать конкретный индекс (смотри строчку с when=4+).
В моем случае я увидел кусок своей выгрузки, которая резко прерывалась. Ну а дальше всё стало очевидным, что-то где-то не успевает. Включил таймер и нашел закономерность в 30 секунд, посмотрел дочерние процессы которые плодились и обнаружил активность этой зачищалки.
Отдал результаты дебага разработчикам, фиксить это конечно никто не стал, такой гемор никому не нужен. По итогу ребята с нуля переписали на golang и сразу чудным образом нашлась документация. Жиза.
Вот такие приключения порой случаются. Изучай. Хорошего дня!
tags: #linux #debug #bash
—
💩 @bashdays
Наша задача на сегодня, перехватить этот временный файл, до того как он удалится. А для чего? Ситуации разные бывают.
Недавно я дебажил проблему с выгрузкой, которая годами работала, а потом сломалась, на выходе я получал пустой файл. Эту выгрузку делал как раз бинарник неизвестного происхождения. Отследить логику работы само собой не представлялось возможным.
Этот случай я успешно отдебажил. Временный файл удалялся ДО того как стать файлом выгрузки. Почему? Потому что процесс удаления временного файла работал в отдельном потоке (thread) и удалял временный файл спустя 30 секунд.
А так как выгрузка с каждым годом становилась все больше, 30ти секунд стало мало. По итогу временный файл удалялся, а на выходе создавался пустой файл без каких либо данных. Естественно никакой обработки эксепшенов в бинарнике не было, вечный статус - завершено успешно! Файл же есть на выходе, значит успешно. Не поспоришь.
На такие ёбнутые случаи и нужен strace, чтобы хоть немного понять, что происходит.
Короче расчехляем нашу лабораторию и создаем скрипт. Бинарники мучить не будем, bash скрипта будет достаточно для понимания.
#!/bin/bashUID обозначает идентификатор пользователя, то есть номер, назначенный каждому пользователю Linux.
echo $UID > /tmp/test.txt
unlink /tmp/test.txt
1. Записываем во временный файл /tmp/test.txt этот самый UID.
2. Удаляем временный файл.
Почему не rm а unlink? Потому что в моём случае это был именно unlink, который я нашел просматривая лог strace. Чем отличается unlink от rm, расскажу в следующих постах.
Так, подопытный скрипт есть. Запускаем так:
strace -yfe inject=unlink:error=EACCES ./script.shВ этой конструкции мы говорим strace, чтобы проинжектил наш системный вызов unlink и передал ему насильно ошибку EACCES (Permission denied).
В тот момент когда скрипт попытается удалить временный файл, наша инъекция не даст ему это сделать и завершит скрипт с ошибкой:
[pid 677954] unlink("/tmp/test.txt") = -1 EACCES (Permission denied) (INJECTED)А сам временный файл останется на диске. Открываем его и смотрим, что же там внутри происходит.
По умолчанию инъекция будет сделана всем системным вызовам unlink, но есть возможность указать диапазон или конкретный индекс срабатывания. В этом посте можешь глянуть как узнать конкретный индекс (смотри строчку с when=4+).
В моем случае я увидел кусок своей выгрузки, которая резко прерывалась. Ну а дальше всё стало очевидным, что-то где-то не успевает. Включил таймер и нашел закономерность в 30 секунд, посмотрел дочерние процессы которые плодились и обнаружил активность этой зачищалки.
Отдал результаты дебага разработчикам, фиксить это конечно никто не стал, такой гемор никому не нужен. По итогу ребята с нуля переписали на golang и сразу чудным образом нашлась документация. Жиза.
Вот такие приключения порой случаются. Изучай. Хорошего дня!
tags: #linux #debug #bash
—
Please open Telegram to view this post
VIEW IN TELEGRAM
Привет. Чем отличается команда rm от unlink? Давай смотреть. Обе эти команды умеют удалять, но в 99% ты используешь именно rm, потому что про unlink ты либо не слышал, либо тебе rm с головой хватает.
Есть ошибочное мнение, что unlink предназначен для удаления лишь ссылок, нифига, оно вполне может удалять обычные файлы. А если углубиться, то весь процесс удаления в Linux, это удаление ссылок.
Как устроен процесс удаления файлов в linux, расскажу в следующих постах, сегодня у нас битва rm vs unlink.
У unlink есть всего лишь два ключа запуска help и version. Очень ограниченный инструмент, но чем инструмент проще, тем проще его синтаксис.
Команда unlink использует системную команду unlink, в то время как команда rm использует системный вызов unlinkat. Оба системных вызова практически одинаковы.
Unlink не умеет работать с wildcard и globbing шаблонами. Так же ты не сможешь с помощью нее удалить каталог.
Короче одни минусы. А нахрена тогда она нужна? Ооо брат, сейчас расскажу. Запускаем команду и пытаемся насильно удалить файл которого нет в каталоге:
Короче с unlink можно гибче обрабатывать эксепшены в скриптах. А еще при использовании команды unlink отсутствует проверка безопасности. Она удалит файл, защищенный от записи. Хотя современная версия rm теперь тоже так умеет.
Оффтоп. Ну а если хочешь, чтобы твой файл никто не смог удалить, включая root, делай так:
Ключ i - сделает файл неизменяемым. Чтобы снять с файла этот аттрибут, в команде которая выше, замени знак «+» на «-».
Подытожим. Для большинства повседневных задач конечно rm мастхев, но если ты пишешь софт для каких-то критичных систем, стоит не упускать из виду unlink.
Увидимся вечером.
tags: #linux #bash
—
💩 @bashdays
Есть ошибочное мнение, что unlink предназначен для удаления лишь ссылок, нифига, оно вполне может удалять обычные файлы. А если углубиться, то весь процесс удаления в Linux, это удаление ссылок.
Как устроен процесс удаления файлов в linux, расскажу в следующих постах, сегодня у нас битва rm vs unlink.
У unlink есть всего лишь два ключа запуска help и version. Очень ограниченный инструмент, но чем инструмент проще, тем проще его синтаксис.
# unlink /tmp/hardlinkСофтина очень молчаливая — как мужик. После удаления, она промолчит и ничего не выведет на экран.
# unlink /tmp/file
Команда unlink использует системную команду unlink, в то время как команда rm использует системный вызов unlinkat. Оба системных вызова практически одинаковы.
Unlink не умеет работать с wildcard и globbing шаблонами. Так же ты не сможешь с помощью нее удалить каталог.
Короче одни минусы. А нахрена тогда она нужна? Ооо брат, сейчас расскажу. Запускаем команду и пытаемся насильно удалить файл которого нет в каталоге:
rm -f test.txtИ получаем - НИЧЕГО. То есть rm -f не вернуло ошибку, что файл отсутствует. А если сделать так:
unlink test.txtполучаем ошибку:
unlink: cannot unlink 'test.txt': No such file or directoryТо есть если мне нужно будет обработать результат выполнения команды rm -f, то я не буду достоверно знать, а существовал ли вообще файл. Ведь rm -f мне ничего не вернуло.
Короче с unlink можно гибче обрабатывать эксепшены в скриптах. А еще при использовании команды unlink отсутствует проверка безопасности. Она удалит файл, защищенный от записи. Хотя современная версия rm теперь тоже так умеет.
Оффтоп. Ну а если хочешь, чтобы твой файл никто не смог удалить, включая root, делай так:
chattr +i test.txtchattr позволяет устанавливать и отключать атрибуты файлов, на уровне файловой системы не зависимо от стандартных (чтение, запись, выполнение).
Ключ i - сделает файл неизменяемым. Чтобы снять с файла этот аттрибут, в команде которая выше, замени знак «+» на «-».
Подытожим. Для большинства повседневных задач конечно rm мастхев, но если ты пишешь софт для каких-то критичных систем, стоит не упускать из виду unlink.
Увидимся вечером.
tags: #linux #bash
—
Please open Telegram to view this post
VIEW IN TELEGRAM
Писал писал я вам интересный пост на вечер, про очередные офигительные циркули gpt+terminal+bash, а потом понял, что эта сука денег через какое-то время хочет. Собственно, как и любая AI херовина, наивный. Короче заскамили мамонта. Форс мажор. Ну бывает… Раз не сложилось, давай так:
Далее делаем:
Призываем древнейшее зло:
2. Переход в хоумдир рута
3. Переход в папку на уровень выше
4. Переход в предыдущую директорию
Заметь что я не писал команду cd! Оно само…
Хз на сколько это вообще практично, но как видишь такое возможно. Изучай, может станешь фанатом этой фичи )
tags: #linux #bash
—
💩 @bashdays
shopt -s cdspellshopt — встроенная команда оболочки, управляет опциями. Изменяет значение внутренних конфигурационных параметров оболочки.
Далее делаем:
cd /vaХа! Мы попадаем в каталог var/opt/home. Понял/а? Эта надстройка в терминале исправляет ошибки. Из коробки. Клёва!
cd /otp
cd /Home
Призываем древнейшее зло:
shopt -s autocdТеперь вводим:
/etc/cron.d1. Переход в директорию /etc/cron.d
~root
..
~-
2. Переход в хоумдир рута
3. Переход в папку на уровень выше
4. Переход в предыдущую директорию
Заметь что я не писал команду cd! Оно само…
Хз на сколько это вообще практично, но как видишь такое возможно. Изучай, может станешь фанатом этой фичи )
tags: #linux #bash
—
Please open Telegram to view this post
VIEW IN TELEGRAM
Привет, о че нашел: пасхалка в текстовом редакторе nano.
1. Запусти редактор nano
2. Перейди на новую строку
3. Нажми CTRL+X, а затем Y
4. Назови файл: zzy и нажми Enter
Сочетание ^X + Y + zzy, вероятно, является ссылкой на xyzzy, чит-код, первоначально использовавшийся в Colossal Cave Adventure.
Получается из nano нельзя будет сохранить файл с названием zzy.
Там телега скоро запилит нормальное форматирование кода (в бете 4.10.4 уже работает). Наконец-то дождались, так что скоро все будет по красоте и без костылей. Я себе воткнул, уматно вообще!
tags: #linux #трудовыебудни
—
💩 @bashdays
1. Запусти редактор nano
2. Перейди на новую строку
3. Нажми CTRL+X, а затем Y
4. Назови файл: zzy и нажми Enter
Сочетание ^X + Y + zzy, вероятно, является ссылкой на xyzzy, чит-код, первоначально использовавшийся в Colossal Cave Adventure.
Получается из nano нельзя будет сохранить файл с названием zzy.
Там телега скоро запилит нормальное форматирование кода (в бете 4.10.4 уже работает). Наконец-то дождались, так что скоро все будет по красоте и без костылей. Я себе воткнул, уматно вообще!
tags: #linux #трудовыебудни
—
Please open Telegram to view this post
VIEW IN TELEGRAM
Доброе утро господа и дамы… на картинки пока НЕ смотрим, все станет прозрачным чуть позже.
Создаем подопытный файл под рутом:
Так, открыли. Смотри первую картинку к этому посту. Видишь root/root? Это имя владельца и имя группы файла. Так вот, при создании архива эти поля можно изменять.
Давай изменим:
А теперь создадим с user/user (этот пользователь и группа есть в системе).
Из документации по тару по смещениям 108 и 116 находятся uid и gid.
Короче как всегда везде есть свои нюансы и приколы, возможно обоснованные. Глубже копать не стал. Давай, увидимся вечерком!
tags: #linux #debug
—
💩 @bashdays
Создаем подопытный файл под рутом:
echo 'some text' > test.txtЗатариваем его:
tar -cf test.tar test.txtТеперь открываем в hexdump:
hexdump -C test.tarhexdump — инструмент который используется разработчиками и отладчиками приложений. Он может преобразовывать файлы и данные в приятный и читаемый формат.
Так, открыли. Смотри первую картинку к этому посту. Видишь root/root? Это имя владельца и имя группы файла. Так вот, при создании архива эти поля можно изменять.
Давай изменим:
tar --owner='bash' --group='days' -cf test.tar test.txtОкей. Снова открываем в hexdump:
hexdump -C test.tarСмотрим вторую картинку. На ней видим интересную ситуацию, пользователь изменился на bash, а группа на days. НО в системе у нас нет такого пользователя и группы. Хотя ожидаемый результат должен быть — user/group not found или что-то подобное.
-rw-r--r-- bash/days 10 2023-10-23 05:09 test.txtБаг или фича? Причем если растарить такой файл (с ключом -p или без него), bash/days вернутся к root/root.
А теперь создадим с user/user (этот пользователь и группа есть в системе).
tar --owner='user' --group='user' -cf test.tar test.txtРаспаковываем:
tar -xf test.tarИ видим ситуацию, что у файла test.txt пользователь и группа user/user. Великолепно! Вот такое интересное поведение.
Из документации по тару по смещениям 108 и 116 находятся uid и gid.
char uid[8]; /* 108 */Давай посмотрим смещение 108:
char gid[8]; /* 116 */
hexdump -Cs108 -n8 test.tarполучаем:
0000006c 30 30 30 31 37 35 30 00 |0001750.|00000074Конвертим 0001750 в uid:
echo $(( 8#1750 ))Опа, получили 1000, что соответствует пользователю user. А если этот трюк провернуть с bash/days то получим uid того пользователя, под которым тарили файл.
Короче как всегда везде есть свои нюансы и приколы, возможно обоснованные. Глубже копать не стал. Давай, увидимся вечерком!
tags: #linux #debug
—
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
Часто люди бездумно засовывают в крон запуск долгоиграющих скриптов и потом ловят кучу багов.
К примеру некий скрипт запускается в кроне каждый час. В какой-то момент, время выполнения скрипта начинает составлять 70 и более минут. Соответственно следующий джоб через 60 минут запустит еще одну копию этого скрипта. И понеслась 3.14зда по кочкам.
Я ловил у ребят подобные перлы, когда сервер просто раком встает, а в фоне крутятся 100500 процессов, которые насилуют mysql как портовую шлюху, вдоль и поперек.
На такие случаи необходимо проверять запущен ли скрипт в данный момент. И если запущен, то при повторном запуске - ничего не делать.
Как такое реализовать? В бест-практиках это реализуется через lock файлы. Для удобства работы с lock файлами, в linux есть коробочный вариант утилиты, которая называется flock.
flock — утилита, которая позволяет использовать лок-файл для предотвращения запуска копии процесса (вашего скрипта, крона или чего-то еще). Например, используя cron нужно быть уверенным, что предыдущий запуск вашего скрипта уже завершен.
Пишем обработчик:
Как только скрипт завершит работу, ты сможешь запустить его повторно.
Сначала создается lock файл если его нет, а далее начинается магия с дескрипторами и логикой.
Вместо sleep можно вставить запуск функции типа main() где и будет основная логика скрипта. Либо вообще через source (или точку) заинклудить свой скрипт. То есть можно сделать универсальную штуку, чтобы в каждый скрипт не пихать flock.
Делаешь один обработчик и передаешь ему параметром путь до скрипта + путь до lock файла. А обработчик через source подгружает уже полезную нагрузку.
Моё решение возможно не самое изящное, но рабочее. Изучай. Слышал что такое можно провернуть каким-то образом через сокеты, но особо не вникал. Если в комментах поделишься, будет очень полезно. Спасибо!
tags: #linux #bash #utils
—
💩 @bashdays
К примеру некий скрипт запускается в кроне каждый час. В какой-то момент, время выполнения скрипта начинает составлять 70 и более минут. Соответственно следующий джоб через 60 минут запустит еще одну копию этого скрипта. И понеслась 3.14зда по кочкам.
Я ловил у ребят подобные перлы, когда сервер просто раком встает, а в фоне крутятся 100500 процессов, которые насилуют mysql как портовую шлюху, вдоль и поперек.
На такие случаи необходимо проверять запущен ли скрипт в данный момент. И если запущен, то при повторном запуске - ничего не делать.
Как такое реализовать? В бест-практиках это реализуется через lock файлы. Для удобства работы с lock файлами, в linux есть коробочный вариант утилиты, которая называется flock.
flock — утилита, которая позволяет использовать лок-файл для предотвращения запуска копии процесса (вашего скрипта, крона или чего-то еще). Например, используя cron нужно быть уверенным, что предыдущий запуск вашего скрипта уже завершен.
Пишем обработчик:
#!/bin/bashЗапускаем скрипт. Ничего полезного он не сделает, просто будет висеть 100 секунд. После того как ты запустил этот скрипт, в соседнем терминале попробуй запустить его же параллельно. В ответ ты получишь ожидаемое - Nice try.
lock="/tmp/bashdays.lock"
[[ -f "${lock}" ]] || touch "${lock}"
(
flock -n -o -x ${fd_lock} || { echo 'Nice try' >&2; exit 0; }
sleep 100
) {fd_lock}<"${lock}"
Как только скрипт завершит работу, ты сможешь запустить его повторно.
Сначала создается lock файл если его нет, а далее начинается магия с дескрипторами и логикой.
Вместо sleep можно вставить запуск функции типа main() где и будет основная логика скрипта. Либо вообще через source (или точку) заинклудить свой скрипт. То есть можно сделать универсальную штуку, чтобы в каждый скрипт не пихать flock.
Делаешь один обработчик и передаешь ему параметром путь до скрипта + путь до lock файла. А обработчик через source подгружает уже полезную нагрузку.
Моё решение возможно не самое изящное, но рабочее. Изучай. Слышал что такое можно провернуть каким-то образом через сокеты, но особо не вникал. Если в комментах поделишься, будет очень полезно. Спасибо!
tags: #linux #bash #utils
—
Please open Telegram to view this post
VIEW IN TELEGRAM
А у нас тут снежок выпал, хоть что-то новенькое. А то эти приготовления к чертовой пятнице (которая будет идти до конца года) совсем уже вымотали. Привет.
Набрел вчера на консольную игрулю, называется Rick & Morty BASH Quest.
Она как бы не совсем консольная, работает в браузере, но аутентичность сохранена.
Разработал эту пепяку преподаватель с дикого запада, чтобы потихоньку прививать своим безголовым студентам навыки работы в консоли.
Сюжет прост - Саммер и Рик пропали! Нужно решить головоломки и найти их. Путешествуй по порталам, ищи подсказки, раскручивай истину.
Короче очередная залипалка для любителей подобных вещей. Да и визуально выглядит не как гавно, хоть под капотом и используется JQuery Terminal Library.
Управление простое:
ls - осмотреться на местности
cd - перемещение через порталы
cat - читать подсказки
pwd - если потерялся
man man - справка
🌐 Поиграть можешь тут
tags: #linux #games
—
💩 @bashdays
Набрел вчера на консольную игрулю, называется Rick & Morty BASH Quest.
Она как бы не совсем консольная, работает в браузере, но аутентичность сохранена.
Разработал эту пепяку преподаватель с дикого запада, чтобы потихоньку прививать своим безголовым студентам навыки работы в консоли.
Сюжет прост - Саммер и Рик пропали! Нужно решить головоломки и найти их. Путешествуй по порталам, ищи подсказки, раскручивай истину.
Короче очередная залипалка для любителей подобных вещей. Да и визуально выглядит не как гавно, хоть под капотом и используется JQuery Terminal Library.
Управление простое:
ls - осмотреться на местности
cd - перемещение через порталы
cat - читать подсказки
pwd - если потерялся
man man - справка
tags: #linux #games
—
Please open Telegram to view this post
VIEW IN TELEGRAM
Какой самый лучший способ на bash прочитать переменные из файла? Велосипедов я много повидал, но мастхев это конечно же закинуть все переменные в json файлик и без лишнего геморроя его использовать.
Создаем файл vars.json, закидываем в него переменные/константы или чо там у тебя в конфигах обычно содержится:
Ключик -r означает, что выведется сырой текст (без кавычек и прочей нечисти). Попробуй убрать его и увидишь, что появятся кавычки, которые нам не нужны.
jq - это мощный инструмент, позволяющий читать, фильтровать и писать JSON в bash.
jq вообще очень крутая тулза, но увы в коробке ее нет, придется ставить через менеджер пакетов. Но это мелочи.
Есть и другие способы работать с конфигами в bash, но как я выше сказал, json наше всё и мастхев. Изучай.
tags: #linux #bash
—
💩 @bashdays
Создаем файл vars.json, закидываем в него переменные/константы или чо там у тебя в конфигах обычно содержится:
{А в главном скрипте, который все это будет читать делаем так:
"login" : "user",
"password" : "12345678"
}
#!/bin/bashТут это - говорим в config как называется файл с переменными, а далее с помощью офигительной утилиты jq парсим конфиг без кучи говнокода и слёз.
config="vars.json"
login=$(jq -r '.login' < $config)
passwd=$(jq -r '.password' < $config)
echo $login
echo $passwd
Ключик -r означает, что выведется сырой текст (без кавычек и прочей нечисти). Попробуй убрать его и увидишь, что появятся кавычки, которые нам не нужны.
jq - это мощный инструмент, позволяющий читать, фильтровать и писать JSON в bash.
jq вообще очень крутая тулза, но увы в коробке ее нет, придется ставить через менеджер пакетов. Но это мелочи.
Есть и другие способы работать с конфигами в bash, но как я выше сказал, json наше всё и мастхев. Изучай.
tags: #linux #bash
—
Please open Telegram to view this post
VIEW IN TELEGRAM
Ух ты сколько нас тут много стало. Привет, кого не видел. Давай поговорим про утилиту JC. Про нее почти никто не знает, значит самое время познакомиться.
JC это JSON конвертер на основе встроенных парсеров.
Если коротко, то с помощью jc можно конвертировать выхлоп различных утилит в json формат, а потом уже по-человечески извлекать данные.
Например, я хочу получить json от выхлопа iptables. Запускаю:
Выдирать данные само собой будет удобно через jq, вкидываем его в пайп, пишем какой ключ нужен и получаем желаемое.
JC так же можно использовать как модуль в python, так что, тут не только у башников праздник.
🐱 Страница проекта на github
🟢 Установка:
tags: #linux #bash #utilites
—
💩 @bashdays
JC это JSON конвертер на основе встроенных парсеров.
Если коротко, то с помощью jc можно конвертировать выхлоп различных утилит в json формат, а потом уже по-человечески извлекать данные.
Например, я хочу получить json от выхлопа iptables. Запускаю:
iptables -L | jc --iptablesИ по итогу получаю годноту:
[{"chain":"INPUT","rules":[]},{"chain":"FORWARD","rules":[{"target":"DOCKER-USER","prot":"all","opt":null,"source":"anywhere","destination":"anywhere"},{"target":"DOCKER","prot":"all","opt":null,"source":"anywhere","destination":"anywhere"}..Ну красота же. JC ограничена парсерами, но из коробки там прям на богатом все (около 50ти). Crontab, csv, ls, fstab, date, ping и т.п. Выбираешь парсер под нужную тебе задачу и получаешь готовый к работе массив данных.
Выдирать данные само собой будет удобно через jq, вкидываем его в пайп, пишем какой ключ нужен и получаем желаемое.
JC так же можно использовать как модуль в python, так что, тут не только у башников праздник.
apt/yum install jc
Лично я jc никогда не применял, но порой встречал в скриптах. Изучай, когда-нибудь обязательно пригодится.tags: #linux #bash #utilites
—
Please open Telegram to view this post
VIEW IN TELEGRAM
Спокойно! Завтра устроим выходной по постам, на сегодня это последнее чтиво, обещаю. Внезапная интеграция вылезла, нужно перекрывать. Давай на сон грядущий поговорим про интерпретатор.
Все что работает на базе ядра linux, создание процесса происходит в два этапа. Процесс клонируется с помощью системных вызовов fork и clone. А копия процесса замещается кодом из указанного файла (exec). Детали пока опущу, речь про другое.
Ты всяко знаешь, что скрипт должен начинаться с символов #!. Эта штуковина называется SheBang.
Если дословно: SheBang = Она взрывает. Bang Bang, Feuer Frei! Как у Rammstein песенка, сразу фильм XXX на ум приходит. С лысым ЧСВ мужиком, а не про выгоревших чуваков позади дивана с одной миниатюрной мадмуазелью с дрочильного сайта.
В общем после #! нужно указать путь до интерпретатора, обычно мы с вами фигачим /bin/bash или питончик какой нибудь.
Данная конструкция будет использована системными вызовами семейства exec для запуска нужного интерпретатора, который в свою очередь исполнит картину маслом и запустит скрипт.
Если из командной строки запустить скрипт и системный вызов execve возвратит ошибку ENOEXEC
Процесс оболочки bash будет сам пытаться выполнить скрипт.
EXECVE() = выполняет программу, заданную параметром filename. Программа должна быть или двоичным исполняемым файлом, или скриптом, начинающимся со строки вида #!.
ENOEXEC = исполняемый файл в неизвестном формате, для другой архитектуры, или же встречены какие-то ошибки, препятствующие его выполнению.
В большинстве случаев ENOEXEC возвращается если первая строка не начинается с #! либо первая строка начинается с #! и в строке больше нет символов кроме пробелов и табуляций.
Так вот, это запустится:
Если интересно поподробнее про это почитать, есть клевый мануал про всю эту суету с «ОнаВзрывает» или SheBang. Правда на английском, но с переводчиком вменяемо.
Исследуйте господа и дамы.
Всем котиков и доброй ночи🚶♀️ 😎 ☠️ пойдука я дрыхнуть! А завтра наконец-то пятница и нет никаких ретроспектив и созвонов. Ура!
tags: #linux #bash
—
💩 @bashdays
Все что работает на базе ядра linux, создание процесса происходит в два этапа. Процесс клонируется с помощью системных вызовов fork и clone. А копия процесса замещается кодом из указанного файла (exec). Детали пока опущу, речь про другое.
Ты всяко знаешь, что скрипт должен начинаться с символов #!. Эта штуковина называется SheBang.
Если дословно: SheBang = Она взрывает. Bang Bang, Feuer Frei! Как у Rammstein песенка, сразу фильм XXX на ум приходит. С лысым ЧСВ мужиком, а не про выгоревших чуваков позади дивана с одной миниатюрной мадмуазелью с дрочильного сайта.
В общем после #! нужно указать путь до интерпретатора, обычно мы с вами фигачим /bin/bash или питончик какой нибудь.
Данная конструкция будет использована системными вызовами семейства exec для запуска нужного интерпретатора, который в свою очередь исполнит картину маслом и запустит скрипт.
Если из командной строки запустить скрипт и системный вызов execve возвратит ошибку ENOEXEC
Процесс оболочки bash будет сам пытаться выполнить скрипт.
EXECVE() = выполняет программу, заданную параметром filename. Программа должна быть или двоичным исполняемым файлом, или скриптом, начинающимся со строки вида #!.
ENOEXEC = исполняемый файл в неизвестном формате, для другой архитектуры, или же встречены какие-то ошибки, препятствующие его выполнению.
В большинстве случаев ENOEXEC возвращается если первая строка не начинается с #! либо первая строка начинается с #! и в строке больше нет символов кроме пробелов и табуляций.
Так вот, это запустится:
#!И это тоже запустится:
echo 'Have a nice bashdays'
exit
# super commentНу и это аналогично залетит в сакцесфул:
echo 'Have a nice bashdays'
exit
echo 'Have a nice bashdays'Так что не обязательно указывать нашу любимую конструкцию #!/bin/bash, интерпретатор тот еще жук и учитывает такие нюансы.
exit
Если интересно поподробнее про это почитать, есть клевый мануал про всю эту суету с «ОнаВзрывает» или SheBang. Правда на английском, но с переводчиком вменяемо.
Исследуйте господа и дамы.
Всем котиков и доброй ночи
tags: #linux #bash
—
Please open Telegram to view this post
VIEW IN TELEGRAM
Ура, я кажется выспался и почти отошел от дегустации чачи. В прошлую пятницу, коллега попросил помочь ему накидать промпт, ну знаешь же там все эти PS1/PS2/PS3. Короче приглашение командной строки типа: root@bashdays:~#.
А мне сука так лень было этим заниматься, опять документацию поднимать, вспоминать все эти ключи и параметры. Короче Фууу!
Сижу думаю, как послать в пешее эротическое и не обидеть особо. Долго думать не пришлось. Все уже придумано за нас.
После минуты гугления, нашел несколько хороших генераторов этой самой фиготы. Тыкаешь мышкой по кнопочкам и получаешь готовый промпт.
Чёрт, как правильно промпт или промт? Промт по моему какой-то переводчик раньше такой был, в общем не суть.
Отдал найденные чудеса коллеге, за что получил респект и уважуху. Ну и делюсь находками с вами, мож тоже в хозяйстве пригодится.
- Bash Prompt Generator
- Prompt Gen
- EZprompt
Там кстати телега обновление выпустила, всякие ништяки типа цитат, блоков кода и т.п. Буду теперь к постам это все применять. Не забудьте обновиться, чтобы у вас тут все красиво выглядело, а не как гавно.
Пойду дальше диван давить, да киношки смотреть. Наконец-то что-то похожее на выходной. Увидимся!
tags: #linux #services
—
💩 @bashdays
А мне сука так лень было этим заниматься, опять документацию поднимать, вспоминать все эти ключи и параметры. Короче Фууу!
Сижу думаю, как послать в пешее эротическое и не обидеть особо. Долго думать не пришлось. Все уже придумано за нас.
После минуты гугления, нашел несколько хороших генераторов этой самой фиготы. Тыкаешь мышкой по кнопочкам и получаешь готовый промпт.
Чёрт, как правильно промпт или промт? Промт по моему какой-то переводчик раньше такой был, в общем не суть.
Отдал найденные чудеса коллеге, за что получил респект и уважуху. Ну и делюсь находками с вами, мож тоже в хозяйстве пригодится.
- Bash Prompt Generator
- Prompt Gen
- EZprompt
Там кстати телега обновление выпустила, всякие ништяки типа цитат, блоков кода и т.п. Буду теперь к постам это все применять. Не забудьте обновиться, чтобы у вас тут все красиво выглядело, а не как гавно.
Пойду дальше диван давить, да киношки смотреть. Наконец-то что-то похожее на выходной. Увидимся!
tags: #linux #services
—
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
Если у тебя коряво отображаются посты, либо вообще не отображаются (нарисован грустный хуй смайлик) - обнови клиента телеграм и все взлетит.
Не пропустите новый пост, который выше 👆
Форматирование постов еще отлажу, пока лезут баги особенно с форматированием кода, но думаю все скоро пофиксят. Еще бы картинки разрешили посреди текста пихать, было бы вообще пушка!
Не пропустите новый пост, который выше 👆
Форматирование постов еще отлажу, пока лезут баги особенно с форматированием кода, но думаю все скоро пофиксят. Еще бы картинки разрешили посреди текста пихать, было бы вообще пушка!
Короче с новой версией телеги просто 3.14здец какой-то, буду пока нативно через старый клиент посты фигачить, без всех этих свистоперделок. Если статью про циркули не увидел, я позаботился о тебе и закинул ее в телеграф. Читай нативку прям из клиента, не должно всей это шляпы больше вылазить. Всем спасибо ребята за фидбеки!
https://telegra.ph/Enable-in-da-Bash-10-30
https://telegra.ph/Enable-in-da-Bash-10-30
Подсмотрел тут у товарища интересную идею с итогами по постам за прошлый месяц. Типа ТОП лист самого интересного, что прям со свистом залетело в умы. Попробую и я такое провернуть. Поехали!
Больше всего просмотров:
- Про SheBang и интерпретатор (7350)
- Шаринг файлов с серверов в телеграм (6834)
- Утилита JC (6545)
- Форматер длинных строк (6469)
- Приколы с утилитой shopt (6379)
- Потрошим HereDoc (6300)
- Комбайн для архиваторов (6239)
- Лучший способ читать переменные из файла (6186)
- Как перелезть на VIM и не помереть (6089)
Больше всего пересылок:
- Изолируем пользователя в chroot (177)
- Компилируем bash скрипт в бинарный файл (136)
- Делаем красивые диалоговые окна (135)
- Игруля Rick & Morty Quest (132)
- Про flock и долгоиграющие скрипты (131)
- Фреймворк для тестирования bash скриптов (120)
- Уничтожаем процесс через порт с помощью Kill Port (113)
Больше всего комментариев и лайков:
- Strace или что запускает программа
- Про CTRL+D и завершение сессий
- Bash Prompt Generator
- Чем отличается rm от unlink
Ну и не забываем, что есть навигация по тэгам (в закрепленном сообщении). Да, очень хорошо выстреливает рубрика #debug. Надо наверное за прошлые месяцы тоже будет такую табличку сделать.
tags: #итогимесяца 10/23
—
💩 @bashdays
Больше всего просмотров:
- Про SheBang и интерпретатор (7350)
- Шаринг файлов с серверов в телеграм (6834)
- Утилита JC (6545)
- Форматер длинных строк (6469)
- Приколы с утилитой shopt (6379)
- Потрошим HereDoc (6300)
- Комбайн для архиваторов (6239)
- Лучший способ читать переменные из файла (6186)
- Как перелезть на VIM и не помереть (6089)
Больше всего пересылок:
- Изолируем пользователя в chroot (177)
- Компилируем bash скрипт в бинарный файл (136)
- Делаем красивые диалоговые окна (135)
- Игруля Rick & Morty Quest (132)
- Про flock и долгоиграющие скрипты (131)
- Фреймворк для тестирования bash скриптов (120)
- Уничтожаем процесс через порт с помощью Kill Port (113)
Больше всего комментариев и лайков:
- Strace или что запускает программа
- Про CTRL+D и завершение сессий
- Bash Prompt Generator
- Чем отличается rm от unlink
Ну и не забываем, что есть навигация по тэгам (в закрепленном сообщении). Да, очень хорошо выстреливает рубрика #debug. Надо наверное за прошлые месяцы тоже будет такую табличку сделать.
tags: #итогимесяца 10/23
—
Please open Telegram to view this post
VIEW IN TELEGRAM