eFusion 23 марта 2020

10 примеров использования wget

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

Что такое 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.

Еще вам могут быть интересны следующие публикации:

Источники

МЕРОПРИЯТИЯ

Комментарии

ВАКАНСИИ

Добавить вакансию

ЛУЧШИЕ СТАТЬИ ПО ТЕМЕ