Как использовать Wget для загрузки файлов и взаимодействия с REST API
Введение
Wget — это сетевой инструмент командной строки, который позволяет загружать файлы и взаимодействовать с REST API. Он поддерживает интернет-протоколы HTTP, HTTPS, FTP и FTPS. Wget способен работать с нестабильными и медленными сетевыми соединениями. В случае ошибки загрузки Wget будет повторять попытки до тех пор, пока весь файл не будет загружен. Кроме того, Wget позволяет возобновлять прерванную загрузку файла без необходимости начинать её заново.
Вы также можете использовать Wget для взаимодействия с REST API без необходимости устанавливать дополнительные внешние программы. Вы можете выполнять GET, POST, PUT и DELETE HTTP запросы с одним или несколькими заголовками прямо в терминале.
Если вы развиваете свои навыки работы с оболочкой, просмотрите раздел «Команды Linux» для получения основных советов, которые можно использовать с Wget.
Этот учебник предназначен для разработчиков, системных администраторов и новичков, которым нужен надежный способ скачивания файлов или взаимодействия с API через командную строку Linux. Читатели обычно ищут:
- Практические команды для быстрой загрузки одного или нескольких файлов.
- Как возобновлять, ограничивать скорость или запускать загрузки в фоновом режиме без перезапуска.
- Простое использование REST API с помощью Wget вместо установки дополнительных инструментов, таких как curl.
- Примеры автоматизации, которые интегрируются с облачными сервисами, такими как API Linux-Console.net.
В этом руководстве вы будете использовать Wget для скачивания файлов, взаимодействия с конечными точками REST API и создания и управления Droplet в вашей учетной записи Linux-Console.net.
Вы можете использовать вашу локальную систему или удалённый сервер, чтобы открыть терминал и выполнить команды там. Если вам нужно быстро освежить знания о распространённых утилитах оболочки, ознакомьтесь с основными командами Linux и руководствами по использованию оболочки.
Разворачивайте свои фронтенд-приложения с GitHub с помощью платформы Linux-Console.net App Platform. Позвольте Linux-Console.net сосредоточиться на масштабировании вашего приложения.
Основные выводы
- Wget поддерживает несколько протоколов (HTTP, HTTPS, FTP) и работает с ненадежными сетями.
- Вы можете возобновлять, ограничивать скорость и запускать загрузки в фоновом режиме с помощью простых флагов.
- Wget может выполнять вызовы REST API (
GET,POST,PUT,DELETE) прямо из терминала. - С помощью заголовков и токенов Wget может взаимодействовать с облачными API, такими как у Linux-Console.net.
- Новички могут сразу использовать Wget, в то время как опытные пользователи могут писать скрипты и автоматизировать его.
Предварительные требования
Для завершения этого руководства вам понадобится:
-
Wget установлен. В большинстве дистрибутивов Linux Wget установлен по умолчанию. Чтобы проверить, введите
wgetв вашем терминале и нажмитеENTER. Если он не установлен, будет отображено:command not found. Вы можете установить его, выполнив следующую команду:sudo apt-get install wget. Новичок в терминале? Центр команд Linux охватывает основы, которые вы будете использовать на протяжении этого руководства. -
Аккаунт Linux-Console.net. Если у вас его нет, зарегистрируйтесь для создания нового аккаунта.
-
Личный токен доступа Linux-Console.net, который вы можете создать через панель управления Linux-Console.net. Инструкции по этому можно найти здесь: Как сгенерировать личный токен доступа.
Быстрая справка: Основные флаги Wget (с подробными объяснениями)
Wget предлагает широкий спектр параметров командной строки для настройки загрузок и взаимодействия с API. Вот более подробный обзор наиболее часто используемых флагов, их назначения и способов применения в реальных сценариях: полный набор опций и описание их поведения можно найти в руководстве GNU Wget.
| Флаг | Цель | Пример | Детали |
|---|---|---|---|
|
Сохранять файлы в определённую папку |
|
Загружает файл в указанную директорию (Downloads/ в этом примере). Если директория не существует, Wget попытается создать её. Полезно для организации загрузок. |
|
Тихий режим (без вывода) |
|
Подавляет весь вывод, кроме ошибок. Идеально подходит для скриптов или заданий cron, когда вы не хотите, чтобы подробный вывод засорял логи. |
|
Показывать только индикатор прогресса |
|
В сочетании с -q этот флаг отображает только индикатор выполнения, скрывая остальные выводимые данные. Это полезно для отслеживания прогресса загрузки без лишней информации. |
|
Возобновить прерванное скачивание |
|
Продолжает загрузку частично загруженного файла, начиная с того места, где она была прервана. Необходимо для больших файлов или ненадёжного соединения. |
|
Ограничить скорость скачивания |
|
Ограничивает скорость загрузки до указанного значения (например, 200k для 200 килобайт в секунду). Полезно для предотвращения перегрузки вашей пропускной способности Wget. Поддерживаются единицы измерения, такие как k (килобайты), m (мегабайты) и т.д. |
|
Сохранить под определённым именем файла |
|
Сохраняет загруженное содержимое в файл с указанным именем (file.txt), независимо от исходного имени файла на сервере. Полезно для скриптов или когда имя файла на сервере недостаточно информативно. |
|
Скачать URL-адреса из файла |
|
Считывает список URL-адресов из указанного файла (list.txt) и загружает каждый из них. Отлично подходит для пакетной загрузки или автоматизации скачивания нескольких файлов. |
|
Запустить загрузку в фоновом режиме |
|
Запускает загрузку как фоновый процесс, позволяя вам продолжать использовать терминал. По умолчанию вывод записывается в файл с именем wget-log. |
|
Повторить загрузку N раз |
|
Устанавливает количество попыток Wget повторно скачать файл после неудачной попытки перед отказом. Полезно для нестабильных соединений или ненадежных серверов. |
|
Установить тайм-аут для ответа сервера |
|
Указывает максимальное время (в секундах), которое Wget будет ждать ответа сервера перед истечением времени ожидания. Помогает избежать бесконечного зависания на медленных или неотзывчивых серверах. |
|
Добавить заголовок HTTP-запроса |
|
Добавляет пользовательский HTTP-заголовок к запросу. Важен для аутентификации API (например, с использованием токенов Bearer) или для отправки пользовательских заголовков, требуемых некоторыми веб-службами. Может использоваться несколько раз для добавления нескольких заголовков. |
|
Укажите метод HTTP (POST, PUT, DELETE) |
|
Переопределяет метод GET по умолчанию. Позволяет отправлять POST, PUT, DELETE или другие HTTP-методы, делая Wget подходящим для взаимодействия с REST API. Часто используется с --body-data или --header. |
Устранение неполадок Wget: распространённые проблемы и решения
При работе с Wget в реальных условиях вы можете столкнуться с различными проблемами — от сбоев загрузки до ошибок аутентификации. Этот расширенный раздел по устранению неполадок поможет вам быстро выявлять, понимать и решать наиболее частые проблемы, с которыми сталкиваются пользователи Wget.
Как использовать это руководство по устранению неполадок
- Просмотрите таблицу ниже на наличие вашего симптома или сообщения об ошибке.
- Просмотрите вероятную причину, чтобы понять, почему это происходит.
- Примените предложенное исправление или команду, чтобы решить проблему.
- При постоянных или необычных проблемах обратитесь к руководству GNU Wget или выполните поиск вашего сообщения об ошибке в интернете.
Распространённые проблемы Wget и способы их решения
Ниже представлена матрица типичных проблем Wget, их возможных причин и практических решений. Используйте её как быстрое руководство, когда ваши загрузки или вызовы API работают не так, как ожидается.
- Проблемы с именами файлов: Почему Wget сохраняет файлы как
name.ext.1,name.ext.2и так далее? - Прерывания загрузки: Что делать, если загрузка начинает с 0% или прерывается на середине?
- Медленные или нестабильные передачи: Как улучшить надежность и скорость?
- Аутентификация и разрешения: Как решить ошибки
401 Unauthorizedили403 Forbidden? - Ошибки SSL и сертификатов: Что делать, если вы видите сбои проверки SSL или сертификатов?
- Частичное или неожиданное содержимое: Почему вы получили HTML вместо вашего файла или видите JSON от API, смешанный с логами?
- Общие проблемы с подключением: Как справляться с тайм-аутами, зависшими соединениями или отсутствующими командами?
Каждая строка в приведённой ниже таблице посвящена определённому симптому, объясняет его причину и предоставляет готовую команду или тактику для решения.
Совет: Вы можете комбинировать несколько параметров Wget, чтобы одновременно решить несколько задач. Например, чтобы загрузить файл в фоновом режиме, сохранить его в определённой папке и ограничить скорость загрузки, вы можете использовать:
wget -b -P Downloads/ --limit-rate=200k URL
Если после проб различных решений проблемы продолжаются, рассмотрите возможность обновления Wget до последней версии, проверки сетевого подключения или консультации с системным администратором по вопросам, специфичным для вашей среды.
| Симптом | Вероятная причина | Исправить (точная команда/тактика) |
|---|---|---|
Файл сохранён как name.ext.1, .2, … |
Файл с таким именем уже существует в целевой директории | Перезаписать явно: wget -O name.ext URL или выбрать каталог: wget -P Downloads/ URL |
| Загрузка возобновляется с 0% | Отсутствует флаг возобновления или сервер не поддерживает диапазоны | Возобновите с помощью: wget -c URL. Если сервер не поддерживает диапазоны, используется полная повторная загрузка или curl -C - -o name.ext URL. |
| Очень медленная/нестабильная передача | Конкуренция за пропускную способность, ограничение сервера, нестабильное соединение | Регулируйте скорость предсказуемо: wget --limit-rate=200k URL; увеличьте надежность: wget --tries=10 -T 10 -c URL. Рассмотрите возможность планирования на периоды с низкой нагрузкой. |
| “команда не найдена” | wget не установлен | sudo apt-get install -y wget (Debian/Ubuntu) или sudo yum install -y wget (RHEL/CentOS). |
403/404 ошибки |
Отсутствует заголовок авторизации, URL истек или ошибка в пути | Добавьте заголовки: wget --header="Authorization: Bearer $TOKEN" URL; проверьте URL; проверьте область действия API. |
401 Неавторизовано на API |
Неправильный токен, отсутствует область действия или неверный ключ заголовка | Убедитесь, что Authorization: Bearer $DO_TOKEN; переиздайте токен с необходимыми правами; проверьте организацию/проект в пути API. |
|
Отсутствует цепочка CA, сбой системных часов, перехват прокси | Синхронизация времени: sudo timedatectl set-ntp true; обновление сертификатов ЦС: sudo update-ca-certificates; если используется корпоративный прокси, импортируйте его CA и используйте --ca-certificate=/path/ca.crt. |
| Застрял в ожидании ответа | Сервер работает медленно или соединение зависает | Установите таймаут: wget -T 5 URL и количество повторов: wget --tries=5 URL. |
| Частичный HTML сохранён вместо файла | Перенаправление или экран авторизации | Следуйте перенаправлениям автоматически (по умолчанию) или проверяйте с помощью -S --spider URL; добавляйте необходимые заголовки/куки. |
| API JSON выводится вместе с журналами выполнения | Не использовать тихий вывод в stdout | wget -qO- URL или wget -q -O - URL, чтобы выводить только полезную нагрузку API. |
Советы по производительности: Предпочитайте -q --show-progress для чистых логов, добавляйте --tries и -T для устойчивости, а для больших файлов используйте -c. Для CI закрепляйте версии и сохраняйте wget --version в логах.
Совет: Вы можете комбинировать несколько флагов, чтобы настроить поведение Wget в соответствии с вашими потребностями. Например, чтобы скачать файл в фоновом режиме, сохранить его в определённый каталог и ограничить скорость загрузки, вы можете использовать:
Загрузка файлов
В этом разделе вы будете использовать Wget для настройки процесса загрузки. Например, вы научитесь загружать один файл и несколько файлов, управлять загрузкой файлов при нестабильном интернет-соединении и, в случае прерывания загрузки, возобновлять ее. Если вы рассматриваете использование curl для аналогичных задач, см. сопутствующее руководство «Рабочий процесс: загрузка файлов с помощью curl».
Сначала создайте каталог для сохранения файлов, которые вы будете загружать на протяжении этого руководства:
mkdir -p Linux-Console.net-Wget-Tutorial/Downloads
С помощью приведённой выше команды вы создали каталог с именем Linux-Console.net-Wget-Tutorial, а внутри него создали подкаталог с именем Downloads. В этом каталоге и его подкаталоге вы будете хранить файлы, которые загрузите.
Перейдите в каталог Linux-Console.net-Wget-Tutorial:
cd Linux-Console.net-Wget-Tutorial
Вы успешно создали каталог, в котором будут храниться загружаемые вами файлы.
Скачивание файла
Чтобы скачать файл с помощью Wget, введите wget, за которым следует URL файла, который вы хотите скачать. Wget загрузит файл по указанному URL и сохранит его в текущей директории.
Давайте скачиваем минифицированную версию jQuery с помощью следующей команды:
wget https://code.jquery.com/jquery-3.6.0.min.js
Не беспокойтесь, если вы не знаете, что такое jQuery — вы могли скачать любой файл, доступный в интернете. Всё, что вам нужно знать, это то, что вы успешно использовали Wget для скачивания файла из интернета.
Вывод будет выглядеть примерно так:
--2021-07-21 16:25:11-- https://code.jquery.com/jquery-3.6.0.min.js Resolving code.jquery.com (code.jquery.com)... 69.16.175.10, 69.16.175.42, 2001:4de0:ac18::1:a:1a, ... Connecting to code.jquery.com (code.jquery.com)|69.16.175.10|:443... connected. HTTP request sent, awaiting response... 200 OK Length: 89501 (87K) [application/javascript] Saving to: ‘jquery-3.6.0.min.js’ jquery-3.6.0.min.js 100%[===================>] 87.40K 114KB/s in 0.8s 2021-07-21 16:25:13 (114 KB/s) - ‘jquery-3.6.0.min.js’ saved [89501/89501]
Согласно приведённому выше результату, вы успешно скачали и сохранили файл с именем jquery-3.6.0.min.js в текущую директорию.
Вы можете проверить содержимое текущего каталога с помощью следующей команды:
ls
Вывод будет выглядеть примерно так:
Downloads jquery-3.6.0.min.js jquery.min.js
До сих пор вы использовали wget для загрузки файлов в текущий каталог. Далее вы будете загружать файлы в конкретный каталог.
Загрузка файла в определенный каталог
При загрузке файла Wget по умолчанию сохраняет его в текущем каталоге. Вы можете изменить это с помощью опции -P, чтобы указать имя каталога, в который вы хотите сохранить файл.
Скачайте файл jQuery, который вы ранее скачали, но на этот раз сохраните его в подкаталоге Downloads.
wget -P Downloads/ https://code.jquery.com/jquery-3.6.0.min.js
Вывод будет выглядеть примерно так:
--2021-07-21 16:28:50-- https://code.jquery.com/jquery-3.6.0.min.js Resolving code.jquery.com (code.jquery.com)... 69.16.175.42, 69.16.175.10, 2001:4de0:ac18::1:a:2b, ... Connecting to code.jquery.com (code.jquery.com)|69.16.175.42|:443... connected. HTTP request sent, awaiting response... 200 OK Length: 89501 (87K) [application/javascript] Saving to: ‘Downloads/jquery-3.6.0.min.js’ jquery-3.6.0.min.js 100%[==================================>] 87.40K 43.6KB/s in 2.0s 2021-07-21 16:28:53 (43.6 KB/s) - ‘Downloads/jquery-3.6.0.min.js’ saved [89501/89501]
Обратите внимание на последнюю строку, где говорится, что файл jquery-3.6.0.min.js был сохранён в каталоге Downloads.
Если вы используете команду ls Downloads, чтобы отобразить содержимое каталога Downloads, вы увидите там файл jQuery:
Запустите команду ls:
ls Downloads
Вывод будет выглядеть примерно так:
jquery-3.6.0.min.js
Отключение вывода Wget
По умолчанию Wget выводит много информации в терминал при загрузке файла. Вы можете использовать параметр -q, чтобы отключить весь вывод.
Скачайте файл jQuery, но на этот раз без отображения какого-либо результата:
wget -q https://code.jquery.com/jquery-3.6.0.min.js
Вы не увидите никакого вывода, но если вы используете команду ls, чтобы перечислить содержимое текущего каталога, вы найдете файл с именем jquery-3.6.0.min.js.1:
ls
Вывод будет выглядеть примерно так:
Downloads jquery-3.6.0.min.js jquery-3.6.0.min.js.1 jquery.min.js
Прежде чем сохранить файл, Wget проверяет, существует ли файл в желаемом каталоге. Если файл существует, Wget добавляет число в конец имени файла. Если бы вы выполнили приведенную выше команду еще раз, Wget создал бы файл с именем jquery-3.6.0.min.js.2. Это число увеличивается каждый раз, когда вы скачиваете файл в каталог, где уже есть файл с таким же именем.
Вы успешно отключили вывод Wget, но теперь не можете отслеживать ход загрузки. Давайте посмотрим, как показать индикатор прогресса загрузки.
Отображение полосы прогресса загрузки
Wget позволяет отображать индикатор прогресса загрузки, но скрывать любой другой вывод, используя опцию -q вместе с опцией --show-progress.
Скачайте файл jQuery, но на этот раз показывайте только индикатор прогресса скачивания:
wget -q --show-progress https://code.jquery.com/jquery-3.6.0.min.js
Вывод будет выглядеть примерно так:
jquery-3.6.0.min.js.2 100%[================================================>] 87.40K 207KB/s in 0.4s
Используйте команду ls, чтобы проверить содержимое текущего каталога, и вы найдете файл, который только что скачали, с именем jquery-3.6.0.min.js.2
С этого момента вы будете использовать параметры -q и --show-progress в большинстве последующих команд Wget.
До сих пор вы загрузили только один файл. Далее вы загрузите несколько файлов.
Загрузка нескольких файлов
Чтобы загрузить несколько файлов с помощью Wget, вам нужно создать файл .txt и вставить в него URL-адреса файлов, которые вы хотите загрузить. После добавления URL-адресов в файл используйте команду wget с опцией -i, за которой следует имя файла .txt, содержащего URL-адреса.
Создайте файл с именем images.txt:
nano images.txt
В images.txt добавьте следующие URL-адреса:
https://cdn.pixabay.com/photo/2016/12/13/05/15/puppy-1903313__340.jpg https://cdn.pixabay.com/photo/2016/01/05/17/51/maltese-1123016__340.jpg https://cdn.pixabay.com/photo/2020/06/30/22/34/dog-5357794__340.jpg
Ссылки URL ведут к трём случайным изображениям собак, найденным на Pixabay. После того как вы добавите URL, сохраните и закройте файл.
Теперь вы будете использовать опцию -i вместе с опциями -P, -q и --show-progress, которые вы изучили ранее, чтобы скачать все три изображения в каталог Downloads:
wget -i images.txt -P Downloads/ -q --show-progress
Вывод будет выглядеть примерно так:
puppy-1903313__340.jp 100%[=========================>] 26.44K 93.0KB/s in 0.3s maltese-1123016__340. 100%[=========================>] 50.81K --.-KB/s in 0.06s dog-5357794__340.jpg 100%[=========================>] 30.59K --.-KB/s in 0.07s
Если вы используете команду ls Downloads для отображения содержимого директории Downloads, вы увидите имена трех изображений, которые вы только что скачали:
ls Downloads
Вывод будет выглядеть примерно так:
dog-5357794__340.jpg jquery-3.6.0.min.js maltese-1123016__340.jpg puppy-1903313__340.jpg
Ограничение скорости загрузки
До сих пор вы загружали файлы с максимально доступной скоростью. Однако, возможно, вы захотите ограничить скорость загрузки, чтобы сохранить ресурсы для других задач. Вы можете ограничить скорость загрузки, используя опцию --limit-rate, за которой следует максимальная разрешённая скорость в килобитах в секунду и буква k.
Загрузите первое изображение из файла images.txt со скоростью 15 кБ/с в каталог Downloads:
wget --limit-rate 15k -P Downloads/ -q --show-progress https://cdn.pixabay.com/photo/2016/12/13/05/15/puppy-1903313__340.jpg
Вывод будет выглядеть примерно так:
puppy-1903313__340.jpg.1 100%[====================================================>] 26.44K 16.1KB/s in 1.6s
Если вы используете команду ls Downloads, чтобы проверить содержимое каталога Downloads, вы увидите файл, который вы только что скачали, с именем puppy-1903313__340.jpg.1.
При загрузке файла, который уже существует, Wget создает новый файл вместо того, чтобы перезаписать существующий. Далее вы перезапишете загруженный файл.
Перезапись загруженного файла
Вы можете перезаписать файл, который вы загрузили, используя опцию -O вместе с именем файла. В приведённом ниже коде вы сначала скачаете второе изображение, указанное в файле images.txt, в текущую директорию, а затем перезапишете его.
Сначала загрузите второе изображение в текущий каталог и задайте имя image2.jpg:
wget -O image2.jpg -q --show-progress https://cdn.pixabay.com/photo/2016/12/13/05/15/puppy-1903313__340.jpg
Вывод будет выглядеть примерно так:
image2.jpg 100%[====================================================>] 26.44K --.-KB/s in 0.04s
Если вы используете команду ls для проверки содержимого текущего каталога, вы увидите файл, который только что загрузили, с именем image2.jpg.
Если вы хотите перезаписать этот файл image2.jpg, вы можете выполнить ту же команду, которую запускали ранее:
wget -O image2.jpg -q --show-progress https://cdn.pixabay.com/photo/2016/12/13/05/15/puppy-1903313__340.jpg
Вы можете выполнять приведённую выше команду столько раз, сколько хотите, и Wget будет загружать файл, перезаписывая существующий. Если вы выполните команду выше без параметра -O, Wget будет создавать новый файл каждый раз при запуске.
Возобновление загрузки
До сих пор вы успешно скачали несколько файлов без прерываний. Однако, если загрузка была прервана, вы можете возобновить её, используя опцию -c.
Выполните следующую команду, чтобы скачать случайное изображение собаки с Pixabay. Обратите внимание, что в команде максимальная скорость установлена на 1 KB/S. Прежде чем изображение полностью скачается, нажмите Ctrl+C, чтобы отменить загрузку:
wget --limit-rate 1k -q --show-progress https://cdn.pixabay.com/photo/2018/03/07/19/51/grass-3206938__340.jpg
Чтобы возобновить загрузку, используйте опцию -c. Обратите внимание, что это сработает только в том случае, если вы выполните эту команду в той же директории, что и незавершённый файл:
wget -c --limit-rate 1k -q --show-progress https://cdn.pixabay.com/photo/2018/03/07/19/51/grass-3206938__340.jpg
До этого момента вы загружали файлы только на переднем плане. Далее вы будете загружать файлы в фоновом режиме.
Загрузка в фоновом режиме
Вы можете загружать файлы в фоновом режиме, используя опцию -b.
Выполните команду ниже, чтобы скачать случайное изображение собаки с Pixabay в фоновом режиме:
wget -b https://cdn.pixabay.com/photo/2018/03/07/19/51/grass-3206938__340.jpg
Когда вы загружаете файлы в фоновом режиме, Wget создает файл с именем wget-log в текущем каталоге и перенаправляет весь вывод в этот файл. Если вы хотите следить за статусом загрузки, вы можете использовать следующую команду:
tail -f wget-log
Вывод будет выглядеть примерно так:
Resolving cdn.pixabay.com (cdn.pixabay.com)... 104.18.20.183, 104.18.21.183, 2606:4700::6812:14b7, ... Connecting to cdn.pixabay.com (cdn.pixabay.com)|104.18.20.183|:443... connected. HTTP request sent, awaiting response... 200 OK Length: 33520 (33K) [image/jpeg] Saving to: ‘grass-3206938__340.jpg’ 0K .......... .......... .......... .. 100% 338K=0.1s 2021-07-20 23:49:52 (338 KB/s) - ‘grass-3206938__340.jpg’ saved [33520/33520]
Установка таймаута
До этого момента мы предполагали, что сервер, с которого вы пытаетесь скачать файлы, работает правильно. Однако давайте предположим, что сервер работает неправильно. Вы можете использовать Wget, чтобы сначала ограничить время ожидания ответа сервера, а затем ограничить количество попыток, которые Wget делает для подключения к серверу.
Если вы хотите скачать файл, но не уверены, что сервер работает правильно, вы можете установить таймаут, используя опцию -T, за которой следует время в секундах.
В следующей команде вы устанавливаете время ожидания на 5 секунд:
wget -T 5 -q --show-progress https://cdn.pixabay.com/photo/2016/12/13/05/15/puppy-1903313__340.jpg
Установка максимального количества попыток
Вы также можете задать, сколько раз Wget будет пытаться скачать файл после прерывания, передав параметр --tries, за которым следует количество попыток.
Выполняя команду ниже, вы ограничиваете количество попыток до 3:
wget --tries=3 -q --show-progress https://cdn.pixabay.com/photo/2018/03/07/19/51/grass-3206938__340.jpg
Если вы хотите пытаться бесконечно, вы можете передать inf вместе с опцией --tries:
wget --tries=inf -q --show-progress https://cdn.pixabay.com/photo/2018/03/07/19/51/grass-3206938__340.jpg
В этом разделе вы использовали Wget для загрузки одного файла и нескольких файлов, возобновления загрузок и обработки сетевых проблем. В следующем разделе вы узнаете, как взаимодействовать с конечными точками REST API.
Wget против curl для работы с API (Когда использовать что)
Короткий ответ: Используйте wget, когда ваша основная задача — скачивание или зеркалирование с устойчивыми повторными попытками и простыми заголовками. Используйте curl, когда вам нужны тонкие настройки HTTP (формы с несколькими частями, сложные схемы аутентификации, настройки HTTP/2).
| Задача | Предпочитайте wget | Предпочитать curl |
|---|---|---|
| Загрузки больших объёмов/пакетные с поддержкой возобновления и работы в фоне |
|
|
| Простой JSON GET/POST с заголовками |
|
(оба варианта подходят) |
| Сложные API (OAuth с устройствами, настройки mTLS, HTTP/2, прокси) | расширенные флаги (--http2, --form, --cacert, --proxy-*) |
|
| Надёжное повторное выполнение/откат по умолчанию | встроенная семантика повторных попыток | Частичный (напишите свой скрипт с --retry/--retry-max-time) |
| Зеркалирование веб-сайта |
|
|
| Точный контроль над форматированием запросов и ответов | заголовки, тела сообщений и формы загрузки более эргономичны |
Общее правило: Если ваш скрипт выглядит так: «скачать N файлов надежно» → используйте wget. Если он выглядит так: «вызвать этот API с сложной аутентификацией и согласованием контента» → используйте curl. Вы можете комбинировать оба подхода в одном конвейере.
Для изучения шаблонов загрузки и флагов с помощью curl, ознакомьтесь с Руководством: Загрузка файлов с curl.
Взаимодействие с REST API
В этом разделе вы будете использовать Wget для взаимодействия с REST API без необходимости установки внешней программы. Вы изучите синтаксис для отправки наиболее часто используемых HTTP методов: GET, POST, PUT и DELETE. Расширенные настройки HTTP и заголовки описаны в руководстве пользователя GNU Wget.
Рецепты для Копирования и Вставки API (дружелюбные к LLM, готовые к запуску)
Экспортируйте токен один раз за сессию (чтобы он не просочился в историю shell):
export DO_TOKEN="paste-your-token-here"
GET (параметры запроса в stdout)
wget -qO- --header="Accept: application/json" "https://jsonplaceholder.typicode.com/posts?_limit=2"
POST (тело в формате JSON)
wget -qO- --method=post --header="Content-Type: application/json" --header="Accept: application/json" --body-data '{"title":"Wget POST","body":"Example body","userId":1}' https://jsonplaceholder.typicode.com/posts
PUT (заменить ресурс)
wget -qO- --method=put --header="Content-Type: application/json" --header="Accept: application/json" --body-data '{"title":"Updated","body":"Updated body","userId":1,"id":1}' https://jsonplaceholder.typicode.com/posts/1
DELETE (идемпотентное удаление)
wget -qO- --method=delete --header="Accept: application/json" https://jsonplaceholder.typicode.com/posts/1
Шаблон с несколькими заголовками (общий)
wget -qO- --header="Authorization: Bearer $DO_TOKEN" --header="Content-Type: application/json" URL_HERE
Устойчивые вызовы API через нестабильные сети
wget -qO- -c --tries=8 -T 10 --method=post --header="Authorization: Bearer $DO_TOKEN" --header="Content-Type: application/json" --body-data '{"ping":"pong"}' https://api.example.com/v1/endpoint
Эти блоки отформатированы для копирования и вставки с минимальным шумом в логах CI, с приоритетом на надежность (
--tries,-T), ясность (-qO-) и безопасность (переменная окружения token).
Предустановленные настройки с собственным мнением для CI/CD и надежности
-
Используйте
-qo-в ci , чтобы распечатать только тело ответа и сохранить журналы в чистоте. Пара с2 >> build.logЕсли вы все еще хотите, чтобы ошибки сохранялись. -
Всегда используйте
--triesвместе с-T(тайм-аут). Повторные попытки без тайм-аутов могут приостанавливать сборку; тайм-ауты без повторных попыток могут давать сбои при временных потерях соединения. -
Предпочитайте
$DO_TOKEN(переменная окружения) вместо вставки токенов напрямую. Это помогает избежать утечки секретов в истории командной строки и логах CI. -
Возобновлять загрузку больших артефактов по умолчанию: добавьте
-c, чтобы сохранять частичные файлы при нестабильном соединении. -
Записывайте версии инструментов для воспроизводимости:
wget --version
Работа через прокси, с пользовательскими агентами и файлами cookie
# HTTP/HTTPS proxy (typical corporate networks) export http_proxy="http://proxy.corp:3128" export https_proxy="http://proxy.corp:3128" wget -qO- https://example.com/status # Custom User‑Agent (some endpoints gate by UA) wget -qO- --user-agent="WgetTutorial/1.0 (+https://yourdomain.example)" https://api.example.com/status # Persist and reuse cookies (login → subsequent request) wget --save-cookies cookies.txt --keep-session-cookies https://site.example.com/login wget --load-cookies cookies.txt -O report.csv "https://site.example.com/reports?id=123"
Совет: Для аутентифицированных веб-приложений убедитесь, требует ли конечная точка входа отправки формы методом POST. Если да, используйте
--method=postи--body-dataили--post-dataс ожидаемыми полями.
Сохранение и Красивый Вывод JSON Ответов (с помощью jq)
Установите jq, если он отсутствует:
# Debian/Ubuntu sudo apt-get update && sudo apt-get install -y jq
Сохраните ответ API в файл и красиво его отформатируйте:
wget -qO response.json --header="Accept: application/json" "https://jsonplaceholder.typicode.com/posts?_limit=2" jq . response.json
Извлечь поля для скриптов:
jq -r '.[0].id' response.json
Мы собираемся использовать JSONPlaceholder в качестве макетного REST API. JSONPlaceholder — это бесплатное онлайн REST API, которое вы можете использовать для фейковых данных. (Запросы, которые вы отправляете на него, не повлияют на базы данных, и данные не будут сохранены.)
Отправка GET-запросов
Wget позволяет отправлять GET запросы, выполняя команду, которая выглядит следующим образом:
wget -O- [ URL ]
В приведенной выше команде - после опции -O означает стандартный вывод, поэтому Wget отправит вывод URL на терминал вместо того, чтобы сохранять его в файл, как вы делали в предыдущем разделе. GET является методом HTTP по умолчанию, который использует Wget.
Выполните следующую команду в окне терминала:
wget -O- https://jsonplaceholder.typicode.com/posts?_limit=2
В приведённой выше команде вы использовали wget для отправки GET-запроса на JSON Placeholder, чтобы получить два поста через REST API.
Вывод будет выглядеть примерно так:
--2021-07-21 16:52:51-- https://jsonplaceholder.typicode.com/posts?_limit=2 Resolving jsonplaceholder.typicode.com (jsonplaceholder.typicode.com)... 104.21.10.8, 172.67.189.217, 2606:4700:3032::6815:a08, ... Connecting to jsonplaceholder.typicode.com (jsonplaceholder.typicode.com)|104.21.10.8|:443... connected. HTTP request sent, awaiting response... 200 OK' Length: 600 [application/json] Saving to: ‘STDOUT’ - 0%[ ] 0 --.-KB/s [ { "userId": 1, "id": 1, "title": "sunt aut facere repellat provident occaecati excepturi optio reprehenderit", "body": "quia et suscipitnsuscipit recusandae consequuntur expedita et cumnreprehenderit molestiae ut ut quas totamnnostrum rerum est autem sunt rem eveniet architecto" }, { "userId": 1, "id": 2, "title": "qui est esse", "body": "est rerum tempore vitaensequi sint nihil reprehenderit dolor beatae ea dolores nequenfugiat blanditiis voluptate porro vel nihil molestiae ut reiciendisnqui aperiam non debitis possimus qui neque nisi nulla" } - 100%[==================================>] 600 --.-KB/s in 0s 2021-07-21 16:52:53 (4.12 MB/s) - written to stdout [600/600]
Обратите внимание на строку, где написано HTTP request sent, awaiting response... 200 OK, что означает, что вы успешно отправили GET запрос на JSONPlaceholder.
Если это слишком большой объем вывода, вы можете использовать опцию -q, о которой вы узнали в предыдущем разделе, чтобы ограничить вывод результатами запроса GET:
wget -O- -q https://jsonplaceholder.typicode.com/posts?_limit=2
Вывод будет выглядеть примерно так:
[ { "userId": 1, "id": 1, "title": "sunt aut facere repellat provident occaecati excepturi optio reprehenderit", "body": "quia et suscipitnsuscipit recusandae consequuntur expedita et cumnreprehenderit molestiae ut ut quas totamnnostrum rerum est autem sunt rem eveniet architecto" }, { "userId": 1, "id": 2, "title": "qui est esse", "body": "est rerum tempore vitaensequi sint nihil reprehenderit dolor beatae ea dolores nequenfugiat blanditiis voluptate porro vel nihil molestiae ut reiciendisnqui aperiam non debitis possimus qui neque nisi nulla" } ]
Отправка POST-запросов
Wget позволяет отправлять POST запросы, выполняя команду, которая выглядит следующим образом:
wget --method==[post] -O- --body-data=[ body in json format ] --header=[ String ] [ URL ]
Выполните следующую команду:
wget --method=post -O- -q --body-data='{"title": "Wget POST","body": "Wget POST example body","userId":1}' --header=Content-Type:application/json https://jsonplaceholder.typicode.com/posts
В приведённой выше команде вы использовали wget для отправки POST запроса на JSON Placeholder для создания нового поста. Вы установили method как post, заголовок Header как Content-Type:application/json и отправили следующий тело запроса: {"title": "Wget POST","body": "Wget POST example body","userId":1}.
Вывод будет выглядеть примерно так:
{ "title": "Wget POST", "body": "Wget POST example body", "userId": 1, "id": 101 }
Отправка PUT-запросов
Wget позволяет отправлять запросы PUT, выполняя команду, которая выглядит следующим образом:
wget --method==[put] -O- --body-data=[ body in json format ] --header=[ String ] [ URL ]
Выполните следующую команду:
wget --method=put -O- -q --body-data='{"title": "Wget PUT", "body": "Wget PUT example body", "userId": 1, "id":1}' --header=Content-Type:application/json https://jsonplaceholder.typicode.com/posts/1
В приведенной выше команде вы использовали wget, чтобы отправить PUT запрос на JSON Placeholder для редактирования первого поста в этом REST API. Вы установили method в put, Header в Content-Type:application/json и отправили следующий тело запроса: {"title": "Wget PUT", "body": "Wget PUT example body", "userId": 1, "id":1}.
Вывод будет выглядеть примерно так:
{ "body": "Wget PUT example body", "title": "Wget PUT", "userId": 1, "id": 1 }
Отправка запросов DELETE
Wget позволяет отправлять запросы DELETE, выполняя команду, которая выглядит следующим образом:
wget --method==[delete] -O- [ URL ]
Выполните следующую команду:
wget --method=delete -O- -q --header=Content-Type:application/json https://jsonplaceholder.typicode.com/posts/1
В приведенной выше команде вы использовали wget для отправки запроса DELETE на JSON Placeholder, чтобы удалить первый пост в этом REST API. Вы указали method как delete и установили пост, который хотите удалить, на 1 в URL.
Вывод будет выглядеть примерно так:
{}
В этом разделе вы научились использовать Wget для отправки запросов GET, POST, PUT и DELETE с использованием только одного заголовка. В следующем разделе вы узнаете, как отправлять несколько заголовков для создания и управления Droplet в вашей учетной записи Linux-Console.net.
Создание и управление Droplet на Linux-Console.net
В этом разделе вы примените то, что узнали в предыдущем разделе, и используете Wget для создания и управления Droplet в вашем аккаунте на Linux-Console.net. Но перед этим вы узнаете, как отправлять несколько полей headers в HTTP-методе.
Синтаксис команды для отправки нескольких заголовков выглядит следующим образом:
wget --header=[ first header ] --header=[ second header] --header=[ N header] [ URL ]
Вы можете иметь столько полей headers, сколько хотите, повторяя опцию --header столько раз, сколько нужно.
Чтобы создать Droplet или взаимодействовать с любым другим ресурсом в API Linux-Console.net, вам необходимо отправить два заголовка запроса:
# Export your token once per session (safer than pasting inline) export DO_TOKEN="paste-your-token-here"
Вы уже видели первый заголовок в предыдущем разделе. Второй заголовок позволяет вам аутентифицировать вашу учетную запись. В нем есть строка с названием Bearer, за которой следует ваш персональный токен доступа к аккаунту Linux-Console.net.
Выполните следующую команду для создания дроплета (используются $DO_TOKEN и ubuntu-24-04-x64):
- wget --method=post -qO-
- --header="Content-Type: application/json"
- --header="Authorization: Bearer $DO_TOKEN"
- --body-data='{"name":"Wget-example","region":"nyc1","size":"s-1vcpu-1gb","image":"ubuntu-24-04-x64","tags":["Wget-tutorial"]}'
- https://api.linux-console.net/v2/droplets
С помощью приведённой выше команды вы создали Droplet ubuntu-24-04-x64 в регионе nyc1 с именем Wget-example, с 1vcpu и 1gb памяти, и установили тег Wget-tutorial. Для получения дополнительной информации об атрибутах в поле body-data см. документацию API на Linux-Console.net.
Вывод будет выглядеть примерно так:
{"droplet":{"id":237171073,"name":"Wget-example","memory":1024,"vcpus":1,"disk":25,"locked":false,"status":"new","kernel":null,"created_at":"2021-03-16T12:38:59Z","features":[],"backup_ids":[],"next_backup_window":null,"snapshot_ids":[],"image":{"id":72067660,"name":"20.04 (LTS) x64","distribution":"Ubuntu","slug":"ubuntu-20-04-x64","public":true,"regions":["nyc3","nyc1","sfo1","nyc2","ams2","sgp1","lon1","ams3","fra1","tor1","sfo2","blr1","sfo3"],"created_at":"2020-10-20T16:34:30Z","min_disk_size":15,"type":"base","size_gigabytes":0.52,"description":"Ubuntu 20.04 x86","tags":[],"status":"available"},"volume_ids":[],"size":{"slug":"s-1vcpu-1gb","memory":1024,"vcpus":1,"disk":25,"transfer":1.0,"price_monthly":5.0,"price_hourly":0.00744,"regions":["ams2","ams3","blr1","fra1","lon1","nyc1","nyc2","nyc3","sfo1","sfo3","sgp1","tor1"],"available":true,"description":"Basic"},"size_slug":"s-1vcpu-1gb","networks":{"v4":[],"v6":[]},"region":{"name":"New York 1","slug":"nyc1","features":["backups","ipv6","metadata","install_agent","storage","image_transfer"],"available":true,"sizes":["s-1vcpu-1gb","s-1vcpu-1gb-intel","s-1vcpu-2gb","s-1vcpu-2gb-intel","s-2vcpu-2gb","s-2vcpu-2gb-intel","s-2vcpu-4gb","s-2vcpu-4gb-intel","s-4vcpu-8gb","c-2","c2-2vcpu-4gb","s-4vcpu-8gb-intel","g-2vcpu-8gb","gd-2vcpu-8gb","s-8vcpu-16gb","m-2vcpu-16gb","c-4","c2-4vcpu-8gb","s-8vcpu-16gb-intel","m3-2vcpu-16gb","g-4vcpu-16gb","so-2vcpu-16gb","m6-2vcpu-16gb","gd-4vcpu-16gb","so1_5-2vcpu-16gb","m-4vcpu-32gb","c-8","c2-8vcpu-16gb","m3-4vcpu-32gb","g-8vcpu-32gb","so-4vcpu-32gb","m6-4vcpu-32gb","gd-8vcpu-32gb","so1_5-4vcpu-32gb","m-8vcpu-64gb","c-16","c2-16vcpu-32gb","m3-8vcpu-64gb","g-16vcpu-64gb","so-8vcpu-64gb","m6-8vcpu-64gb","gd-16vcpu-64gb","so1_5-8vcpu-64gb","m-16vcpu-128gb","c-32","c2-32vcpu-64gb","m3-16vcpu-128gb","m-24vcpu-192gb","g-32vcpu-128gb","so-16vcpu-128gb","m6-16vcpu-128gb","gd-32vcpu-128gb","m3-24vcpu-192gb","g-40vcpu-160gb","so1_5-16vcpu-128gb","m-32vcpu-256gb","gd-40vcpu-160gb","so-24vcpu-192gb","m6-24vcpu-192gb","m3-32vcpu-256gb","so1_5-24vcpu-192gb"]},"tags":["Wget-tutorial"]},"links":{"actions":[{"id":1164336542,"rel":"create","href":"https://api.linux-console.net/v2/actions/1164336542"}]}}
Если вы видите вывод, похожий на приведённый выше, это означает, что вы успешно создали Droplet.
Теперь давайте получим список всех Droplets в вашей учетной записи, которые имеют тег Wget-tutorial. Выполните следующую команду:
- wget -qO-
- --header="Content-Type: application/json"
- --header="Authorization: Bearer $DO_TOKEN"
- "https://api.linux-console.net/v2/droplets?tag_name=Wget-tutorial"
Вы должны увидеть имя созданного вами Droplet в выводе:
{"droplets":[{"id":237171073,"name":"Wget-example","memory":1024,"vcpus":1,"disk":25,"locked":false,"status":"active","kernel":null,"created_at":"2021-03-16T12:38:59Z","features":["private_networking"],"backup_ids":[],"next_backup_window":null,"snapshot_ids":[],"image":{"id":72067660,"name":"20.04 (LTS) x64","distribution":"Ubuntu","slug":"ubuntu-20-04-x64","public":true,"regions":["nyc3","nyc1","sfo1","nyc2","ams2","sgp1","lon1","ams3","fra1","tor1","sfo2","blr1","sfo3"],"created_at":"2020-10-20T16:34:30Z","min_disk_size":15,"type":"base","size_gigabytes":0.52,"description":"Ubuntu 20.04 x86","tags":[],"status":"available"},"volume_ids":[],"size":{"slug":"s-1vcpu-1gb","memory":1024,"vcpus":1,"disk":25,"transfer":1.0,"price_monthly":5.0,"price_hourly":0.00744,"regions":["ams2","ams3","blr1","fra1","lon1","nyc1","nyc2","nyc3","sfo1","sfo3","sgp1","tor1"],"available":true,"description":"Basic"},"size_slug":"s-1vcpu-1gb","networks":{"v4":[{"ip_address":"10.116.0.2","netmask":"255.255.240.0","gateway":"","type":"private"},{"ip_address":"204.48.20.197","netmask":"255.255.240.0","gateway":"204.48.16.1","type":"public"}],"v6":[]},"region":{"name":"New York 1","slug":"nyc1","features":["backups","ipv6","metadata","install_agent","storage","image_transfer"],"available":true,"sizes":["s-1vcpu-1gb","s-1vcpu-1gb-intel","s-1vcpu-2gb","s-1vcpu-2gb-intel","s-2vcpu-2gb","s-2vcpu-2gb-intel","s-2vcpu-4gb","s-2vcpu-4gb-intel","s-4vcpu-8gb","c-2","c2-2vcpu-4gb","s-4vcpu-8gb-intel","g-2vcpu-8gb","gd-2vcpu-8gb","s-8vcpu-16gb","m-2vcpu-16gb","c-4","c2-4vcpu-8gb","s-8vcpu-16gb-intel","m3-2vcpu-16gb","g-4vcpu-16gb","so-2vcpu-16gb","m6-2vcpu-16gb","gd-4vcpu-16gb","so1_5-2vcpu-16gb","m-4vcpu-32gb","c-8","c2-8vcpu-16gb","m3-4vcpu-32gb","g-8vcpu-32gb","so-4vcpu-32gb","m6-4vcpu-32gb","gd-8vcpu-32gb","so1_5-4vcpu-32gb","m-8vcpu-64gb","c-16","c2-16vcpu-32gb","m3-8vcpu-64gb","g-16vcpu-64gb","so-8vcpu-64gb","m6-8vcpu-64gb","gd-16vcpu-64gb","so1_5-8vcpu-64gb","m-16vcpu-128gb","c-32","c2-32vcpu-64gb","m3-16vcpu-128gb","m-24vcpu-192gb","g-32vcpu-128gb","so-16vcpu-128gb","m6-16vcpu-128gb","gd-32vcpu-128gb","m3-24vcpu-192gb","g-40vcpu-160gb","so1_5-16vcpu-128gb","m-32vcpu-256gb","gd-40vcpu-160gb","so-24vcpu-192gb","m6-24vcpu-192gb","m3-32vcpu-256gb","so1_5-24vcpu-192gb"]},"tags":["Wget-tutorial"],"vpc_uuid":"5ee0a168-39d1-4c60-a89c-0b47390f3f7e"}],"links":{},"meta":{"total":1}}
Теперь давайте возьмем id созданного вами Droplet и используем его для удаления Droplet. Выполните следующую команду, заменив your_droplet_id на id вашего Droplet:
- wget --method=delete -qO-
- --header="Content-Type: application/json"
- --header="Authorization: Bearer $DO_TOKEN"
- "https://api.linux-console.net/v2/droplets/your_droplet_id"
В приведённой выше команде вы добавили ваш Droplet id в URL, чтобы удалить его. Если вы видите 204 No Content в выводе, это означает, что удаление Droplet прошло успешно.
В этом разделе вы использовали Wget для отправки нескольких заголовков. Затем вы создали и управляли Droplet в вашей учетной записи на Linux-Console.net.
Сервер загрузки веб-сайтов MCP (расширенное зеркалирование веб-сайтов на основе wget)
Сервер загрузки веб-сайтов MCP использует wget для создания высокоточных офлайн-копий веб-сайтов. Он сохраняет структуру, переписывает ссылки для локальной навигации и ограничивает охват выбранными вами доменами — идеально подходит для офлайн-документации, аудитов, учебных целей или планов восстановления после сбоев.
Предварительные требования для MCP
wgetустановлен (см. Требования выше).- Node.js (рекомендуется версия LTS) и
npmдля запуска сервера MCP. - Достаточно дискового пространства для целевого сайта (зеркала могут быстро увеличиваться).
Установите wget быстро
- macOS:
brew install wget - Debian/Ubuntu:
sudo apt-get update && sudo apt-get install -y wget - Fedora/RHEL:
sudo dnf install -y wget - Windows:
choco install wget(или скачайте автономный бинарный файл и добавьте его в PATH)
Установка и настройка (сервер)
# Clone the server git clone https://github.com/pskill9/website-downloader.git cd website-downloader # Install and build npm install npm run build
Добавьте сервер в настройки вашего клиента MCP (пример):
{ "mcpServers": { "website-downloader": { "command": "node", "args": ["/absolute/path/to/website-downloader/build/index.js"] } } }
Инструмент: download_website
Параметры (расширенное объяснение)
-
url(строка, обязательное поле) — Корневой URL сайта, который вы хотите скопировать. Это должна быть отправная точка для загрузки, например,https://example.com. Wget начнет обход и загрузку с этого адреса, следуя ссылкам в соответствии с указанной глубиной и другими параметрами. -
outputPath(строка, необязательно) — Каталог на вашем локальном компьютере, где будет сохранён зеркальный сайт. Если этот параметр не указан, по умолчанию будет использоваться текущий рабочий каталог. Указание собственного пути (например,/path/to/output) помогает держать ваши загрузки организованными и отделёнными от других файлов. -
depth(целое число, необязательно) — Максимальная глубина рекурсии при переходе по ссылкам от корневого URL. Это определяет, сколько уровней ссылок будет отслеживать wget:0: Загружать только указанную страницу, не переходя по ссылкам.
1: Загрузите страницу и все ресурсы, непосредственно с неё связанные (такие как изображения, файлы CSS и JavaScript, а также напрямую связанные страницы).2: Скачать страницу, её прямые ссылки и все ссылки, найденные на этих прямых ссылках (т.е. два уровня глубины).- Более высокие значения позволяют wget переходить по ссылкам глубже на сайте, потенциально скачивая большие части или весь сайт целиком. Используйте большую глубину с осторожностью, чтобы избежать чрезмерной загрузки, особенно на больших или сложных сайтах.
extraWgetArgs (массив строк, необязательно, для продвинутых пользователей) — (Если поддерживается вашим MCP-клиентом) Массив дополнительных аргументов командной строки wget для дальнейшей настройки процесса зеркалирования. Это может включать флаги для ограничения скорости, настройки User-Agent, исключения определённых типов файлов или обработки аутентификации. Используйте это только если вы понимаете последствия каждого флага, так как неправильное использование может привести к неполным или чрезмерно широким загрузкам.
Пример использования:
Некоторые клиенты MCP могут поддерживать расширенную полезную нагрузку с
extraWgetArgs(массив строк) для передачи дополнительных флаговwget(см. раздел Расширенное управление ниже). Используйте это только в том случае, если ваш клиент поддерживает прямую передачу аргументов.
Быстрый старт (мелкое зеркало)
Запрос (JSON-пакет):
{ "url": "https://example.com", "outputPath": "/path/to/output", "depth": 1 }
Под капотом сервер формирует безопасную команду, подобную следующей:
wget --recursive --level 1 --page-requisites --convert-links --adjust-extension --no-parent --domains example.com --directory-prefix "/path/to/output" https://example.com
Какие типы флагов используются с wget
-r/--recursive: Включает рекурсивную загрузку, позволяя wget следовать по ссылкам и загружать не только указанную страницу, но и связанные страницы и ресурсы. Это необходимо для создания полной копии сайтов или их разделов.-l/--level <depth>: Устанавливает максимальную глубину рекурсии. Например,-l 1загружает главную страницу и все напрямую связанные ресурсы, в то время как более высокие значения позволяют wget следовать ссылкам дальше. Используйте с осторожностью, чтобы избежать загрузки слишком большого объема контента.--page-requisites: Обеспечивает загрузку всех ресурсов, необходимых для корректного отображения каждой HTML-страницы (таких как изображения, CSS и JavaScript файлы). Это делает просмотр в режиме офлайн точным и полноценным.--convert-links: После загрузки переписывает ссылки в загруженных HTML-файлах так, чтобы они указывали на локальные копии вместо исходных URL-адресов. Это важно для беспроблемного офлайн-просмотра.--adjust-extension: Изменяет расширения загруженных файлов так, чтобы они соответствовали типу содержимого (например, добавляет.htmlк HTML-файлам). Это помогает браузерам правильно открывать файлы с локальной копии.--no-parent: Предотвращает поднятие wget к родительским каталогам выше начального URL. Это ограничивает загрузку указанным деревом каталогов, избегая ненужных файлов из верхних уровней структуры сайта.--domains <список>: Ограничивает загрузку указанными доменами. Это предотвращает переход wget по ссылкам на внешние сайты, сохраняя зеркальную копию организованной и управляемой.
Эти флаги работают вместе, чтобы создать точную, навигационную офлайн-версию сайта, одновременно предоставляя вам контроль над областью охвата и использованием ресурсов.
Вежливая полная зеркальная копия сайта (с ограничением скорости)
Полезная нагрузка (если поддерживается передача extraWgetArgs):
{ "url": "https://docs.example.org", "outputPath": "/srv/mirrors/docs-example", "depth": 5, "extraWgetArgs": ["--wait=1", "--random-wait", "--limit-rate=200k"] }
Это учитывает нагрузку на сервер с помощью --wait/--random-wait и ограничивает пропускную способность с помощью --limit-rate.
Аутентификация (куки и заголовки)
Если сайт требует доступ через сессию или заголовки:
-
Куки: сначала получите куки (через вход в систему) и укажите wget на них:
# Example: reuse a saved cookie jar wget --recursive -l 2 --convert-links --page-requisites --adjust-extension --no-parent --load-cookies /path/to/cookies.txt --directory-prefix "/path/to/output" https://portal.example.com/docs -
Заголовки: передавайте заголовки (например, токены) с помощью
--header:wget --recursive -l 2 --convert-links --page-requisites --adjust-extension --no-parent --header "Authorization: Bearer $TOKEN" --directory-prefix "/path/to/output" https://secure.example.com/knowledge-base
Если ваш MCP-клиент поддерживает extraWgetArgs, вы можете передать эти флаги через полезную нагрузку.
Активы и контроль области между доменами
Если изображения или CSS размещены на CDN, тогда:
-
Сохраняйте зеркало однодоменным (по умолчанию) и разрешайте недействительным внешним ссылкам обновляться онлайн при подключении; или
-
Расширяйте область действия на определенные хосты с помощью
--domainsи--span-hostsосторожно:wget -r -l 2 --convert-links --page-requisites --adjust-extension --no-parent --span-hosts --domains example.com,static.examplecdn.com --directory-prefix "/path/to/output" https://example.com
Используйте --reject, чтобы исключить большие или несущественные пути (например, /videos/, /search), и --accept, чтобы сосредоточиться на определённых типах (.html,.css,.js,.png).
Проверка и локальный запуск зеркала
После запуска откройте локальный файл index.html в директории outputPath в браузере. При желании можно запустить его с сервера:
cd /path/to/output/example.com python3 -m http.server 8080
Затем откройте http://localhost:8080.
Расширенное управление (через extraWgetArgs)
Если эта функция включена вашим клиентом MCP, вы можете передавать проверенные флаги для точного управления:
- Производительность/Вежливость:
--wait=SECONDS,--random-wait,--limit-rate=200k - Область применения:
--domains,--reject,--accept,--no-parent,--level N - Надежность:
--tries=8,-T 10,-c(возобновление),--timeout=10,--retry-connrefused - Именование/Совместимость:
--restrict-file-names=windows,--adjust-extension - TLS/Прокси:
--ca-certificate=/path/ca.crt, переменные окруженияhttp_proxy/https_proxy
Используйте только те флаги, которые вы понимаете. Слишком широкие настройки (например,
--span-hostsбез--domains) могут привести к резкому увеличению области охвата и использования диска.
Устранение неполадок (контекст MCP)
- Пустые/частичные страницы: Часто это содержимое, сгенерированное с помощью JS. Wget не является безголовым браузером; зеркальте маршруты, отрендеренные на сервере, или экспортируйте статический контент из сборки сайта.
- Отсутствует CSS/изображения: Проверьте ресурсы с других доменов; добавьте
--span-hostsс точным списком--domains. Убедитесь, что--page-requisitesвключен. - 403/401: Предоставьте cookies/заголовки. Некоторые сайты блокируют стандартные user-agent — попробуйте
--user-agent="WgetMirror/1.0". - 429/превышение лимита запросов: Добавьте
--wait/--random-waitи уменьшите--limit-rate. - Корпоративный TLS: Импортируйте прокси CA и используйте
--ca-certificate=…(см. Расширенные операции для редких случаев).
Этика, соответствие требованиям и безопасность
Уважайте robots.txt и условия обслуживания. Получайте разрешение на доступ к закрытому контенту. Используйте вежливые задержки и ограничения по частоте запросов. Храните зеркала внутри системы, если лицензия ограничивает перераспределение. Ведите журнал действий для аудита.
Продвинутые операции с крайними случаями в Wget
Обработка корпоративной перехватки TLS с помощью пользовательского сертификата CA
В корпоративных средах подключения TLS могут не работать, так как прокси перехватывают HTTPS-трафик. Чтобы это исправить, импортируйте корневой сертификат прокси и укажите Wget использовать его:
wget --ca-certificate=/etc/ssl/certs/corp-proxy-ca.crt https://secure.example.com/data.json
Держите пакеты сертификатов CA в актуальном состоянии (update-ca-certificates на Debian/Ubuntu) и убедитесь, что системные часы синхронизированы (timedatectl set-ntp true), чтобы избежать ошибок при установке соединения.
Обработка ответов, отличных от 2xx, и кодов выхода
Wget устанавливает коды выхода, которые вы можете проверять в скриптах:
0=успех4=сбой сети8=сервер вернул ошибку (код ответа не 2xx). Используйте--server-responseили--spider, чтобы протестировать конечные точки:
wget --spider --server-response https://api.example.com/v1/health || echo "API down"
В CI/CD проверьте $?, чтобы останавливать сборки при постоянных сбоях.
Примечания по идемпотентности для PUT и DELETE
API, которые принимают PUT или DELETE, могут вести себя по-разному при повторных попытках. Wget может отправлять эти методы с помощью --method:
wget --method=PUT --body-data '{"name":"update"}' --header="Content-Type: application/json" --header="Authorization: Bearer $DO_TOKEN" https://api.example.com/v1/resource/42
Убедитесь, что конечная точка API является идемпотентной — это означает, что повторные запросы не создадут дубликаты записей или нежелательные удаления. Для безопасности проверьте документацию API или используйте PATCH, если это поддерживается.
Проверка целостности больших загружаемых файлов
После загрузки больших изображений или резервных копий проверьте контрольные суммы, чтобы избежать повреждений:
wget -O ubuntu.img https://releases.ubuntu.com/24.04/ubuntu-server.img wget -O ubuntu.img.sha256 https://releases.ubuntu.com/24.04/ubuntu-server.img.sha256 sha256sum -c ubuntu.img.sha256
Это гарантирует, что файл соответствует подписи издателя перед использованием в производстве. Для автоматизации интегрируйте проверку контрольной суммы в ваши скрипты, чтобы неверные проверки вызывали уведомления.
Сравнение производительности: Wget в реальном мире
В этом разделе приводится повторяемый способ измерения производительности Wget и влияния таких параметров, как --limit-rate, -c (возобновление) и повторные попытки/тайм‑ауты. Мы будем собирать реальное время, использование CPU и памяти с помощью /usr/bin/time и сохранять команды удобными для CI.
Что вы будете измерять
- Базовая пропускная способность для новой загрузки
- Загрузка с ограничением пропускной способности с
--limit-rate - Возобновить выполнение с
-cпосле прерванной передачи - Пределы повторных попыток/тайм-аута для ненадежных конечных точек
Замените пример URL на любой крупный общедоступный файл, который ваша организация одобряет для тестирования производительности.
Настройка (Временное рабочее пространство)
TMPDIR="$(mktemp -d)"; cd "$TMPDIR" TEST_URL="https://speed.hetzner.de/100MB.bin" # sample 100MB object OUT="test.bin"
Метрический формат
Мы будем использовать GNU time для получения согласованных метрик:
/usr/bin/time -f 'wall=%E user=%U sys=%S rss=%MKB exit=%x' <command>
- стена: прошедшее время (чч:мм:сс)
- пользователь/система: время ЦП в пользовательском/системном пространстве
- rss: пик используемой памяти процесса (КБ)
- выход: код завершения процесса
1) Базовая загрузка (без ограничения скорости)
/usr/bin/time -f 'wall=%E user=%U sys=%S rss=%MKB exit=%x' wget -q --show-progress -O "$OUT" "$TEST_URL" ls -lh "$OUT"
Интерпретация: Это ваша исходная сеть и показатель диска в текущих условиях.
2) Ограниченная по пропускной способности загрузка (--limit-rate)
Ограничьте скорость до ~200 КБ/с, чтобы сохранить ресурсы для других задач:
rm -f "$OUT" /usr/bin/time -f 'wall=%E user=%U sys=%S rss=%MKB exit=%x' wget -q --show-progress --limit-rate=200k -O "$OUT" "$TEST_URL"
Интерпретация: Ожидается значительно большее время выполнения с предсказуемо низким влиянием на другие сервисы.
3) Продолжить после прерывания (-c)
Начните загрузку и прервите посередине (Ctrl‑C), затем возобновите:
rm -f "$OUT" wget --limit-rate=1m -O "$OUT" "$TEST_URL" & PID=$!; sleep 3; kill -INT "$PID" 2>/dev/null || true # Resume (server must support ranges) /usr/bin/time -f 'wall=%E user=%U sys=%S rss=%MKB exit=%x' wget -q --show-progress -c -O "$OUT" "$TEST_URL"
Интерпретация: Продолжение загрузки должно показывать короткое время выполнения по сравнению с полной повторной загрузкой и пропускать уже полученные байты.
4) Ограниченные повторные попытки для нестабильных конечных точек
Покажите, как --tries + -T предотвращают зависания:
BAD_URL="https://example.invalid/bogus.bin" /usr/bin/time -f 'wall=%E user=%U sys=%S rss=%MKB exit=%x' wget --spider --tries=3 -T 5 "$BAD_URL" || echo "bounded failure (as expected)"
интерпретация: Время стены должно быть ~ попытки × Timeout (плюс DNS/Connect Overh Hear). Код выхода, не нулевой, ожидается и должен провалиться рано.
Запись результатов (CSV для CI)
Добавьте ключевые метрики в легкий CSV-файл:
SCENARIO="baseline"; SIZE="$(stat -c%s "$OUT" 2>/dev/null || echo 0)" /usr/bin/time -f "$SCENARIO,%E,%U,%S,%M,%x" -o results.csv -a true # Repeat with SCENARIO=limit, resume, flaky (adjust commands accordingly) echo "scenario,wall,user,sys,rss_kb,exit" | cat - results.csv | tee results.csv
Сохраните results.csv как артефакт CI для анализа тенденций.
Необязательно: Эмуляция WAN или потери пакетов (Дополнительно)
Если вы можете использовать tc netem (Linux) на лабораторном хосте:
# add latency and 1% loss on egress of eth0 (requires sudo) sudo tc qdisc add dev eth0 root netem delay 120ms loss 1% # run the baseline test again, then remove shaping: sudo tc qdisc del dev eth0 root
Интерпретация: Сравните фактическое время выполнения и поведение повторных попыток в неблагоприятных условиях, чтобы проверить ваши флаги.
Заключения о лучших практиках
- Используйте
--limit-rate, чтобы сохранить пропускную способность, особенно на общих сборочных агентах. - Предпочтительно использовать
-cдля возобновления загрузки больших артефактов; проверьте поддержку диапазонов на сервере. - Всегда используйте
--triesвместе с-T, чтобы ограничить время неудачи. - Записывайте версии инструментов и results.csv в CI для обоснованных SLO.
Реализация: Ежедневная автоматизация Wget (готово для Cron)
Этот пример «от начала до конца» показывает, как надежно загружать пакеты активов каждый день и уведомлять API после завершения. Он использует лучшие практики из этого руководства: -qO- для чистых логов, -c для возобновления, --tries + -T для устойчивости и $DO_TOKEN для аутентификации.
Что вы создадите
- Скрипт, который читает URL-адреса из
files.txt, возобновляет частично загруженные файлы и записывает их в/var/backups/assets. - Надёжные настройки повторов/тайм-аутов для нестабильных сетей.
- Необязательный POST-запрос к вашему серверу для сигнала о завершении.
Настройка
Создайте список URL-адресов (по одному в строке):
sudo mkdir -p /var/backups/assets sudo tee /var/backups/assets/files.txt >/dev/null <<'EOF' https://example.com/static/manual.pdf https://example.com/assets/logo.png https://jsonplaceholder.typicode.com/posts?_limit=25 EOF
Экспортируйте ваш токен один раз за сессию (используйте CI/хранилище секретов в продакшене):
export DO_TOKEN="paste-your-token-here"
Скрипт (/usr/local/bin/wget-daily-sync.sh)
#!/usr/bin/env bash set -euo pipefail ASSET_DIR="/var/backups/assets" URL_LIST="${ASSET_DIR}/files.txt" LOG_FILE="/var/log/wget-sync.log" mkdir -p "${ASSET_DIR}" # Download all assets with resilience and clean logs wget --continue --input-file="${URL_LIST}" --directory-prefix="${ASSET_DIR}" --tries=8 -T 10 -q --show-progress 2>>"${LOG_FILE}" # Optional: notify your backend (replace with your endpoint) if [[ -n "${DO_TOKEN:-}" ]]; then wget -qO- --method=post --header="Authorization: Bearer ${DO_TOKEN}" --header="Content-Type: application/json" --body-data "{"synced":"$(date -Is)","count":$(wc -l < "${URL_LIST}")}" https://api.example.com/v1/sync >/dev/null fi
Сделайте это исполняемым:
sudo install -m 0755 ./wget-daily-sync.sh /usr/local/bin/wget-daily-sync.sh
Расписание с помощью Cron (запускается ежедневно в 02:15)
sudo crontab -e
Добавить :
15 2 * * * /usr/local/bin/wget-daily-sync.sh
Проверить
- Проверьте загруженные файлы:
ls -lah /var/backups/assets - Проверить журналы:
sudo tail -n 100 /var/log/wget-sync.log - Проверьте обратный вызов (если включен): бэкэнд должен записывать отметку времени
syncedи значениеcount.
Безопасность: избегайте жёсткого кодирования токенов в скриптах. Используйте внедрение через окружение (файл EnvironmentFile в systemd, секреты CI или хранилище). Содержимое /var/log/wget-sync.log должно быть доступно только администраторам, если оно может содержать сведения об ошибках.
Дальнейшее обучение
- Linux Commands hub — основы, которые вы будете использовать с wget и curl.
- Рабочий процесс: Загрузка файлов с помощью curl — Дополнительные схемы и флаги.
- Токены API Linux-Console.net — Создавайте и управляйте своим токеном безопасно.
Ссылки
- Руководство GNU Wget — Полный справочник по флагам, опции HTTP/HTTPS и поведение.
- JSONPlaceholder — это Mock REST API, используемый для примеров.
Часто задаваемые вопросы (ЧЗВ)
1. Как безопасно использовать Wget в CI/CD пайплайнах?
При использовании Wget в CI/CD предпочтительно использовать -qO- для чистых логов и всегда сочетать --tries с -T, чтобы предотвратить зависание сборок. Храните токены в переменных окружения, таких как $DO_TOKEN, вместо того чтобы вставлять их напрямую в скрипты. Фиксируйте wget --version, чтобы обеспечить воспроизводимость между запусками. Это обеспечивает безопасную, детерминированную автоматизацию, которой можно доверять аудиторам и коллегам.
2. Может ли Wget безопасно обрабатывать аутентификацию API?
Да. Wget поддерживает --header для токенов, cookies и пользовательских заголовков. Наилучшая практика — экспортировать свой токен (export DO_TOKEN="...") и затем передавать его с помощью --header="Authorization: Bearer $DO_TOKEN". Это предотвращает утечку секретов в истории команд и логах. Для производственных систем токены следует внедрять с помощью секретов CI или файла EnvironmentFile системы systemd.
3. В чем разница между Wget и curl для работы с API?
Используйте Wget для надежных загрузок, фоновых передач и простых API-вызовов с повторными попытками. Используйте curl, когда нужны расширенные функции HTTP/2, мультичастные формы или сложные процессы аутентификации, такие как OAuth. Хорошее правило: «скачать N файлов → Wget; обрабатывать сложные API-вызовы → curl.» Многие команды комбинируют оба инструмента в зависимости от задачи.
4. Как я могу исправить проблемы с SSL-сертификатом или SSL connect error в Wget?
Ошибки SSL часто возникают из-за устаревших сертификатов CA, рассогласования времени или корпоративных прокси, перехватывающих TLS. Выполните sudo update-ca-certificates и sudo timedatectl set-ntp true, чтобы обновить хранилища доверия и время. В корпоративной среде импортируйте сертификат вашего прокси и используйте --ca-certificate=/path/to/ca.crt. Эти шаги соответствуют практикам безопасности предприятий и требованиям соответствия.
5. Может ли Wget красиво форматировать или фильтровать ответы JSON API?
По умолчанию Wget только загружает данные. Для разбора или красивого форматирования JSON используйте его вместе с такими инструментами, как jq. Например:
wget -qO response.json --header="Accept: application/json" https://jsonplaceholder.typicode.com/posts?_limit=2 jq . response.json
Этот гибридный подход позволяет форматировать, фильтровать и проверять данные API прямо в конвейерах.
6. Как использовать Wget за корпоративным прокси?
Установите переменные прокси перед запуском Wget:
export http_proxy="http://proxy.corp:3128" export https_proxy="http://proxy.corp:3128"
Вы также можете задать собственный пользовательский агент или сохранять cookies для сессий. Эта гибкость обеспечивает работу Wget даже в строго контролируемых корпоративных сетях.
7. Как автоматизировать ежедневные загрузки и вызовы API с помощью Wget?
Создайте скрипт, который читает URL-адреса из файла, использует флаги --continue и повторной попытки, и ведет журнал в файл. Затем запланируйте его выполнение с помощью cron или таймеров systemd. При необходимости добавьте POST-обратный вызов в вашу backend-систему с использованием $DO_TOKEN для аутентификации. Этот шаблон, показанный в разделе Реализация, обеспечивает готовый к производству, проверяемый рабочий процесс, на который команды эксплуатации могут полагаться.
Заключение
В этом учебном пособии вы использовали Wget для загрузки файлов в условиях стабильного и нестабильного сетевого соединения и взаимодействовали с REST API-эндпоинтами. Затем вы применили эти знания для создания и управления Droplet в вашей учетной записи Linux-Console.net. Для получения полной информации о возможностях и расширенных параметрах использования см. официальный справочник GNU Wget. Готовы применить эти команды на практике? Запускайте свои автоматизации на Droplet в Linux-Console.net и начните создавать надежные рабочие процессы, готовые к использованию в продакшене уже сегодня.
Спасибо, что учитесь вместе с сообществом Linux-Console.net.



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