10 основных wget команд, чтобы скачать сайт и не только

wget - это популярная утилита командной строки Unix / Linux для извлечения контента из интернета. Он бесплатный и предоставляет способ загрузки файлов из интернета через терминал. Команда wget поддерживает протоколы HTTPS, HTTP и FTP из коробки. Более того, вы также можете использовать HTTP прокси.

Как он поможет вам устранить неполадки?

Есть много способов.

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

wget неинтерактивен, что означает, что вы можете запускать его в фоновом режиме, даже если вы вышли из системы. Может быть много случаев, когда вам необходимо отключиться от системы, даже когда вы извлекаете файлы из Интернета. В фоновом режиме, wget будет работать пока не закончит назначенную работу.

Он также может быть использован для получения всего сайта на ваших локальных компьютерах. Он может следовать ссылкам на страницах XHTML и HTML для создания локальной версии. Для этого wget должен загрузить страницу рекурсивно. Это очень полезно, поскольку вы можете использовать его для загрузки важных страниц или сайтов для просмотра в автономном режиме.

Если вы любитель Linux, советуем прочитать об 11 команд на Linux для работы в качестве системного администратора.

Давайте посмотрим wget в действии. Синтаксис wget приведен ниже.

wget [option] [URL]

1. Скачать веб-страницу

Попробуем скачать страницу. Например: stackoverflow.com

wget stackoverflow.com

Если соединение с интернетом установлено, он загрузит домашнюю страницу и покажет вывод, как показано ниже.

root@user:~# wget stackoverflow.com
URL transformed to HTTPS due to an HSTS policy
--2020-02-25 09:53:28--  https://stackoverflow.com/
Распознаётся stackoverflow.com (stackoverflow.com)… 151.101.129.69, 151.101.193.69, 151.101.1.69, ...
Подключение к stackoverflow.com (stackoverflow.com)|151.101.129.69|:443... соединение установлено.
HTTP-запрос отправлен. Ожидание ответа… 200 OK
Длина: 112371 (110K) [text/html]
Сохранение в: «index.html»

index.html          100%[===================>] 109,74K   408KB/s    за 0,3s    

2020-02-25 09:53:29 (408 KB/s) - «index.html» сохранён [112371/112371]

root@user:~#

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

Вы просто должны обеспечить пространство (пробел) между URL-адресами.

3. Ограничить скорость загрузки

Иногда бывает полезным когда вы хотите проверить, сколько времени занимает загрузка файла с другой пропускной способностью.

Используя параметр --limit-rate, вы можете ограничить скорость загрузки.

Вот результат загрузки Nodejs.

root@user:~# wget https://nodejs.org/dist/v12.16.1/node-v12.16.1-linux-x64.tar.xz
--2020-02-25 10:02:54--  https://nodejs.org/dist/v12.16.1/node-v12.16.1-linux-x64.tar.xz
Распознаётся nodejs.org (nodejs.org)… 104.20.22.46, 104.20.23.46, 2606:4700:10::6814:162e, ...
Подключение к nodejs.org (nodejs.org)|104.20.22.46|:443... соединение установлено.
HTTP-запрос отправлен. Ожидание ответа… 200 OK
Длина: 14591852 (14M) [application/x-xz]
Сохранение в: «node-v12.16.1-linux-x64.tar.xz»

node-v12.16.1-linux 100%[===================>]  13,92M  3,78MB/s    за 4,0s    

2020-02-25 10:02:58 (3,46 MB/s) - «node-v12.16.1-linux-x64.tar.xz» сохранён [14591852/14591852]

Загрузка файлов объемом 13,92 МБ заняла 4 секунды. Теперь давайте попробуем ограничить скорость до 500 КБ.

root@user:~# wget --limit-rate=500k https://nodejs.org/dist/v12.16.1/node-v12.16.1-linux-x64.tar.xz
--2020-02-25 10:04:45--  https://nodejs.org/dist/v12.16.1/node-v12.16.1-linux-x64.tar.xz
Распознаётся nodejs.org (nodejs.org)… 104.20.23.46, 104.20.22.46, 2606:4700:10::6814:172e, ...
Подключение к nodejs.org (nodejs.org)|104.20.23.46|:443... соединение установлено.
HTTP-запрос отправлен. Ожидание ответа… 200 OK
Длина: 14591852 (14M) [application/x-xz]
Сохранение в: «node-v12.16.1-linux-x64.tar.xz»

node-v12.16.1-linux 100%[===================>]  13,92M   522KB/s    за 28s     

2020-02-25 10:05:13 (503 KB/s) - «node-v12.16.1-linux-x64.tar.xz» сохранён [14591852/14591852]

Из-за уменьшение пропускной способности, скачивание файла заняло больше времени: 28 секунд. Представьте, ваши пользователи жалуются на медленную загрузку, и вы знаете, что их пропускная способность сети низкая. С помощью параметра  --limit-rate вы можете попытаться быстро смоделировать проблему.

4. Скачать в фоновом режиме

Загрузка больших файлов может занять много времени. Плюс если вы еще захотите ограничить скорость, как показано выше. Для того, чтобы долго не пялиться в терминал, в ожидании когда файлы загрузиться, можно проделать вес этот процесс в фоновом режиме.

Для этого вы можете использовать аргумент -b для запуска wget в фоновом режиме.

root@user:~# wget -b https://slack.com
Работа продолжается в фоновом режиме, pid 2450.
Выходные данные будут записаны в «wget-log».

root@user:~#

5. Игнорировать ошибку сертификата

Это удобно, когда вам нужно проверить веб-приложения, которые не имеют надлежащего сертификата. По умолчанию wget выдаст ошибку, если сертификат недействителен.

root@user:~# wget https://expired.badssl.com/
--2020-02-25 10:16:29--  https://expired.badssl.com/
Распознаётся expired.badssl.com (expired.badssl.com)… 104.154.89.105
Подключение к expired.badssl.com (expired.badssl.com)|104.154.89.105|:443... соединение установлено.
ОШИБКА: невозможно проверить сертификат expired.badssl.com, выпущенный «CN=COMODO RSA Domain Validation Secure Server CA,O=COMODO CA Limited,L=Salford,ST=Greater Manchester,C=GB»:
  Для запрошенного сертификата истёк срок действия.
Для небезопасного подключения к expired.badssl.com используйте параметр «--no-check-certificate».

Приведенный выше пример относится к URL-адресу, срок действия которого истек. Как вы можете видеть, он предложил использовать параметр --no-check-certificate который будет игнорировать любую проверку сертификата.

root@user:~# wget https://untrusted-root.badssl.com/ --no-check-certificate
--2020-02-25 10:19:34--  https://untrusted-root.badssl.com/
Распознаётся untrusted-root.badssl.com (untrusted-root.badssl.com)… 104.154.89.105
Подключение к untrusted-root.badssl.com (untrusted-root.badssl.com)|104.154.89.105|:443... соединение установлено.
ПРЕДУПРЕЖДЕНИЕ: невозможно проверить сертификат untrusted-root.badssl.com, выпущенный «CN=BadSSL Untrusted Root Certificate Authority,O=BadSSL,L=San Francisco,ST=California,C=US»:
  Обнаружен самостоятельно подписанный сертификат.
HTTP-запрос отправлен. Ожидание ответа… 200 OK
Длина: 600 [text/html]
Сохранение в: «index.html.1»

index.html.1        100%[===================>]     600  --.-KB/s    за 0s      

2020-02-25 10:19:35 (34,4 MB/s) - «index.html.1» сохранён [600/600]

Круто, не правда ли?

6. Заголовок ответа HTTP

Смотрите заголовок ответа HTTP любого сайта в терминале.

При использовании параметра -s, wget также покажет http заголовок страницы.

root@user:~# wget https://github.com -S
--2020-02-25 10:27:09--  https://github.com/
Распознаётся github.com (github.com)… 140.82.118.4
Подключение к github.com (github.com)|140.82.118.4|:443... соединение установлено.
HTTP-запрос отправлен. Ожидание ответа… 
  HTTP/1.1 200 OK
  Date: Tue, 25 Feb 2020 06:27:05 GMT
  Content-Type: text/html; charset=utf-8
  Server: GitHub.com
  Status: 200 OK
  Vary: X-PJAX, Accept-Encoding, Accept, X-Requested-With
  ETag: W/"a31adc71563b164fd0d33424f6a05a27"
  Cache-Control: max-age=0, private, must-revalidate
  Strict-Transport-Security: max-age=31536000; includeSubdomains; preload
  X-Frame-Options: deny
  X-Content-Type-Options: nosniff
  X-XSS-Protection: 1; mode=block
  Referrer-Policy: origin-when-cross-origin, strict-origin-when-cross-origin
  Expect-CT: max-age=2592000, report-uri="https://api.github.com/_private/browser/errors"
  Content-Security-Policy: default-src 'none'; base-uri 'self'; block-all-mixed-content; connect-src 'self' uploads.github.com www.githubstatus.com collector.githubapp.com api.github.com www.google-analytics.com github-cloud.s3.amazonaws.com github-production-repository-file-5c1aeb.s3.amazonaws.com github-production-upload-manifest-file-7fdce7.s3.amazonaws.com github-production-user-asset-6210df.s3.amazonaws.com wss://live.github.com; font-src github.githubassets.com; form-action 'self' github.com gist.github.com; frame-ancestors 'none'; frame-src render.githubusercontent.com; img-src 'self' data: github.githubassets.com identicons.github.com collector.githubapp.com github-cloud.s3.amazonaws.com *.githubusercontent.com customer-stories-feed.github.com spotlights-feed.github.com; manifest-src 'self'; media-src 'none'; script-src github.githubassets.com; style-src 'unsafe-inline' github.githubassets.com
  Age: 6
  Set-Cookie: _gh_sess=BnblGIPpIaiUhFIE4iTylHACRtS6%2By%2FDzdThgfcpqE3Uo2wXp7QTJXCCEpka72yAS6phLFfzozbmADCKcSutvPZxSj8UHP3ikTTu%2F8Cd3QbCXYqUBiVPWmYQ0gwhRfolv4K40c05eYXlNqBXNeYFvR7wb%2BEWIDSOMVUm0O81nMLiZZgYFfetyBTYuuLhwNAXc0WcT6nh8WBqyCj5lkSADBSRwbQrUeVjghqPRX4FfGrjtgJ3yjHlyjMZZKMGR8F34m6VebuIKcibRXT9oqkzCQ%3D%3D--3YFWMiCZ4m03WsdT--TOfg%2Fx7gnExjYz1UOV7kPg%3D%3D; Path=/; HttpOnly; Secure
  Set-Cookie: _octo=GH1.1.1883752978.1582612031; Path=/; Domain=github.com; Expires=Thu, 25 Feb 2021 06:27:11 GMT; Secure
  Set-Cookie: logged_in=no; Path=/; Domain=github.com; Expires=Thu, 25 Feb 2021 06:27:11 GMT; HttpOnly; Secure
  Accept-Ranges: bytes
  Transfer-Encoding: chunked
  X-GitHub-Request-Id: 0A3C:1C90:767DF5:B3C0FB:5E54BE3F
Длина: нет данных [text/html]
Сохранение в: «index.html.1»

index.html.1            [  <=>               ] 132,35K   507KB/s    за 0,3s    

2020-02-25 10:27:10 (507 KB/s) - «index.html.1» сохранён [135526]

7. Манипулировать User-Agent

Может возникнуть ситуация, когда вы захотите подключить сайт с помощью пользовательского агента User-Agent. Это выполнимо, если после URL-адреса, указать параметр --user-agent.

root@user:~# wget https://itgap.ru --user-agent="MyCustomUserAgent"

8. HTTP заголовоки

Когда приложение все еще находится в разработке, у вас может не быть правильного URL для его тестирования. Или, возможно, вы захотите протестировать отдельный экземпляр HTTP с использованием 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.