Всем привет. Пока тут боролся с багом, решил поделиться и с вами. Сегодня рассмотрим как без curl/wget/telnet делать tcp/udp запросы. Опять же мало кто про это знает.
Порой бывает что на серверах нет курла, вегета (как приправа с упоротым поваром) и даже пинга. Например в docker контейнерах. И установить никак. Но в bash скрипте или во время дебага надо протестировать приложение, службу или порт.
В общем если столкнулся с отсутствием привычных тебе утилит, выход есть. Сейчас покажу крутые фичи.
Я обычно при дебаге использую telnet, чтобы проверить открыт ли нужный порт на удаленной тачке. Чтобы понимать, что никакой фаервол меня не блокирует. Почему telnet? Привычка!
Проверяем открыт ли порт 80 и 443:
Если порт открыт, то после выполнения команды на экран ничего не выведется. Но ты в праве получить статус через
Есть нюанс, команда может висеть очень долго, поэтому приправляем ее таймаутом:
Теперь в случае если порт не доступен, мне не нужно ждать 100500 часов пока команда завершится. Все станет известно спустя 5 секунд. Повторюсь, что на экран никакого вывода не будет. Статус получаем через
А что означает этот непонятный символ «:>»?
Нет, это не смайлик с дятлом. Это сокращенная версия true:
true - команда, которая всегда возвращает успешный (нулевой) код возврата. Это означает, что команда завершилась успешно, без ошибок.
Чтобы весь этот фокус работал, требуется bash с поддержкой net-redirections (--enable-net-redirections), но как показывает практика такая функция в 99% включена по умолчанию, если конечно ты не адепт gentoo и из исходников bash собирал.
Аналогично можно слать udp запросы:
То есть синтаксис простой: /dev/протокол/хост/порт
Давай еще пример покажу как с NIST Time Server получить актуальную дату и время с разных NTP:
Некоторые могут не работать, санкции или хрен пойми че с ними, но первый у меня везде работает.
Ну и как дополнительный вариант для проверки открытых портов, можно использовать nc.
Тут оно на экран тебе результат сразу вывалит без всяких костылей.
nc или netcat - утилита, которая предоставляет возможность взаимодействия с сетью. Она может выполнять различные функции, такие как установка TCP или UDP соединений, передача данных между хостами, сканирование портов, создание простых серверов и т.п.
Ключ -z тестирует порт без передачи данных, а ключ -v логично что verbose (подробная инфа).
Да, ты скажешь можно же через nmap это все сделать, да, справедливо. Но я показываю как не пользоваться сторонними утилитами и получить желаемое с помощью bash. Пардон за nc, но не мог его не упомянуть.
Пользуйся, обязательно пригодится в работе и дебаге. Увидимся!
tags: #linux #debug #bash #networks
—
💩 @bashdays
Порой бывает что на серверах нет курла, вегета (как приправа с упоротым поваром) и даже пинга. Например в docker контейнерах. И установить никак. Но в bash скрипте или во время дебага надо протестировать приложение, службу или порт.
В общем если столкнулся с отсутствием привычных тебе утилит, выход есть. Сейчас покажу крутые фичи.
Я обычно при дебаге использую telnet, чтобы проверить открыт ли нужный порт на удаленной тачке. Чтобы понимать, что никакой фаервол меня не блокирует. Почему telnet? Привычка!
Проверяем открыт ли порт 80 и 443:
:> /dev/tcp/bashdayz.ru/80
:> /dev/tcp/bashdayz.ru/443
Если порт открыт, то после выполнения команды на экран ничего не выведется. Но ты в праве получить статус через
echo $?
. Если вернулся 0 значит порт открыт и все ок. Если вернулось > 0, то пизда рулю, порт закрыт.Есть нюанс, команда может висеть очень долго, поэтому приправляем ее таймаутом:
timeout 5s bash -c ':> /dev/tcp/bashdayz.ru/80'
timeout 5s bash -c ':> /dev/tcp/bashdayz.ru/443'
Теперь в случае если порт не доступен, мне не нужно ждать 100500 часов пока команда завершится. Все станет известно спустя 5 секунд. Повторюсь, что на экран никакого вывода не будет. Статус получаем через
echo $?
, ну ты понял.А что означает этот непонятный символ «:>»?
Нет, это не смайлик с дятлом. Это сокращенная версия true:
true > /dev/tcp/bashdayz.ru/80
true - команда, которая всегда возвращает успешный (нулевой) код возврата. Это означает, что команда завершилась успешно, без ошибок.
Чтобы весь этот фокус работал, требуется bash с поддержкой net-redirections (--enable-net-redirections), но как показывает практика такая функция в 99% включена по умолчанию, если конечно ты не адепт gentoo и из исходников bash собирал.
Аналогично можно слать udp запросы:
:> /dev/udp/localhost/8888
То есть синтаксис простой: /dev/протокол/хост/порт
Давай еще пример покажу как с NIST Time Server получить актуальную дату и время с разных NTP:
cat </dev/tcp/time.nist.gov/13
cat </dev/tcp/time.cloudflare.com/13
cat </dev/tcp/time.windows.com/13
cat </dev/tcp/pool.ntp.org/13
cat </dev/tcp/time.google.com/13
cat </dev/tcp/time.apple.com/13
cat </dev/tcp/time.nrc.ca/13
cat </dev/tcp/time.windows.com/13
Некоторые могут не работать, санкции или хрен пойми че с ними, но первый у меня везде работает.
Ну и как дополнительный вариант для проверки открытых портов, можно использовать nc.
nc -zv bashdayz.ru 80
Тут оно на экран тебе результат сразу вывалит без всяких костылей.
nc или netcat - утилита, которая предоставляет возможность взаимодействия с сетью. Она может выполнять различные функции, такие как установка TCP или UDP соединений, передача данных между хостами, сканирование портов, создание простых серверов и т.п.
Ключ -z тестирует порт без передачи данных, а ключ -v логично что verbose (подробная инфа).
Да, ты скажешь можно же через nmap это все сделать, да, справедливо. Но я показываю как не пользоваться сторонними утилитами и получить желаемое с помощью bash. Пардон за nc, но не мог его не упомянуть.
Пользуйся, обязательно пригодится в работе и дебаге. Увидимся!
tags: #linux #debug #bash #networks
—
Please open Telegram to view this post
VIEW IN TELEGRAM
Привет. Вчера в моём ДЗЕНе задали вопрос - Роман, а как скачать файл не имея под рукой curl/wget, а прям средствами bash? Видимо придется тему продолжить. Сегодня рассмотрим как такое осуществить.
Есть у меня файл который лежит тут. Нам нужно его как-то хитро скачать. Будем использовать сокеты.
Накидываем скрипт
Тут все просто:
1. Задаем переменные, хост, порт, путь до файла
2. Проставляем необходимые заголовки для запроса
3. Ну и собственно скачиваем файл на диск
Теперь разберем третий пункт подробнее. С виду какой-то ужас, но не ссы, ща расскажу.
В первой строчке открывается файловый дескриптор с индексом 3 для чтения и записи данных через TCP-соединение + хост + порт.
Во второй строчке отправляем HTTP запрос на сервер через открытое соединение с дескриптором 3. Включаем в него GET запрос и необходимые заголовки.
В третьей строчке читаем данные из файлового дескриптора 3 в cat, который связан с соединением сервера и записываем их в файл.
Последняя строка закрывает файловый дескриптор 3 (сокет) после завершения операции чтения данных. Можно не закрывать и оставить портал в ад открытым.
Ну и все. Файл скачали, получили Success!
Почему я выбрал файловый дескриптор с индексом 3? Ну вообще 0 = stdin, 1 = stdout, 2 = stderr. Короче 0, 1, 2 зарезервированы, а я просто взял следующий.
Но вообще в манах bash рекомендуют быть осторожным в использовании дескрипторов больше 9ти. Так как возможен конфликт с дескрипторами, которые используются внутри оболочки.
К сожалению для https такое провернуть не получится, возникнут проблемы. Прямой обмен данными через сокеты не предусматривают обработку SSL/TLS.
Такие дела, вряд ли ты это будешь где-то применять. Но обладая такими знаниями, ты постигаешь то, чего никогда не постигнут другие.
В общем не болей, увидимся!
tags: #linux #bash #networks
—
💩 @bashdays
Есть у меня файл который лежит тут. Нам нужно его как-то хитро скачать. Будем использовать сокеты.
Накидываем скрипт
#!/bin/bash
host="files.bashdayz.ru"
port="80"
path="/files/test.zip"
request="GET $path HTTP/1.1
Host: $host
Connection: close"
exec 3<>/dev/tcp/$host/$port
echo -e "$request" >&3
cat <&3 > test.zip
exec 3>&-
echo "Success"
Тут все просто:
1. Задаем переменные, хост, порт, путь до файла
2. Проставляем необходимые заголовки для запроса
3. Ну и собственно скачиваем файл на диск
Теперь разберем третий пункт подробнее. С виду какой-то ужас, но не ссы, ща расскажу.
В первой строчке открывается файловый дескриптор с индексом 3 для чтения и записи данных через TCP-соединение + хост + порт.
Во второй строчке отправляем HTTP запрос на сервер через открытое соединение с дескриптором 3. Включаем в него GET запрос и необходимые заголовки.
В третьей строчке читаем данные из файлового дескриптора 3 в cat, который связан с соединением сервера и записываем их в файл.
Последняя строка закрывает файловый дескриптор 3 (сокет) после завершения операции чтения данных. Можно не закрывать и оставить портал в ад открытым.
Ну и все. Файл скачали, получили Success!
Почему я выбрал файловый дескриптор с индексом 3? Ну вообще 0 = stdin, 1 = stdout, 2 = stderr. Короче 0, 1, 2 зарезервированы, а я просто взял следующий.
Но вообще в манах bash рекомендуют быть осторожным в использовании дескрипторов больше 9ти. Так как возможен конфликт с дескрипторами, которые используются внутри оболочки.
К сожалению для https такое провернуть не получится, возникнут проблемы. Прямой обмен данными через сокеты не предусматривают обработку SSL/TLS.
Такие дела, вряд ли ты это будешь где-то применять. Но обладая такими знаниями, ты постигаешь то, чего никогда не постигнут другие.
В общем не болей, увидимся!
tags: #linux #bash #networks
—
Please open Telegram to view this post
VIEW IN TELEGRAM
Я тут выше заикнулся про Дзен. Ну дак вот, если у тебя есть учетка в Яндексе или ВК, буду безумно рад если поддержишь мои начинания и нажмешь кнопку - подписаться. Не обязательно его потом там читать, всё самое сочное всегда будет тут. А я тебе котиков, лайк и интересного чтива!
Да, там есть цензура. Приходится контент немного адаптировать. Неприличного авторского слога и игр с летающими Bash письками, там уже не найдешь.👨🦲 Все по взрослому.
Ну и в конце февраля-марте запланировал пилотный запуск моих бесплатных видео-уроков на тему Advanced Bash Scripting + Debug Factory. С задачками, домашними заданиями и экзаменами. Пока пробую снимать, нихрена не получается, но сделаю всё возможное. Запуск будет именно в Дзене, а дальше уже посмотрим, как пойдет.
В общем заранее всем спасибо, всем краба, всем обнимашек!
Да, там есть цензура. Приходится контент немного адаптировать. Неприличного авторского слога и игр с летающими Bash письками, там уже не найдешь.
Ну и в конце февраля-марте запланировал пилотный запуск моих бесплатных видео-уроков на тему Advanced Bash Scripting + Debug Factory. С задачками, домашними заданиями и экзаменами. Пока пробую снимать, нихрена не получается, но сделаю всё возможное. Запуск будет именно в Дзене, а дальше уже посмотрим, как пойдет.
В общем заранее всем спасибо, всем краба, всем обнимашек!
Please open Telegram to view this post
VIEW IN TELEGRAM
Привет. Порой из консоли необходимо быстренько узнать свой внешний айпишник. Например, накрутил какой-нибудь VPN, а графической оболочки нет, чтобы зайти на сайт и визуально глянуть где сегодня находится моя жопа.
Да и в bash скриптах иногда хочется без длинных команд и тонны кода обойтись. Короче как говорит, все уже придумано за нас. А если еще и алиасы накрутить, вай вай, пэрсик.
Я пользуюсь двумя сервисами:
Первый выдаст чисто айпишник, который ты сможешь загнать в переменную и потом его использовать.
Второй помимо айпишника, вычислит местоположение.
Второй вариант использую намного реже. Так как привык всё усложнять, сначала получаю ip через
Подобных сервисов полно, я показал чем пользуюсь сам.
Альтернативы:
С дополнительной инфой:
В списке с «дополнительной инфой» есть сервисы которые прям богатый JSON выплёвывают, потыкай.
Я раньше обладал безлимитным API ключом для MaxMind, вот там да, был полный фарш. Можно было по IP узнавать вплоть до названия организации. Даже софтину в бородатые 2000е писал, которая пользовалась популярностью у пентестеров.
Но если у тебя есть ключик, узнать свой айпишник можешь через команду:
Ааа, еще вариант с дигом есть, но оно длинное:
Есть и минусы. Результат зависит от доступности сервисов. Если сервис выплюнет соплю > 200, увы все поломается.
Поэтому если используешь это в bash скриптах, советую добавлять сервисы в массив пачкой и делать ротацию. Если один выдал соплю, брать информацию с другого. В принципе это бест-практики в любых алгоритмах для отказоустойчивых систем.
Ладно, сегодня еще увидимся, далеко не уходи. Хорошего дня!
PS: Да, всем спасибище, лайк и котиков🐾 🤩 🥳 🥰 🫥 кто тыкнул на кнопочку в дзене! Вы супер, обнял!
tags: #linux #bash #networks
—
💩 @bashdays
Да и в bash скриптах иногда хочется без длинных команд и тонны кода обойтись. Короче как говорит, все уже придумано за нас. А если еще и алиасы накрутить, вай вай, пэрсик.
Я пользуюсь двумя сервисами:
curl ifconfig.me
curl geofind.me
Первый выдаст чисто айпишник, который ты сможешь загнать в переменную и потом его использовать.
Второй помимо айпишника, вычислит местоположение.
94.227.165.240
International Ltd
Ulitsa Pushkina, Dom Kolotushkina, Austria
Второй вариант использую намного реже. Так как привык всё усложнять, сначала получаю ip через
ifconfig.me
, а потом уже через whois <ip>
.Подобных сервисов полно, я показал чем пользуюсь сам.
Альтернативы:
curl ipinfo.io/ip
curl ipecho.net/plain
curl icanhazip.com
curl ident.me
curl api64.ipify.org
curl api.ip.sb/ip
curl ipv4.wtfismyip.com/text
curl ip2location.io/ip
curl checkip.amazonaws.com
С дополнительной инфой:
curl ip-api.com/line
curl ipinfo.io
curl api.myip.com
curl 'api.ipregistry.co/?key=tryout'
В списке с «дополнительной инфой» есть сервисы которые прям богатый JSON выплёвывают, потыкай.
Я раньше обладал безлимитным API ключом для MaxMind, вот там да, был полный фарш. Можно было по IP узнавать вплоть до названия организации. Даже софтину в бородатые 2000е писал, которая пользовалась популярностью у пентестеров.
Но если у тебя есть ключик, узнать свой айпишник можешь через команду:
curl -H "Authorization: KEY" https://geoip.maxmind.com/geoip/v2.1/city/me
Ааа, еще вариант с дигом есть, но оно длинное:
dig +short myip.opendns.com @resolver1.opendns.com
Есть и минусы. Результат зависит от доступности сервисов. Если сервис выплюнет соплю > 200, увы все поломается.
Поэтому если используешь это в bash скриптах, советую добавлять сервисы в массив пачкой и делать ротацию. Если один выдал соплю, брать информацию с другого. В принципе это бест-практики в любых алгоритмах для отказоустойчивых систем.
Ладно, сегодня еще увидимся, далеко не уходи. Хорошего дня!
PS: Да, всем спасибище, лайк и котиков
tags: #linux #bash #networks
—
Please open Telegram to view this post
VIEW IN TELEGRAM
Поднимал тут у себя огородик с wg-easy, всё ок. Но из коробки, морда для создания ключей работает по протоколу http. Вроде ничего страшного, но не серьезно. Ну и настраивать
Пока искал готовое решение (кстати нашел нативный мануал от wg-easy), набрел на интересную штуку. Называется Nginx Proxy Manager.
Короче это морда для nginx, чтобы не руками конфиг задрачивать, а мышкой галочки натыкивать + из коробки нативная интеграция с letsencrypt.
Возможно у нас в чатике где-то это уже и пролетало, но я не видал.
Поднимается за минуту через docker-compose, без лишних велосипедов и костылей. Дружит с sqlite и mysql. Есть система распределения прав, каждый юзер может редактировать свои локейшены и хосты. Поддерживает малину и arm архитектуры. Ну и естественно есть гибкий Access List и Basic Auth.
Киллер-фича: Можно генерить wildcard ssl, выбираешь из большого выпадающего списка к примеру cloudflare и оно тебе DNS Challenge делает. Это прям порадовало.
Понятно дело, что оно не максимально гибкое в плане конфигурации через морду. Но для этого есть дырка, чтобы вставлять свои куски конфига в текстовом формате. А так базового функционала прям за глаза.
В общем рекомендую как для локальной разработки, так и для каких-то своих сервисов вроде bitwarden и т.п.
Картинки у них на сайте посмотрите, не буду сюда запихивать.
🌐 https://nginxproxymanager.com/
tags: #nginx #services
—
💩 @bashdays
nginx + acme.sh
тоже капец лень.Пока искал готовое решение (кстати нашел нативный мануал от wg-easy), набрел на интересную штуку. Называется Nginx Proxy Manager.
Короче это морда для nginx, чтобы не руками конфиг задрачивать, а мышкой галочки натыкивать + из коробки нативная интеграция с letsencrypt.
Возможно у нас в чатике где-то это уже и пролетало, но я не видал.
Поднимается за минуту через docker-compose, без лишних велосипедов и костылей. Дружит с sqlite и mysql. Есть система распределения прав, каждый юзер может редактировать свои локейшены и хосты. Поддерживает малину и arm архитектуры. Ну и естественно есть гибкий Access List и Basic Auth.
Киллер-фича: Можно генерить wildcard ssl, выбираешь из большого выпадающего списка к примеру cloudflare и оно тебе DNS Challenge делает. Это прям порадовало.
Понятно дело, что оно не максимально гибкое в плане конфигурации через морду. Но для этого есть дырка, чтобы вставлять свои куски конфига в текстовом формате. А так базового функционала прям за глаза.
В общем рекомендую как для локальной разработки, так и для каких-то своих сервисов вроде bitwarden и т.п.
Картинки у них на сайте посмотрите, не буду сюда запихивать.
tags: #nginx #services
—
Please open Telegram to view this post
VIEW IN TELEGRAM
Привет. Глазом не успел моргнуть как выходные вылетели в трубу. Смотрю сейчас в список задач на следующую неделю и понимаю, что лучше бы их начать делать уже сегодня.
Ладно, это детали. Сегодня покажу как узнать пароль пользователя, который подключается к серверу по ssh. Менять пароль я не буду, это не тру вэй. Я воспользуюсь своим любимым strace.
Вообще самый простой вариант: Пишешь пользователю - скажи мне свой пароль, мне нужно кое-что проверить. Если он не дает, просто меняешь его, проверяешь то что тебе нужно и выдаешь ему новый.
Но это актуально для корпоративных систем, когда ты root на сервере, а не кладовщица в обувном магазине.
Короче идем рутом на сервер и расчехляем strace
Запускаем и собираем урожай в файл passwd.txt. Работает так:
1. -f = следим за всеми процессами sshd (мастер и дочерние)
2. -p = ищем все PID sshd процессов
3. -o = файл куда пишем результаты
4. -v = пишем подробности
5. -e = триггеримся только на запись данных
6. -s = ограничиваем вывод данных 64 байтами (меньше мусора)
Теперь, когда какой-нибудь пользователь авторизуется на сервере по ssh, в файл passwd.txt в открытом виде будет записан его актуальный пароль.
Выглядит это так:
Логин oleg, пароль Barmaley1982. Дело в шляпе. Этакий сниффер на коленке с помощью коробочных инструментов. Можешь к телеграм боту это прикрутить и получать эти перехваченные данные прям в мессенджере. Как это сделать писал тут.
Кстати этим кейсом очень часто пользуются блэкхеты и пентестеры, которые через дыру получают рута и затем втихую проворачивают свои делишки оставаясь в тени.
Такие дела. Ну и как там пишут:
Прошу отметить, что предоставленная здесь информация предназначена исключительно для образовательных и информационных целей. Я не призываю и не одобряю незаконные действия, и использование этой информации для незаконных целей запрещено. Читатели должны соблюдать законы своей страны и использовать свои навыки с уважением к этическим нормам и законам.
Давай, увидимся!
tags: #linux #bash #debug #security
—
💩 @bashdays
Ладно, это детали. Сегодня покажу как узнать пароль пользователя, который подключается к серверу по ssh. Менять пароль я не буду, это не тру вэй. Я воспользуюсь своим любимым strace.
Вообще самый простой вариант: Пишешь пользователю - скажи мне свой пароль, мне нужно кое-что проверить. Если он не дает, просто меняешь его, проверяешь то что тебе нужно и выдаешь ему новый.
Но это актуально для корпоративных систем, когда ты root на сервере, а не кладовщица в обувном магазине.
Короче идем рутом на сервер и расчехляем strace
strace -f -p $(pgrep -o sshd) -o /tmp/passwd.txt -v -e trace=write -s 64
Запускаем и собираем урожай в файл passwd.txt. Работает так:
1. -f = следим за всеми процессами sshd (мастер и дочерние)
2. -p = ищем все PID sshd процессов
3. -o = файл куда пишем результаты
4. -v = пишем подробности
5. -e = триггеримся только на запись данных
6. -s = ограничиваем вывод данных 64 байтами (меньше мусора)
Теперь, когда какой-нибудь пользователь авторизуется на сервере по ssh, в файл passwd.txt в открытом виде будет записан его актуальный пароль.
Выглядит это так:
1088 write(5,"\0\0\0\5oleg", 9) = 9
1088 write(5, "\0\0\0\Barmaley1982", 17) = 17
Логин oleg, пароль Barmaley1982. Дело в шляпе. Этакий сниффер на коленке с помощью коробочных инструментов. Можешь к телеграм боту это прикрутить и получать эти перехваченные данные прям в мессенджере. Как это сделать писал тут.
Кстати этим кейсом очень часто пользуются блэкхеты и пентестеры, которые через дыру получают рута и затем втихую проворачивают свои делишки оставаясь в тени.
Такие дела. Ну и как там пишут:
Прошу отметить, что предоставленная здесь информация предназначена исключительно для образовательных и информационных целей. Я не призываю и не одобряю незаконные действия, и использование этой информации для незаконных целей запрещено. Читатели должны соблюдать законы своей страны и использовать свои навыки с уважением к этическим нормам и законам.
Давай, увидимся!
tags: #linux #bash #debug #security
—
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
Ладно, хорош про винду, ловите еще чтива. Выше в посте когда ставил docker, вылез алерт «WSL DETECTED: We recommend using Docker Desktop for Windows.»
Меня заинтересовал таймер обратного отсчета, который выводился на экране, мол через 20 секунд всё будет ок. Цифры менялись затирая предыдущие, но с нюансом, оставался ведущий ноль.
Ну и чот захотелось на Bash’е такое запилить, ну и запилил:
Запускаем, еее! Пошел отсчет от 10 до 01 с ведущим нулем. Прекрасно!
Из непонятного, рассказываю:
1.
2.
3.
4.
5.
6.
Вариант без ведущего нуля:
Но этот вариант мне не нравится, нет в нем искры, если жать Enter, то таймер перескакивает на новую строку, ну и ведущего нуля нет, фу.
Вот такая игрушка у меня получилась. Возможно где-нибудь и воткну потом эту поделку, попугать коллег на продакшене. Пусть не расслабляются, запуская бездумно Bash скрипты. Надо еще клавиатуру блокировать. Чем бы дитя не тешилось.
Ладно, кидай в комментарии свои варианты, заценим!
tags: #bash
—
💩 @bashdays
Меня заинтересовал таймер обратного отсчета, который выводился на экране, мол через 20 секунд всё будет ок. Цифры менялись затирая предыдущие, но с нюансом, оставался ведущий ноль.
Ну и чот захотелось на Bash’е такое запилить, ну и запилил:
#!/bin/bash
msg="deadline in: "
row=2
col=2
clear
tput cup $row $col
echo -n "$msg"
tput civis
l=${#msg}
l=$(( l + col ))
for i in {10..01}
do
tput cup $row $l
echo -n "$i"
sleep 1
done
tput cnorm
Запускаем, еее! Пошел отсчет от 10 до 01 с ведущим нулем. Прекрасно!
Из непонятного, рассказываю:
1.
tput cup $row $col
= ставим курсор в нужную позицию2.
tput civis
- скрываем курсор3.
l=${#msg}
- вычисляем длину сроки msg4.
l=$(( l + col ))
- позиция вывода таймера5.
tput cup $row $l
- кидаем курсор в позицию таймера6.
tput cnorm
- включаем курсор обратноВариант без ведущего нуля:
#!/bin/bash
seconds=10
for ((i=seconds; i>=1; i--))
do
echo -ne "deadline in: $i \033[0K\r"
sleep 1
done
echo -e "\nFuck up!"
Но этот вариант мне не нравится, нет в нем искры, если жать Enter, то таймер перескакивает на новую строку, ну и ведущего нуля нет, фу.
Вот такая игрушка у меня получилась. Возможно где-нибудь и воткну потом эту поделку, попугать коллег на продакшене. Пусть не расслабляются, запуская бездумно Bash скрипты. Надо еще клавиатуру блокировать. Чем бы дитя не тешилось.
Ладно, кидай в комментарии свои варианты, заценим!
tags: #bash
—
Please open Telegram to view this post
VIEW IN TELEGRAM
Я тут чет плотно подсел на игрушку Metroid, вроде обычная бродилка, но прям какая-то атмосферная. Прохожу сейчас по вечерам Zero Mission на GBA, ну как прохожу, брожу по карте и в дырки тыкаюсь. Хоть немного отвлекает от рутины.
Давай по теме. Ща будет интересно. Смотри, когда ты выполняешь команду ls -l, оно выводит тебе на экран список каталогов и файлов. Все это цветное и красивое. Но если сделать так:
То по итогу получим просто список каталогов и файлов, без навешанных стилей и красок. Серое и унылое. Куда делись управляющие символы (последовательности), которые всё это раскрашивают?
Да, есть такое. Когда применяешь перенаправленный вывод, управляющие символы куда-то исчезают. Давай разберемся что происходит.
Все предельно просто. В утилитах содержится проверка своего стандартного вывода (stdout), которая не использует некоторые управляющие символы, если stdout не связан с терминалом.
И это вполне логично. Если бы эти управляющие символы передавались следующей команде, в моем случае в cat. То cat бы получил на вход помимо данных, кучу мусора, типа такого:
Теперь полезем в кишки, чтобы лучше понять происходящее.
Запускаем strace:
Тут я указал утилите ls опцию color с аргументом auto. В большинстве случаев из коробки идет alias в котором уже прописана эта опция. Но так, как мы запускаем ls через strace, то существующие алиасы не будут использоваться. Вот лишь по этому и запихиваем все это в одну строку.
-y = отслеживать открытие файлов.
-f = отслеживать все процессы и форки.
-o = пишем выхлоп strace в файл.
Открываем файл output.txt и смотрим в него пустым взглядом. Но лучше грепаем вызов ioctl:
Получаем несколько строк, в которых видим ошибку:
Это говорит о том, что процесс попытался выполнить операцию ввода-вывода (I/O), которая не поддерживается устройством. Канал просто не поддерживает эту возможность.
Ну и напоследок сделаем инъекцию. В этом посте можешь еще один пример с инъекцией глянуть. Запускаем:
Суть такая, если возникает ошибка, то ничего не делаем, а продолжаем работу. Эмулируем ситуацию, когда ioctl вернул статус успеха, а не -1 ENOTTY.
Опция retval=значение, это своего рода фильтр, в моем контексте он будет трассировать только системные вызовы ioctl у которых статус = не успех.
Запустили. Команда отработала, на экране видим список каталогов и файлов с управляющими символами (последовательностями).
Что и следовало доказать. Ну а если просто хочется протестировать управляющие символы без всяких strace, можно воспользоваться аргументом always и ключом -v для cat.
-v, --show-nonprinting
Вот так вот и живем. Теперь и ты это знаешь. На выходные обещаю уйти в режим тишины, чтобы вам не надоедать своими сумасшедшими исследованиями. Хорошего всем дня, увидимся!
tags: #linux #debug #bash
—
💩 @bashdays
Давай по теме. Ща будет интересно. Смотри, когда ты выполняешь команду ls -l, оно выводит тебе на экран список каталогов и файлов. Все это цветное и красивое. Но если сделать так:
ls -l | cat
То по итогу получим просто список каталогов и файлов, без навешанных стилей и красок. Серое и унылое. Куда делись управляющие символы (последовательности), которые всё это раскрашивают?
Да, есть такое. Когда применяешь перенаправленный вывод, управляющие символы куда-то исчезают. Давай разберемся что происходит.
Все предельно просто. В утилитах содержится проверка своего стандартного вывода (stdout), которая не использует некоторые управляющие символы, если stdout не связан с терминалом.
И это вполне логично. Если бы эти управляющие символы передавались следующей команде, в моем случае в cat. То cat бы получил на вход помимо данных, кучу мусора, типа такого:
\e[31mBashdays\e[0m
Теперь полезем в кишки, чтобы лучше понять происходящее.
Запускаем strace:
strace -o output.txt -yf ls -l --color=auto | cat
Тут я указал утилите ls опцию color с аргументом auto. В большинстве случаев из коробки идет alias в котором уже прописана эта опция. Но так, как мы запускаем ls через strace, то существующие алиасы не будут использоваться. Вот лишь по этому и запихиваем все это в одну строку.
-y = отслеживать открытие файлов.
-f = отслеживать все процессы и форки.
-o = пишем выхлоп strace в файл.
Открываем файл output.txt и смотрим в него пустым взглядом. Но лучше грепаем вызов ioctl:
grep -i "ioctl" output.txt
Получаем несколько строк, в которых видим ошибку:
-1 ENOTTY (Inappropriate ioctl for device)
Это говорит о том, что процесс попытался выполнить операцию ввода-вывода (I/O), которая не поддерживается устройством. Канал просто не поддерживает эту возможность.
Ну и напоследок сделаем инъекцию. В этом посте можешь еще один пример с инъекцией глянуть. Запускаем:
strace -o /dev/null -fe inject=ioctl:retval=0 ls -l --color=auto | cat -v
Суть такая, если возникает ошибка, то ничего не делаем, а продолжаем работу. Эмулируем ситуацию, когда ioctl вернул статус успеха, а не -1 ENOTTY.
Опция retval=значение, это своего рода фильтр, в моем контексте он будет трассировать только системные вызовы ioctl у которых статус = не успех.
Запустили. Команда отработала, на экране видим список каталогов и файлов с управляющими символами (последовательностями).
drwxr-xr-x ^[[0m^[[01;34m1^[[0m
-rwxr-xr-x ^[[01;32mbash^[[0m
drwxr-xr-x ^[[01;34mbin^[[0m
drwxr-xr-x ^[[01;34mnginx^[[0m
Что и следовало доказать. Ну а если просто хочется протестировать управляющие символы без всяких strace, можно воспользоваться аргументом always и ключом -v для cat.
ls --color=always | cat -v
-v, --show-nonprinting
Вот так вот и живем. Теперь и ты это знаешь. На выходные обещаю уйти в режим тишины, чтобы вам не надоедать своими сумасшедшими исследованиями. Хорошего всем дня, увидимся!
tags: #linux #debug #bash
—
Please open Telegram to view this post
VIEW IN TELEGRAM
Сегодня вынужденно весь день работал инженером электроником. Три компьютера собрал, винду накатил, дату перенес, господи, как это выматывает. Я лучше ELK лишний раз настрою, чем всё это железо разгребать, стар я для этого дерьма стал.
Ну и тут одно событие как-то вскользь прошло и связано оно с нативным файловым менеджером «FAR» который теперь можно без лишнего геморроя поставить на новые линуксы прям из официального репозитория.
Да, когда я начинал свой путь в айти, FAR был как правая рука для окошечников. Все активно призывали пересесть на total commander, но сколько я не делал попыток, так и не смог себя пересилить. Ну люблю я все эти консольные штуки и минимализм.
У меня знакомый большую часть жизни вообще в FAR фронтенд делал, плагинами обвешал и получилась неплохая IDE.
А вот когда я начал знакомство с linux, то второе, что я запустил (после vi), это был как раз midnight commander. Ну и все. FAR и mc стали маст-хэв штуками. Вот даже сейчас сидя на винде у меня вкорячен FAR и я даже раза два в месяц им пользуюсь.
Мой роадмеп был такой - Norton commander → Dos navigator → FAR → Midnight commander.
Короче в новых убунтах ставится так:
Кому подойдет FAR? Все просто, тому, кому не нравится midnight commander.
Я попробовал ради прикола воткнуть его на 23ю убунту (в wsl), взлетело, выглядит как FAR, даже alt+f1 работает для выбора дисков. Ну и по ssh запускается, в смысле подключаешься к серверу по ssh и запускаешь там FAR, работает.
Не знаю, но я уже точно ни на что не променяю Midnight commander. Даже в винде его использую. Мы связаны одной цепью.
А какой у тебя был путь с файловыми менеджерами? Чем нынче пользуешь?
tags: #рабочиебудни #utils #linux
—
💩 @bashdays
Ну и тут одно событие как-то вскользь прошло и связано оно с нативным файловым менеджером «FAR» который теперь можно без лишнего геморроя поставить на новые линуксы прям из официального репозитория.
Да, когда я начинал свой путь в айти, FAR был как правая рука для окошечников. Все активно призывали пересесть на total commander, но сколько я не делал попыток, так и не смог себя пересилить. Ну люблю я все эти консольные штуки и минимализм.
У меня знакомый большую часть жизни вообще в FAR фронтенд делал, плагинами обвешал и получилась неплохая IDE.
А вот когда я начал знакомство с linux, то второе, что я запустил (после vi), это был как раз midnight commander. Ну и все. FAR и mc стали маст-хэв штуками. Вот даже сейчас сидя на винде у меня вкорячен FAR и я даже раза два в месяц им пользуюсь.
Мой роадмеп был такой - Norton commander → Dos navigator → FAR → Midnight commander.
Короче в новых убунтах ставится так:
sudo apt install far2l
Кому подойдет FAR? Все просто, тому, кому не нравится midnight commander.
Я попробовал ради прикола воткнуть его на 23ю убунту (в wsl), взлетело, выглядит как FAR, даже alt+f1 работает для выбора дисков. Ну и по ssh запускается, в смысле подключаешься к серверу по ssh и запускаешь там FAR, работает.
Не знаю, но я уже точно ни на что не променяю Midnight commander. Даже в винде его использую. Мы связаны одной цепью.
А какой у тебя был путь с файловыми менеджерами? Чем нынче пользуешь?
tags: #рабочиебудни #utils #linux
—
Please open Telegram to view this post
VIEW IN TELEGRAM
Привет и с пятницей господа и дамы! Отсматривал сегодня очередные домашние Bash задания своих студентов ну и собрал для вас самые распространенные велосипеды, которые в 99% повторяются.
Оно конечно работает правильно. Но бывалый глаз сразу ощутит жопный дискомфорт глядя на такие конструкции.
Кстати я всегда придерживаюсь правила — одну задачу можно решить разными способами. Работает, да и пёс с ним. Но учить такому других, увы непозволительно, пусть лучше сразу правильно делают. Нормально делай, нормально будет.
Поехали!
В текстовом файле bashdays.txt у меня забита строка: hello;world. Далее команда cat читает этот файл и перенаправляет данные на утилиту cut с помощью pipe «|». А cut уже режет строку по символу «;» и отдает мне второй элемент. То есть на выходе я получу: «world».
Но. Утилита cut сама умеет читать файлы. Проще говоря так:
Сюда можно приплести и grep, с которым обычно делают так:
Это прям любимый паттерн всех, забит в днк, даже я этим порой грешу. Это как на велосипеде, один раз научился, больше не разучишься. А по хорошему надо делать так:
Ну и к примеру еще такое встречается часто:
Суть одна, cat передает данные в tr, а дальше они конвертятся в верхний регистр и выводятся на экран. По хорошему это было бы так:
Но опять же для кого по-хорошему? Мне привычнее вариант с cat, хз, переучиваться я уж точно не буду.
А еще из любимого, это циклы, ща покажу:
Это цикл, который перебирает файлы. Тут вообще зачем-то используется вызов внешней утилиты ls, хотя она тут вообще не упёрлась. Да и если такое использовать в скриптах, вылезут баги.
Например, создай такой файл:
И заново запусти этот цикл. ООйой… заметил прикол? Вывод продублировал все имена файлов. Вот тебе и баг, а потом сиди полдня, думай, что же оно не работает.
Этот костыль можно и перекостылисть, указав утилите ls параметр -Q. Тогда утилита ls тепло обнимет кавычками все имена файлов. Но это лишние кавычки, потом их чо? Снова обрезать?
Правильнее было бы так:
Не вызывается никакая внешняя утилита, да и безопаснее в разы, в плане наличия багов если у файла будет какое-то корявое имя.
Перлов конечно много встречается, но это прям основные. Если что-то еще экстренно вспомню, закину в комментарии. Ну либо ты закидывай, мы всегда рады твоей активности!
Обещал на выходные тебя не беспокоить, но видимо не получится. Так, что увидимся совсем скоро. Хороших тебе предстоящих выходных и береги себя!
tags: #bash #кодревью
—
💩 @bashdays
Оно конечно работает правильно. Но бывалый глаз сразу ощутит жопный дискомфорт глядя на такие конструкции.
Кстати я всегда придерживаюсь правила — одну задачу можно решить разными способами. Работает, да и пёс с ним. Но учить такому других, увы непозволительно, пусть лучше сразу правильно делают. Нормально делай, нормально будет.
Поехали!
cat bashdays.txt | cut -f 2 -d ';'
В текстовом файле bashdays.txt у меня забита строка: hello;world. Далее команда cat читает этот файл и перенаправляет данные на утилиту cut с помощью pipe «|». А cut уже режет строку по символу «;» и отдает мне второй элемент. То есть на выходе я получу: «world».
Но. Утилита cut сама умеет читать файлы. Проще говоря так:
cut -f 2 -d ';' bashdays.txt
Сюда можно приплести и grep, с которым обычно делают так:
cat bashdays.txt | grep "world"
Это прям любимый паттерн всех, забит в днк, даже я этим порой грешу. Это как на велосипеде, один раз научился, больше не разучишься. А по хорошему надо делать так:
grep "world" bashdays.txt
Ну и к примеру еще такое встречается часто:
cat bashdays.txt | tr 'a-z' 'A-Z'
Суть одна, cat передает данные в tr, а дальше они конвертятся в верхний регистр и выводятся на экран. По хорошему это было бы так:
tr 'a-z' 'A-Z' < bashdays.txt
Но опять же для кого по-хорошему? Мне привычнее вариант с cat, хз, переучиваться я уж точно не буду.
А еще из любимого, это циклы, ща покажу:
for s in $(ls)
do
echo "$s"
done
Это цикл, который перебирает файлы. Тут вообще зачем-то используется вызов внешней утилиты ls, хотя она тут вообще не упёрлась. Да и если такое использовать в скриптах, вылезут баги.
Например, создай такой файл:
touch "*"
И заново запусти этот цикл. ООйой… заметил прикол? Вывод продублировал все имена файлов. Вот тебе и баг, а потом сиди полдня, думай, что же оно не работает.
Этот костыль можно и перекостылисть, указав утилите ls параметр -Q. Тогда утилита ls тепло обнимет кавычками все имена файлов. Но это лишние кавычки, потом их чо? Снова обрезать?
Правильнее было бы так:
for s in ./*; do echo "$s"; done
Не вызывается никакая внешняя утилита, да и безопаснее в разы, в плане наличия багов если у файла будет какое-то корявое имя.
Перлов конечно много встречается, но это прям основные. Если что-то еще экстренно вспомню, закину в комментарии. Ну либо ты закидывай, мы всегда рады твоей активности!
Обещал на выходные тебя не беспокоить, но видимо не получится. Так, что увидимся совсем скоро. Хороших тебе предстоящих выходных и береги себя!
tags: #bash #кодревью
—
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
Привет, тут на днях в нашем чатике пролетала софтина которая делает этакий ханипот на 22 порту. И все кто ломится по ssh просто вязнут в этом болоте.
Но сегодня не про это. Сегодня про злоумышленников, которые методом тыка пытаются найти и украсть бэкап. Зачастую бэкапы хранятся в папках проекта, либо вообще в корне пылятся годами.
Как это бывает: переезжаешь на другой сервер, перетащил проект в zip архиве, распаковал, а сам zip не удалил. И теперь любой кто узнает имя архива, сможет его скачать, со всеми паролями и явками. Ну либо как в распространенных движках, есть всем известная папка, где могут находиться эти бэкапы.
Вообще руками имена файлов никто не подбирает, для этого есть специальный софт, который просто брутфорсит по словарю всевозможные локейшены и если получает статус 200, то скачивает всё, что плохо лежит.
Как с этим бороться? Ничего не бэкапить в папки проекта, удалять промежуточные файлы если что-то переносил, настраивать политики nginx чтобы 403 отдавал и т.п.
Но есть способ сделать простой ханипот. Злоумышленник якобы находит бэкап, получает статус 200 и начинает его скачивать. Естественно это не бэкап, а специально подготовленный файл большого размера. Причем такой файл отдается специально с пониженной скоростью и санкциями.
Повторюсь, маловероятно, что злоумышленник это человек. В основном сбором бигдаты занимается автоматизированный софт. Устанавливается на уже скомпрометированные машины, с которых осуществляется сканирование каталогов на наличие плохо лежащих файлов.
Давай настроем такой ханипот на примере nginx
Добавляем в nginx конфиги:
Указываем список на что будем триггериться. Ограничиваем скорость, ограничиваем число потоков, запрещаем докачку.
Создаем файл затычку размером 1гиг, этого вполне хватит. Но можешь конечно сделать и больше.
Вот и всё. Теперь если кто-то попытается вытянуть у тебя бэкап к примеру mysql.tar.gz, то будет страдать. Идея думаю тебе понятна, вокруг нее можно городить вообще сумасшедшие схемы. Но опять же это всего лишь концепт, из которого можно сделать что-то большое и нужное.
Я одно время применял этот способ в случае, когда коллеги просят выдать бэкап базы. Обычно я даю прямую ссылку на скачивание. Но бывают ситуации, когда разработчики ведут себя как зажравшиеся ЧСВешные мудаки. И на такой случай у меня для них была специальная ссылка для скачивания бэкапа.
Ничего особенного, но с сюрпризом, бэкап никогда не скачается. Тащить 10 гигабайт со скоростью dial-up ну такое себе. А когда те начинали орать как свинья из avp, мой ответ был простой - проблема на твоей стороне. У меня видишь все работает и показываю скриншот с нормальной скоростью.
Но таким быть фу, заподлостроением пусть школьники занимаются. Мы с вами взрослые и ответственные ребята. Правда? )
Ладно, рад всех видеть. Всем хорошей рабочей недели!
tags: #nginx #networks
—
💩 @bashdays
Но сегодня не про это. Сегодня про злоумышленников, которые методом тыка пытаются найти и украсть бэкап. Зачастую бэкапы хранятся в папках проекта, либо вообще в корне пылятся годами.
Как это бывает: переезжаешь на другой сервер, перетащил проект в zip архиве, распаковал, а сам zip не удалил. И теперь любой кто узнает имя архива, сможет его скачать, со всеми паролями и явками. Ну либо как в распространенных движках, есть всем известная папка, где могут находиться эти бэкапы.
Вообще руками имена файлов никто не подбирает, для этого есть специальный софт, который просто брутфорсит по словарю всевозможные локейшены и если получает статус 200, то скачивает всё, что плохо лежит.
Как с этим бороться? Ничего не бэкапить в папки проекта, удалять промежуточные файлы если что-то переносил, настраивать политики nginx чтобы 403 отдавал и т.п.
Но есть способ сделать простой ханипот. Злоумышленник якобы находит бэкап, получает статус 200 и начинает его скачивать. Естественно это не бэкап, а специально подготовленный файл большого размера. Причем такой файл отдается специально с пониженной скоростью и санкциями.
Повторюсь, маловероятно, что злоумышленник это человек. В основном сбором бигдаты занимается автоматизированный софт. Устанавливается на уже скомпрометированные машины, с которых осуществляется сканирование каталогов на наличие плохо лежащих файлов.
Давай настроем такой ханипот на примере nginx
Добавляем в nginx конфиги:
location ~* "^/(new|old|bkup|tmp|temp|upload|ftp|sql|file|www|drupal|joomla|wordpress|x|user|admin|a|b|r|rezerv|arch|arx|111|archive|auth|backup|clients|com|dat|dump|engine|files|home|html|index|master|media|my|mysql|old|site|sql|website|wordpress)\.tar.gz$" {
access_log /var/log/nginx/honeypot.log;
default_type application/zip;
root /var/www/bashdayz/files/backup;
rewrite ^(.*)$ /backup break;
max_ranges 0;
limit_rate 4k;
limit_conn addr 1;
}
# а это в секцию http
limit_conn_zone $binary_remote_addr zone=addr:10m;
Указываем список на что будем триггериться. Ограничиваем скорость, ограничиваем число потоков, запрещаем докачку.
Создаем файл затычку размером 1гиг, этого вполне хватит. Но можешь конечно сделать и больше.
dd if=/dev/zero of=/var/www/bashdayz/files/backup bs=1G count=1
Вот и всё. Теперь если кто-то попытается вытянуть у тебя бэкап к примеру mysql.tar.gz, то будет страдать. Идея думаю тебе понятна, вокруг нее можно городить вообще сумасшедшие схемы. Но опять же это всего лишь концепт, из которого можно сделать что-то большое и нужное.
Я одно время применял этот способ в случае, когда коллеги просят выдать бэкап базы. Обычно я даю прямую ссылку на скачивание. Но бывают ситуации, когда разработчики ведут себя как зажравшиеся ЧСВешные мудаки. И на такой случай у меня для них была специальная ссылка для скачивания бэкапа.
Ничего особенного, но с сюрпризом, бэкап никогда не скачается. Тащить 10 гигабайт со скоростью dial-up ну такое себе. А когда те начинали орать как свинья из avp, мой ответ был простой - проблема на твоей стороне. У меня видишь все работает и показываю скриншот с нормальной скоростью.
Но таким быть фу, заподлостроением пусть школьники занимаются. Мы с вами взрослые и ответственные ребята. Правда? )
Ладно, рад всех видеть. Всем хорошей рабочей недели!
tags: #nginx #networks
—
Please open Telegram to view this post
VIEW IN TELEGRAM
Привет. Разгребал тут мамонтовский сервер и нашел исходник с таким артом.
Думаешь это всего лишь картинка из архивов старого фидошника? Нифига, это Acme EyeDrops. Visual Programming in Perl.
В арте зашит вполне рабочий perl код. Если сохранить эту картинку в файл и затем выполнить его через интерпретатор, ты получишь секретное сообщение.
Сам код этого арта, сгенерирован с помощью модуля Acme::EyeDrops. Кстати на странице модуля много примеров с такими картинками (верблюды, морды, заборы, снежинки), каждая выполняет какое-то своё действие + есть примеры генераторов.
А вот эта команда, превратит файл обратно в исходник. То есть выведет исходный код вместо того, чтобы его выполнить.
Опять же не знаю, что ты будешь делать с этой информацией. Говорят что perl давно мёртв, но в современных скриптах и решениях люди любят его применять. ХЗ почему, наверное потому что perl есть везде. Хотя сейчас глянул, последний релиз был 2024-01-20, версия 5.39.7 (devel), капец, оно живое.
Первое и последнее, что я делал на perl, это был вывод «Hello World», на этом моё знакомство с ним закончилось. Даже на СИ порог вхождения мне легче показался, хотя по СИ у меня была книга, а по perl только какие-то огрызки из фидонета.
Ладно. Побежали дальше мир спасать от криворучек. Увидимся!
А ты применяешь perl в современном мире? Если да, поделись пожалуйста в комментариях, как и где. Очень интересно.
tags: #linux
—
💩 @bashdays
Думаешь это всего лишь картинка из архивов старого фидошника? Нифига, это Acme EyeDrops. Visual Programming in Perl.
В арте зашит вполне рабочий perl код. Если сохранить эту картинку в файл и затем выполнить его через интерпретатор, ты получишь секретное сообщение.
perl ./pokazisiski.pl
Сам код этого арта, сгенерирован с помощью модуля Acme::EyeDrops. Кстати на странице модуля много примеров с такими картинками (верблюды, морды, заборы, снежинки), каждая выполняет какое-то своё действие + есть примеры генераторов.
А вот эта команда, превратит файл обратно в исходник. То есть выведет исходный код вместо того, чтобы его выполнить.
perl -MO=Deparse ./pokazisiski.pl
Опять же не знаю, что ты будешь делать с этой информацией. Говорят что perl давно мёртв, но в современных скриптах и решениях люди любят его применять. ХЗ почему, наверное потому что perl есть везде. Хотя сейчас глянул, последний релиз был 2024-01-20, версия 5.39.7 (devel), капец, оно живое.
Первое и последнее, что я делал на perl, это был вывод «Hello World», на этом моё знакомство с ним закончилось. Даже на СИ порог вхождения мне легче показался, хотя по СИ у меня была книга, а по perl только какие-то огрызки из фидонета.
Ладно. Побежали дальше мир спасать от криворучек. Увидимся!
А ты применяешь perl в современном мире? Если да, поделись пожалуйста в комментариях, как и где. Очень интересно.
tags: #linux
—
Please open Telegram to view this post
VIEW IN TELEGRAM
Привет. Немного терминальной развлекухи :
А тут и тут можешь посмотреть исходники этих проектов. Там еще много подобных curl запросов можно понаделать с котиками, пончиками, бэтменами. А еще можно поставить себе на сервер и устраивать консольные вечеринки.
tags: #linux
—
💩 @bashdays
curl ascii.live/parrot
curl ascii.live/forrest
curl ascii.live/can-you-hear-me
curl parrot.live
А тут и тут можешь посмотреть исходники этих проектов. Там еще много подобных curl запросов можно понаделать с котиками, пончиками, бэтменами. А еще можно поставить себе на сервер и устраивать консольные вечеринки.
tags: #linux
—
Please open Telegram to view this post
VIEW IN TELEGRAM