Привет. Вчера в моём ДЗЕНе задали вопрос - Роман, а как скачать файл не имея под рукой curl/wget, а прям средствами bash? Видимо придется тему продолжить. Сегодня рассмотрим как такое осуществить.



Есть у меня файл который лежит тут. Нам нужно его как-то хитро скачать. Будем использовать сокеты.



Накидываем скрипт



#!/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



💩 @bashdays