ServerAID
Найти гайд, команду, тег… ⌘ K
Shell и скрипты

wget на Linux: скачивание файлов, дозакачка и зеркало сайта

wget — стандартная утилита Linux для скачивания файлов по HTTP, HTTPS и FTP. Умеет дозакачивать прерванное, ходить рекурсивно по ссылкам, ограничивать скорость и работать без интерактива — поэтому это базовый инструмент скриптов установки, скачивания дистрибутивов и зеркалирования сайтов.

wget: скачиваем файлы и сайты из командной строки

wget — стандартная утилита Linux для скачивания файлов по HTTP, HTTPS и FTP. Умеет дозакачивать прерванное, ходить рекурсивно по ссылкам, ограничивать скорость и работать без интерактива — поэтому это базовый инструмент скриптов установки, скачивания дистрибутивов и зеркалирования сайтов.

wget vs curl

Обе утилиты качают по HTTP, но решают разные задачи:

  • wget — заточен под скачивание файлов и зеркалирование сайтов. По умолчанию сохраняет в файл, поддерживает дозакачку, рекурсивный обход. Прост и предсказуем для скриптов.
  • curl — швейцарский нож для HTTP-запросов: GET, POST, PUT, заголовки, cookie, отладка. Сохраняет в stdout по умолчанию (чтобы получить файл — curl -O url). Незаменим для работы с API.

Когда брать wget:

  • Скачать ISO дистрибутива, архив, бинарь.
  • Запустить дозакачку прерванной загрузки.
  • Сделать оффлайн-копию сайта.
  • В скриптах автоматизации — лаконичнее и понятнее, чем curl.

Когда брать curl:

  • Дёргать API (POST с JSON-телом, заголовки, токены).
  • Отладка HTTP-запросов с подробным выводом (-v).
  • Один-страничные операции (часто curl -fsSL url | bash для install-скриптов).

На Ubuntu обе утилиты ставятся: sudo apt install -y wget curl.

Базовый синтаксис

wget <url>

Пример — скачать ISO Ubuntu Server:

wget https://releases.ubuntu.com/24.04/ubuntu-24.04.1-live-server-amd64.iso

По умолчанию wget:

  • Сохраняет файл с тем именем, что в URL.
  • Показывает прогресс в терминале.
  • Выходит после скачивания одного файла.

Сохранить под другим именем:

wget -O ubuntu.iso https://releases.ubuntu.com/24.04/ubuntu-24.04.1-live-server-amd64.iso

-O (ох, прописная) переопределяет имя выходного файла. -O - пишет в stdout — полезно для пайпов: wget -qO- https://example.com/script.sh | bash.

Топ-флаги

Флаг Что делает
-c продолжить прерванную загрузку (resume)
-O <file> сохранить под указанным именем
-P <dir> сохранять в указанный каталог
-q quiet — без прогресса и сообщений
-nv non-verbose — короткий итог вместо прогресса
--limit-rate=2M ограничить скорость скачивания (KB/s или M, K)
-t N количество попыток при ошибке (по умолчанию 20)
--retry-connrefused повторять при Connection refused
-T N таймаут на одно соединение (секунды)
-U "..." подставить свой User-Agent
--header="..." добавить произвольный HTTP-заголовок
--no-check-certificate пропустить проверку SSL (опасно!)
-r рекурсивный режим (для сайтов)
-i <file> список URL из файла

Хорошее сочетание для прода:

wget -c -t 0 --retry-connrefused -T 30 -U "MyDownloader/1.0" \
  https://example.com/big-file.tar.gz

-t 0 — бесконечные попытки, --retry-connrefused — повторять при отказе соединения, -T 30 — таймаут 30 сек на блок.

Дозакачка прерванного файла

Один из главных аргументов в пользу wget. Если соединение оборвалось, можно продолжить с того же места:

wget -c https://example.com/big-file.tar.gz

-c (--continue) проверит размер локального файла и попросит сервер выслать данные с этого байта (Range: bytes=N-). Сервер должен поддерживать Range-запросы — большинство файл-хостингов поддерживают, но стриминг или динамическая генерация — нет.

Если файл с тем же именем уже скачан полностью — -c ничего не сделает. Если локальный больше серверного — wget выдаст предупреждение и не тронет файл.

Скачивание списка файлов

# urls.txt
https://example.com/file1.tar.gz
https://example.com/file2.tar.gz
https://example.com/file3.tar.gz
wget -i urls.txt

Полезно для пакетной загрузки релизов, образов VM, бэкапов. Можно комбинировать с -c для устойчивости к сетевым сбоям.

Рекурсивное скачивание (зеркало сайта)

-r ходит по ссылкам и забирает все связанные ресурсы:

wget --mirror --convert-links --adjust-extension --page-requisites \
  --no-parent https://example.com/docs/

Что делает каждый флаг:

  • --mirror — короткий синоним для -r -N -l inf --no-remove-listing: рекурсивно, с timestamping, без ограничения глубины.
  • --convert-links — после скачивания переписать ссылки в HTML на относительные, чтобы сайт работал оффлайн.
  • --adjust-extension — добавить .html к URL без расширения, чтобы файлы открывались браузером.
  • --page-requisites — забрать CSS, JS, картинки.
  • --no-parent — не уходить выше указанного каталога. Без него wget может зацепить весь сайт.

Важно: рекурсивный wget уважает robots.txt по умолчанию. Если сайт его запрещает, нужен -e robots=off. Но прежде чем это включать — убедитесь, что вы не нарушаете правила сайта; некоторые ресурсы блокируют агрессивных скрейперов.

Ограничение скорости

На рабочем сервере не хочется забивать канал:

wget --limit-rate=2M --wait=1 --random-wait \
  https://example.com/big-iso.img
  • --limit-rate=2M — не больше 2 МБ/с.
  • --wait=1 — пауза 1 сек между запросами (для рекурсивного режима).
  • --random-wait — рандомизация паузы вокруг wait ±50%, чтобы не выглядеть ботом.

Авторизация

HTTP Basic Auth (логин/пароль в заголовке):

wget --user=alice --password=secret https://example.com/private/file.tar

Минус: пароль попадёт в ps aux и историю shell. Лучше через .wgetrc:

# ~/.wgetrc
http_user = alice
http_password = secret
chmod 600 ~/.wgetrc

Загрузка с поддержкой cookie (например, после логина в браузере):

wget --load-cookies cookies.txt https://example.com/account/file.zip

Файл cookies.txt можно экспортировать расширением браузера (Cookie-Editor, EditThisCookie).

Bearer token (часто для API):

wget --header="Authorization: Bearer $TOKEN" https://api.example.com/file

Через прокси

wget -e use_proxy=yes -e http_proxy=http://proxy.example.com:8080 \
  https://example.com/file.tar

Постоянная настройка — переменные окружения:

export http_proxy=http://proxy.example.com:8080
export https_proxy=http://proxy.example.com:8080
wget https://example.com/file.tar

Скрипты с wget

Стандартный паттерн установки софта по инструкции:

# Безопасный (с проверкой подписи)
wget https://download.example.com/release.tar.gz
wget https://download.example.com/release.tar.gz.sig
gpg --verify release.tar.gz.sig release.tar.gz
tar xf release.tar.gz

# Не безопасный (часто встречается, но рискованно)
wget -qO- https://example.com/install.sh | bash

Никогда не запускайте wget | bash без проверки источника — это эквивалент исполнения произвольного кода с ваших прав. Для критичной автоматизации сначала качайте, проверяйте подпись, потом запускайте.

В качестве альтернативы для установки софта на Ubuntu — нативный apt с подключённым репозиторием через ключ в /etc/apt/keyrings/.

Грабли wget

  • HTTPS-сертификаты. Если сервер с самоподписным сертификатом, wget отвалится с ошибкой. Не добавляйте --no-check-certificate бездумно — лучше положите CA-сертификат в /usr/local/share/ca-certificates/ и sudo update-ca-certificates.
  • Перенаправления. Современные сайты часто отдают Set-Cookie через 302-редирект. wget по умолчанию следует редиректам, но не сохраняет куки между ними — для сложных случаев берите curl --cookie-jar.
  • HTTP/2 и HTTP/3. wget из репозитория Ubuntu поддерживает только HTTP/1.1. Для HTTP/2 на современных CDN качество может быть ниже, чем у curl --http2 или aria2c.
  • Пробелы и спецсимволы в URL. Оборачивайте URL в одинарные кавычки: wget 'https://example.com/file with spaces.zip'. Иначе шелл интерпретирует пробел как разделитель аргументов.

Альтернативы wget

  • curl — для HTTP-запросов, API, отладки. Если нужны сложные заголовки или метод POST — берите curl.
  • aria2c — многопоточная загрузка, разбивает файл на части и качает параллельно. Заметно быстрее на больших файлах. sudo apt install aria2.
  • axel — то же самое, проще; почти не развивается, но работает.
  • httpie — современный «wget/curl с человеческим лицом», JSON-friendly. Удобен для отладки API.

Для скриптов и образов в контейнерах остаётся wget — он стандартен.

Частые вопросы

Что такое wget в Linux

Утилита для скачивания файлов по HTTP/HTTPS/FTP из командной строки. Работает неинтерактивно — подходит для скриптов и cron-задач. Главные фичи: дозакачка прерванного через -c, рекурсивный обход через --mirror, поддержка прокси и cookie.

Чем wget отличается от curl

wget заточен под скачивание файлов и зеркалирование сайтов: лаконичный синтаксис, дозакачка, рекурсивный обход. curl — швейцарский нож для HTTP-запросов: API, POST, кастомные заголовки, отладка. Для скриптов скачивания берите wget; для работы с API — curl.

Как продолжить прерванную загрузку wget

Флаг -c (--continue). Запустите ту же команду с -c, и wget попросит сервер выслать данные с того места, где оборвалось. Сервер должен поддерживать Range-запросы — большинство современных файл-хостингов поддерживают.

Как скачать сайт целиком через wget

wget --mirror --convert-links --adjust-extension --page-requisites --no-parent <URL>. Это сделает оффлайн-копию: рекурсивно пройдёт по всем ссылкам внутри указанного пути, заберёт CSS/JS/картинки и переведёт ссылки в относительные.

Как ограничить скорость wget

Флаг --limit-rate=KB|M. Например, --limit-rate=2M — не больше 2 МБ/с. Полезно на рабочем сервере, чтобы не забить канал. Для рекурсивных загрузок добавляйте --wait=1 --random-wait.

Как использовать wget через прокси

wget -e use_proxy=yes -e http_proxy=http://proxy.example.com:8080 <URL>. Или через переменные окружения: export http_proxy=... и export https_proxy=... — wget подхватит их автоматически.

Безопасно ли использовать wget --no-check-certificate

Нет. Этот флаг отключает проверку SSL — открывает атаку man-in-the-middle. Если сервер с правильным сертификатом — флаг не нужен. Если с самоподписным — лучше добавить CA в систему через update-ca-certificates, а не отключать проверку.

Что запомнить

  • Базовый синтаксис: wget <url>. Под другим именем — wget -O name url. В каталог — wget -P /path url.
  • Дозакачка прерванного — wget -c <url>. Это главное преимущество wget над cp/scp.
  • Зеркало сайта — wget --mirror --convert-links --page-requisites --no-parent. Уважайте robots.txt.
  • В скриптах для устойчивости: -c -t 0 --retry-connrefused -T 30.
  • wget | bash без проверки — эквивалент запуска чужого кода с вашими правами. Качайте, проверяйте, потом исполняйте.
  • Для API и POST-запросов — берите curl, не wget.

Обложка: фото Markus Spiske с Unsplash, лицензия Unsplash.

Похожие материалы

Shell и скрипты

sed на Linux: замена строк, правка in-place и регулярки

sed (stream editor) — стандартная команда Linux для построчной обработки текста: замена, удаление, печать строк по шаблону. Работает с потоком (pipe) или файлами, поддерживает in-place редактирование. Базовый инструмент шелл-скриптов после `grep` и `awk`.

Редакция
Shell и скрипты

bash массивы: создание, перебор, ассоциативные и грабли с IFS

В bash есть два типа массивов: индексированные (нумерованные) и ассоциативные (хеши). Разбираем создание, чтение элементов, перебор, slicing, добавление/удаление, передачу в функцию и главные грабли — кавычки, `$@` vs `$*`, разделитель IFS. Конструкции на bash 5+, который идёт по умолчанию на Ubuntu 22.04 / 24.04.

Редакция
Shell и скрипты

bash if else elif fi: условия в скриптах с примерами

Условие в bash — это `if [[ … ]]; then … fi`. Разбираем разницу между `[[ ]]` и `[ ]`, сравнение строк и чисел, проверки файлов через `-f`/`-d`/`-x`, цепочки `elif`, связку через `&&`/`||` и боевые примеры из реальных скриптов: проверка root, проверка существования файла, проверка наличия команды.

Редакция
bash — что это и зачем
Глоссарий

bash — что это и зачем

bash (Bourne Again SHell) — это командная оболочка, которая обрабатывает то, что вы вводите в терминале Linux. Запускает программы, расширяет переменные, выполняет конструкции `if` / `for`, читает скрипты из файлов с шебангом `#!/bin/bash`. На Ubuntu — оболочка по умолчанию для интерактивных пользователей; для системных скриптов используют более строгий `/bin/sh` (`dash`).

Редакция