Одним із ключових інструментів, яким користуються системні адміністратори, є wget. Він стає особливо корисним при діагностиці та виправленні неполадок, пов’язаних з підключенням до Інтернету.
Що являє собою команда wget?
wget — це популярний утилітний інструмент командного рядка, розроблений для операційних систем Unix/Linux, який дозволяє отримувати різноманітний контент з мережі Інтернет. Цей безкоштовний інструмент надає можливість неінтерактивного завантаження файлів з Інтернету. Wget підтримує такі протоколи, як HTTPS, HTTP та FTP, “з коробки”. Також, є можливість використання HTTP-проксі.
Як wget допомагає у розв’язанні проблем?
Існує безліч способів застосування цієї команди.
Системні адміністратори часто працюють в терміналі, і коли виникають проблеми з веб-додатками, не завжди потрібно перевіряти всю сторінку; іноді достатньо протестувати з’єднання. Може виникнути потреба в перевірці внутрішніх веб-ресурсів або завантаженні окремої сторінки для аналізу її вмісту.
wget працює в неінтерактивному режимі, що дозволяє запускати його у фоновому процесі, навіть після того, як користувач вийде з системи. Часто трапляються ситуації, коли необхідно від’єднатися від системи, не перериваючи процес завантаження файлів. В цьому випадку wget продовжить свою роботу у фоновому режимі.
Крім цього, wget дає змогу отримати копію цілого веб-сайту на локальний комп’ютер. Він здатний переходити за посиланнями на сторінках HTML та XHTML, створюючи локальну версію сайту. Для цього потрібно запустити рекурсивне завантаження сторінок. Це дуже зручно, наприклад, для збереження важливих сторінок або цілих сайтів для перегляду в режимі офлайн.
Давайте розглянемо, як це працює на практиці. Синтаксис команди wget виглядає наступним чином:
wget [опція] [URL]
Завантаження веб-сторінки
Спробуємо завантажити певну веб-сторінку, наприклад, github.com:
wget github.com
Якщо з’єднання встановлено успішно, домашня сторінка буде завантажена, а результат відобразиться на екрані, як показано нижче:
[email protected]:~# 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] [email protected]:~#
Завантаження кількох файлів
Досить зручно, коли необхідно завантажити кілька файлів одночасно. Це дозволяє автоматизувати процес завантаження файлів за допомогою різних скриптів.
Спробуємо завантажити файли 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-адресами потрібно просто ставити пробіл.
Обмеження швидкості завантаження
Ця функція може знадобитися, коли потрібно перевірити, скільки часу займе завантаження файлу при різних швидкостях інтернет-з’єднання.
За допомогою опції `–limit-rate` можна обмежити швидкість завантаження.
Ось приклад завантаження файлу Nodejs:
[email protected]:~# 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]
Для завантаження файлу розміром 13,92 МБ знадобилося лише 0,05 секунди. Тепер спробуємо обмежити швидкість до 500 Кб/с:
[email protected]:~# 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`.
Завантаження у фоновому режимі
Завантаження великих файлів, а також обмеження швидкості, займають певний час. Але що робити, якщо ви не бажаєте стежити за процесом у терміналі?
В цьому випадку ви можете скористатися аргументом `-b`, щоб запустити wget у фоновому режимі.
[email protected]:~# wget -b https://slack.com Continuing in background, pid 25430. Output will be written to ‘wget-log.1’. [email protected]:~#
Ігнорування помилок сертифіката
Ця опція стає корисною при перевірці веб-додатків у внутрішній мережі, які не мають дійсного сертифіката. За замовчуванням wget виведе помилку, якщо сертифікат є недійсним.
[email protected]:~# 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'.
У наведеному прикладі показано, що сертифікат URL-адреси є недійсним. Система пропонує скористатися опцією `–no-check-certificate`, щоб ігнорувати перевірку сертифіката.
[email protected]:~# 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] [email protected]:~#
Чудово, чи не так?
Перевірте заголовки HTTP-відповіді на конкретному сайті за допомогою термінала.
Опція `-S` виводить заголовки, наприклад, для Coursera:
[email protected]:~# wget https://www.coursera.org -S --2020-02-23 11:47:01-- https://www.coursera.org/ Resolving www.coursera.org (www.coursera.org)... 13.224.241.48, 13.224.241.124, 13.224.241.82, ... Connecting to www.coursera.org (www.coursera.org)|13.224.241.48|:443... connected. HTTP request sent, awaiting response... HTTP/1.1 200 OK Content-Type: text/html Content-Length: 511551 Connection: keep-alive Cache-Control: private, no-cache, no-store, must-revalidate, max-age=0 Date: Sun, 23 Feb 2020 11:47:01 GMT etag: W/"7156d-WcZHnHFl4b4aDOL4ZSrXP0iBX3o" Server: envoy Set-Cookie: CSRF3-Token=1583322421.s1b4QL6OXSUGHnRI; Max-Age=864000; Expires=Wed, 04 Mar 2020 11:47:02 GMT; Path=/; Domain=.coursera.org Set-Cookie: __204u=9205355775-1582458421174; Max-Age=31536000; Expires=Mon, 22 Feb 2021 11:47:02 GMT; Path=/; Domain=.coursera.org Strict-Transport-Security: max-age=31536000; includeSubDomains; preload X-Content-Type-Options: nosniff x-coursera-render-mode: html x-coursera-render-version: v2 X-Coursera-Request-Id: NCnPPlYyEeqfcxIHPk5Gqw X-Coursera-Trace-Id-Hex: a5ef7028d77ae8f8 x-envoy-upstream-service-time: 1090 X-Frame-Options: SAMEORIGIN x-powered-by: Express X-XSS-Protection: 1; mode=block X-Cache: Miss from cloudfront Via: 1.1 884d101a3faeefd4fb32a5d2a8a076b7.cloudfront.net (CloudFront) X-Amz-Cf-Pop: LHR62-C3 X-Amz-Cf-Id: vqvX6ZUQgtZAde62t7qjafIAqHXQ8BLAv8UhkPHwyTMpvH617yeIbQ== Length: 511551 (500K) [text/html]
Маніпулювання User-Agent
В певних випадках необхідно підключити сайт, використовуючи спеціальний user-agent або user-agent певного браузера. Це можна зробити за допомогою опції `–user-agent`. Нижче наведений приклад використання user-agent MyCustomUserAgent:
[email protected]:~# wget https://gf.dev --user-agent="MyCustomUserAgent"
Коли додаток ще знаходиться на етапі розробки, ви можете не мати відповідної URL-адреси для тестування. Або, наприклад, ви хочете протестувати окремий HTTP екземпляр, використовуючи IP-адресу, але при цьому необхідно надати заголовок хоста для коректної роботи програми. В такій ситуації опція `–header` буде дуже корисною.
Розглянемо приклад тестування http://10.10.10.1 із заголовком хосту application.com:
wget --header="Host: application.com" http://10.10.10.1
Ви можете додати не тільки хост, але і будь-який інший заголовок.
Підключення через проксі
Якщо ви працюєте в DMZ, доступ до веб-сайтів може бути обмежений. У цьому випадку можна використовувати проксі-сервер для підключення.
wget -e use_proxy=yes http_proxy=$PROXYHOST:PORT http://externalsite.com
Обов’язково замініть значення змінної `$PROXYHOST:PORT` на фактичні дані проксі.
Підключення через певний протокол TLS
Хоча для тестування протоколів TLS рекомендується використовувати OpenSSL, ви також можете використовувати wget.
wget --secure-protocol=TLSv1_2 https://example.com
Команда вище змусить wget підключитися через протокол TLS 1.2.
Висновок
Володіння необхідними командами може значно спростити вашу роботу. Сподіваюся, що наведена вище інформація допоможе вам зрозуміти можливості використання wget.