Знакомимся на практике с wget – популярной утилитой командной строки *nix-систем для извлечения содержимого из интернета.

Что такое wget?
Wget – свободная утилита, предоставляющая неинтерактивный способ загрузки файлов из интернета
по HTTPS, HTTP, FTP и даже HTTP-прокси.
Вы можете запустить wget в фоновом режиме, а он доделает
всю назначенную работу. Обычно утилиту используют для получения всего веб-сайта,
перехода по ссылкам на страницах XHTML/HTML и создания локальной версии сайта.
Синтаксис wget выглядит так:
wget [option] [URL]
1. Скачивание страницы
Попробуем загрузить
страницу github.com:
wget github.com
Если все подключилось,
то wget загрузит домашнюю страницу и покажет результат, как показано ниже:
wget github.com
URL transformed to HTTPS due to an HSTS policy
--2020-02-23 10:45:52-- https://github.com/
Resolving github.com (github.com)... 140.82.118.3
Connecting to github.com (github.com)|140.82.118.3|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: unspecified [text/html]
Saving to: ‘index.html’
index.html [ <=> ] 131.96K --.-KB/s in 0.04s
2020-02-23 10:45:52 (2.89 MB/s) - ‘index.html’ saved [135126]
2. Скачивание нескольких
файлов
Круто, если можно
загрузить сразу несколько файлов. Это, кстати, идея для написания какого-нибудь
скрипта для автоматизации загрузки файлов, подумайте на досуге.
Попробуем скачать
архивы с Python 3.8.1 и 3.5.1:
wget https://www.python.org/ftp/python/3.8.1/Python-3.8.1.tgz https://www.python.org/ftp/python/3.5.1/Python-3.5.1.tgz
Как вы уже догадались,
синтаксис такой:
wget URL1 URL2 URL3
Не забывайте про пробел
между ссылками!
3. Ограничение скорости
загрузки
Ограничить скорость загрузки полезно,
когда стоит задача проверить, сколько времени занимает загрузка файла на разной
пропускной способности.
Используя опцию --
, вы можете ограничить скорость загрузки.
limit-rate
Вот результат загрузки
файла Node.js:
wget https://nodejs.org/dist/v12.16.1/node-v12.16.1-linux-x64.tar.xz
--2020-02-23 10:59:58-- https://nodejs.org/dist/v12.16.1/node-v12.16.1-linux-x64.tar.xz
Resolving nodejs.org (nodejs.org)... 104.20.23.46, 104.20.22.46, 2606:4700:10::6814:162e, ...
Connecting to nodejs.org (nodejs.org)|104.20.23.46|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 14591852 (14M) [application/x-xz]
Saving to: ‘node-v12.16.1-linux-x64.tar.xz’
node-v12.16.1-linux-x64.tar.xz 100%[===========================================================================================>] 13.92M --.-KB/s in 0.05s
2020-02-23 10:59:58 (272 MB/s) - ‘node-v12.16.1-linux-x64.tar.xz’ saved [14591852/14591852]
Потребовалось 0.05 с, чтобы скачать 13.92 Мб. Теперь попробуем ограничить скорость до 500 Кб/с:
wget --limit-rate=500k https://nodejs.org/dist/v12.16.1/node-v12.16.1-linux-x64.tar.xz
--2020-02-23 11:00:18-- https://nodejs.org/dist/v12.16.1/node-v12.16.1-linux-x64.tar.xz
Resolving nodejs.org (nodejs.org)... 104.20.23.46, 104.20.22.46, 2606:4700:10::6814:162e, ...
Connecting to nodejs.org (nodejs.org)|104.20.23.46|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 14591852 (14M) [application/x-xz]
Saving to: ‘node-v12.16.1-linux-x64.tar.xz.1’
node-v12.16.1-linux-x64.tar.xz.1 100%[===========================================================================================>] 13.92M 501KB/s in 28s
2020-02-23 11:00:46 (500 KB/s) - ‘node-v12.16.1-linux-x64.tar.xz.1’ saved [14591852/14591852]
Скорость загрузки упала
до 28 с. Представьте себе ситуацию – юзеры жалуются на медленную загрузку.
Вы можете быстро поиграться с limit-rate
для имитации проблемы.
4. Загрузка в фоне
Загрузка больших файлов
может занять некоторое время, но что если вы не хотите смотреть в терминал?
Можно использовать ключ
-b
, чтобы запустить wget в фоновом режиме:
wget -b https://slack.com
Continuing in background, pid 25430.
Output will be written to ‘wget-log.1’.
5. Игнорирование ошибки
сертификата
Игнорирование ошибки сертификата удобно, когда вам
нужно обратиться к узлу во внешней сети без соответствующего сертификата. Если сертификат не является валидным, по
умолчанию wget
выдаст ошибку.
wget https://expired.badssl.com/
--2020-02-23 11:24:59-- https://expired.badssl.com/
Resolving expired.badssl.com (expired.badssl.com)... 104.154.89.105
Connecting to expired.badssl.com (expired.badssl.com)|104.154.89.105|:443... connected.
ERROR: cannot verify expired.badssl.com's certificate, issued by ‘CN=COMODO RSA Domain Validation Secure Server CA,O=COMODO CA Limited,L=Salford,ST=Greater Manchester,C=GB’:
Issued certificate has expired.
To connect to expired.badssl.com insecurely, use `--no-check-certificate'.
На примере выше результат истекшего срока действия сертификата. Предлагается использовать
--no-check-certificate
для игнорирования любой проверки сертификата. Сравним результат с добавленным ключом:
wget https://untrusted-root.badssl.com/ --no-check-certificate
--2020-02-23 11:33:45-- https://untrusted-root.badssl.com/
Resolving untrusted-root.badssl.com (untrusted-root.badssl.com)... 104.154.89.105
Connecting to untrusted-root.badssl.com (untrusted-root.badssl.com)|104.154.89.105|:443... connected.
WARNING: cannot verify untrusted-root.badssl.com's certificate, issued by ‘CN=BadSSL Untrusted Root Certificate Authority,O=BadSSL,L=San Francisco,ST=California,C=US’:
Self-signed certificate encountered.
HTTP request sent, awaiting response... 200 OK
Length: 600 [text/html]
Saving to: ‘index.html.6’
index.html.6 100%[===========================================================================================>] 600 --.-KB/s in 0s
2020-02-23 11:33:45 (122 MB/s) - ‘index.html.6’ saved [600/600]
6. Заголовок HTTP ответа
С помощью ключа -S
в
терминал будет выведен заголовок, как это произошло с Яндексом:
wget -S --no-check-certificate https://www.yandex.ru
--2020-03-20 02:52:16-- https://www.yandex.ru/
Resolving www.yandex.ru (www.yandex.ru)... 149.5.244.14, 80.239.201.15
Connecting to www.yandex.ru (www.yandex.ru)|149.5.244.14|:443... connected.
HTTP request sent, awaiting response...
HTTP/1.1 200 Ok
Accept-CH: Viewport-Width, DPR, Device-Memory, RTT, Downlink, ECT
Accept-CH-Lifetime: 31536000
Cache-Control: no-cache,no-store,max-age=0,must-revalidate
Content-Length: 199540
Content-Type: text/html; charset=UTF-8
Date: Thu, 19 Mar 2020 23:52:49 GMT
Expires: Thu, 19 Mar 2020 23:52:50 GMT
Last-Modified: Thu, 19 Mar 2020 23:52:50 GMT
P3P: policyref="/w3c/p3p.xml", CP="NON DSP ADM DEV PSD IVDo OUR IND STP PHY PR E NAV UNI"
Set-Cookie: yp=1587253970.ygu.1; Expires=Sun, 17-Mar-2030 23:52:49 GMT; Domain =.yandex.ru; Path=/
Set-Cookie: mda=0; Expires=Fri, 17-Jul-2020 23:52:49 GMT; Domain=.yandex.ru; P ath=/
Set-Cookie: yandex_gid=213; Expires=Sat, 18-Apr-2020 23:52:49 GMT; Domain=.yan dex.ru; Path=/
X-Content-Type-Options: nosniff
X-Frame-Options: DENY
X-Yandex-Sdch-Disable: 1
7. Манипуляции с
User-Agent
Бывает так, что мы хотим открыть сайт с помощью другого user-agent
. Это можно сделать, указав ключ --user-agent
:
wget https://gf.dev --user-agent="MyCustomUserAgent"
8. Заголовок хоста
Когда приложение находится
в разработке и есть необходимость что-то потестить, но нет подходящего
URL-адреса или мы хотим протестировать домен с использованием IP-адреса – в обеих ситуациях будет полезен --header
.
Для примера возьмем
http://10.10.10.1
и application.com
в качестве заголовка:
wget --header="Host: application.com" http://10.10.10.1
9. Подключение через
прокси
Если вы работаете в
среде DMZ, вас может не выпускать в интернет. Воспользуйтесь преимуществами
прокси для подключения:
wget -e use_proxy=yes http_proxy=$PROXYHOST:PORT http://externalsite.com
Не забудьте в
переменной $PROXYHOST:PORT
указать реальные значения.
10. Подключение через TLS
Обычно рекомендуют
использовать OpenSSL для тестирования протокола TLS. Но можете использовать и
wget
.
wget --secure-protocol=TLSv1_2 https://example.com
Вышеизложенное заставит
wget
подключиться через TLS 1.2.
Заключение
Если вам интересно подробнее разобраться в утилите, имеется перевод документации wget на русский. В некоторых случаях хорошей альтернативой wget является cURL, а для создания зеркал сайтов (чего cURL не умеет) обычно используется rsync.
Еще вам могут быть интересны следующие публикации:
Источники
Специально для сайта ITWORLD.UZ. Новость взята с сайта Библиотека программиста