Привет. Вчера в моём ДЗЕНе задали вопрос: Роман, а как скачать файл, не имея под рукой 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, так как возможен конфликт с дескрипторами, которые используются внутри оболочки.

Роман Шубин
Роман Шубин
CEO & CTO, Главред в «Цифровой улей»
Задать вопрос
К сожалению, для HTTPS такое провернуть не получится: возникнут проблемы. Прямой обмен данными через сокеты не предусматривает обработку SSL/TLS.

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

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