Найти в Дзене
BASH DAYS | Linux Factory

Как скачать файл через TCP запрос без curl/wget на чистом bash

Оглавление

Сегодня разберемся, как скачать файл не имея под рукой 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 (сокет) после завершения операции чтения данных. Можно не закрывать и оставить портал в ад открытым.

Подпишись на BashDays в телеграм


Ну и все. Файл скачали, получили Success!

Почему я выбрал файловый дескриптор с индексом 3? Ну вообще 0 = stdin, 1 = stdout, 2 = stderr. Короче 0, 1, 2 зарезервированы, а я просто взял следующий.

Но вообще в манах bash рекомендуют быть осторожным в использовании дескрипторов больше 9ти. Так как возможен конфликт с дескрипторами, которые используются внутри оболочки.

К сожалению для https такое провернуть не получится, возникнут проблемы. Прямой обмен данными через сокеты не предусматривают обработку SSL/TLS.

Такие дела, вряд ли ты это будешь где-то применять. Но обладая такими знаниями, ты постигаешь то, чего никогда не постигнут другие.

В общем не болей, увидимся!

Рекомендую почитать