5 способов загрузки файлов через терминал Linux (кроме curl и wget)

5 способов загрузки файлов через терминал Linux (кроме curl и wget)


Вы когда-нибудь застревали в системе, не имея возможности отправить простой HTTP-запрос? Возможно, вы пытались спасти систему или создать образ Docker. Иногда нужно использовать доступные инструменты; в других случаях это просто любопытство. У меня есть пять способов подключаться и загружать файлы через HTTP.

Сначала поймите необходимый HTTP-заголовок

Для установления HTTP-соединений часто необходимо отправлять HTTP-заголовок. Для некоторых из приведенных ниже команд вам нужно будет создать его вручную, но это несложно.

HTTP-заголовок — это небольшой блок текста, который настраивает HTTP-соединение. В большинстве приведённых ниже примеров HTTP-заголовок будет выглядеть следующим образом:

GET / HTTP/1.1rn HOST: example.comrn rn     

Первая строка называется строкой запроса, и она сообщает клиенту получить что-либо по указанному пути. Путь — это всё, что идет после .com, .net и т.д. в URL — например, example.com/path/foo.

  • Строка HOST указывает имя хоста, к которому мы подключаемся.
  • Каждая строка заканчивается явным возвратом каретки () и новой строкой (n). Весь заголовок заканчивается пустой строкой.

Заголовок, показанный выше, получает основной документ на сайте example.com (путь «/»). Теперь, когда вы понимаете HTTP-заголовок, вы можете использовать его с некоторыми из следующих команд.

Telnet, но он работает только с обычными HTTP-соединениями

Следующая команда выглядит странно, но на самом деле мы создаём пользовательский HTTP-заголовок, потому что Telnet не является HTTP-клиентом. Скобки обозначают подсистему (subshell), и каждая команда — разделённая точкой с запятой — выполняется и поочередно передаётся через конвейер в Telnet.

(echo "GET / HTTP/1.0"; echo "Host: example.com"; echo; sleep 1) | telnet example.com 80     

Например, если вы выполните следующее в вашем терминале, вы увидите, что grep получает каждую строку по отдельности:

(echo foobar; sleep 1; echo foobaz) | grep foo     

Для Telnet это означает, что он получает каждую строку в HTTP-заголовке по отдельности, как поток данных. Команда также отправляет пустую строку (эхо), чтобы завершить соединение, а затем ждет 1 секунду, давая серверу достаточно времени для ответа. Такой подход к ожиданию ненадежен, так как мы только предполагаем, сколько времени потребуется на ответ. Возможно, вам придется скорректировать это значение, если соединение закрывается слишком рано.

Telnet не может использовать TLS, поэтому это будет работать только для обычных HTTP-соединений.

HTTP/1.0 автоматически закрывает соединение после ответа сервера, тогда как HTTP/1.1 этого не делает. Поэтому мы используем HTTP/1.0, потому что Telnet ненадежен для загрузки больших файлов по HTTP, и нам не нужно, чтобы соединение оставалось открытым.

Вы можете установить Telnet на Fedora, используя следующую команду:

sudo dnf install telnet -y     

Для Debian и подобных ему систем введите следующую команду:

sudo apt install telnet -y     

Для пользователей Arch вам не повезло. Telnet недоступен в официальных репозиториях. Однако PuTTY доступен, так что вы можете использовать его вместо этого.

sudo pacman -S putty      

Netcat немного лучше, чем Telnet

Для установки HTTP-соединений команда Netcat работает почти так же, как команда Telnet, за исключением того, что мы передаем ей HTTP-заголовок как один блок текста. Из приведенных выше и ниже примеров видно, что каждая строка в HTTP-заголовке оканчивается управляющими символами «» — для последней строки они удваиваются, чтобы сигнализировать об окончании заголовка.

Ни один из приведённых ниже примеров (Netcat или Ncat) не является надёжным для загрузки больших файлов, но они легко справятся с загрузкой небольших файлов.

Простой HTTP

Netcat не поддерживает TLS (HTTPS), но мы можем использовать его для получения обычного HTTP.

printf "GET / HTTP/1.0rnHost: example.comrnrn" | nc example.com 80     

Вы можете установить Netcat на Fedora с помощью следующей команды:

sudo dnf install netcat -y     

Для Debian и аналогичных систем выполните следующую команду:

sudo apt install netcat-openbsd -y     

Для пользователей Arch Netcat доступен в дополнительном репозитории:

sudo pacman -S openbsd-netcat      

С TLS

Если вы хотите подключиться через TLS-соединение, вам нужно будет использовать Ncat, усовершенствованную версию Netcat, которая является частью проекта Nmap. Ncat также может устанавливать обычные HTTP-соединения.

printf "GET / HTTP/1.1rnHost: example.comrnrn" | ncat --ssl example.com 443     

Вы можете установить Ncat на Fedora, используя следующую команду:

sudo dnf install nmap-ncat -y     

Для Debian и аналогичных систем выполните следующую команду:

sudo apt install ncat -y     

Для пользователей Arch Ncat является частью пакета Nmap, поэтому следует ввести следующую команду:

sudo pacman -S nmap      

Когда вы в отчаянии, используйте библиотеку Requests для Python

Следующая команда хорошо работает с обычным текстом или HTML-файлами, но некорректно обрабатывает бинарные данные (например, изображения, архивы и т.д.).

python3 -c "import requests; print(requests.get('http://example.com').text)"     

Чтобы правильно загрузить бинарные данные, такие как изображения или zip-файлы, используйте следующую команду:

python3 -c "import requests; open('output_file.zip','wb').write(requests.get('http://example.com/file.zip').content)"     

Измените «output_file.zip» и URL.

Хотя на большинстве систем, вероятно, уже установлен Python 3 (и pip), библиотеку requests нужно установить отдельно. Вы можете установить её либо с помощью pip, либо через менеджер пакетов вашей операционной системы.

Если у вас нет административных привилегий, вы можете установить его в домашний каталог пользователя с помощью pip. Введите следующую команду:

pip install --user requests     

Вы можете установить requests через пакетный менеджер Fedora, используя следующую команду:

sudo dnf install python3-requests -y     

Для Debian и аналогичных систем выполните следующую команду:

sudo apt install python3-requests -y     

Для Arch введите следующую команду:

sudo pacman -S python-requests      

HTTPie: Удобная утилита

HTTPie описывает себя как инструмент для тестирования REST API (сервисов для веб-страниц). Следующая команда выполняет простой запрос для получения HTML-документа, находящегося на example.com:

http GET example.com     

HTTPie поддерживает несколько удобных функций, которые делают написание URL немного проще. Например, следующая команда подключится к серверу, который размещен локально на вашей системе на порту 3000:

http :3000     

Добавление параметров к URL так же просто, как использование двойного знака равенства:

http httpbin.org/anything foo==bar     

Это создаст URL, который будет выглядеть как http://httpbin.org/anything?foo=bar.

Чтобы установить HTTPS-соединение, используйте следующую команду:

https GET example.com     

Хотя HTTPie в первую очередь предназначен для помощи разработчикам, он также отлично работает как обычный HTTP-клиент, что делает его идеальным для скачивания файлов.

Вы можете установить HTTPie на Fedora, используя следующую команду:

sudo dnf install httpie -y     

Для Debian и аналогичных систем выполните следующую команду:

sudo apt install httpie -y     

Для Arch введите следующую команду:

sudo pacman -S httpie      

Aria2: Швейцарский нож для сети

Aria2 — это мощная программа для загрузки файлов через терминал. Она поддерживает множество протоколов, включая HTTP, HTTPS, FTP, SFTP, BitTorrent, WebSocket и другие. Также она ускоряет загрузку, создавая несколько параллельных соединений. Чтобы скачать файл, просто укажите директорию с помощью флага «-d» и имя выходного файла с помощью флага «-o».

aria2c -d /tmp -o test.html http://example.com     

Aria2 работает без усилий с HTTP, HTTPS, загружая HTML-документы и файлы.

Вы можете установить aria2 на Fedora, используя следующую команду:

sudo dnf install aria2 -y     

Для Debian и аналогичных систем выполните следующую команду:

sudo apt install aria2 -y     

Для Arch введите следующую команду:

sudo pacman -S aria2     

Из-за неправильной обработки HTTP команды Telnet и Netcat работают только с файлами размером не более нескольких килобайт. Чтобы скачать более крупные файлы, вам нужно использовать полноценный HTTP-клиент. Команды Python, HTTPie и aria2 функционируют как настоящие HTTP-клиенты. Чтобы определить, используете ли вы настоящий HTTP-клиент, спросите себя, нужно ли вручную добавлять HTTP-заголовки; если да, вероятно, вы не используете настоящий HTTP-клиент.

На практике Telnet и Netcat в основном используются как аварийные инструменты: полезны, когда нужно проверить соединение, но нет специализированных инструментов. По крайней мере, они дают интересное введение в низкоуровневые аспекты HTTP-соединения.

Если вы хотите узнать больше о Telnet, вы можете прочитать нашу статью о различиях между Telnet и SSH. Или же, у нас есть другая статья, в которой подробно рассматриваются несколько других сценариев использования Netcat. Наконец, у нас есть подробное руководство о том, как использовать HTTPie, что является очень интересной утилитой.

Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *