wget — нестареющий инструмент: одна команда, никакого интерактивного интерфейса, предсказуемое поведение в скриптах. Он умеет докачивать оборванные файлы, рекурсивно скачивать каталог по ссылкам, работать с cookies и токенами, а по коду возврата позволяет понять, что именно пошло не так. Ниже — практика для повседневных задач: от скачивания ISO до архива собственной документации.
Установка и базовая проверка
В большинстве дистрибутивов wget уже есть. Если нет:
sudo apt install wget
wget --version | head -n 1
wget -O /dev/null https://example.com/
Последняя команда скачивает страницу в никуда: удобно проверить DNS, TLS и доступность, не создавая файлов. Флаг -O задаёт имя, -O - выводит содержимое в stdout — так wget используют в конвейерах.
Докачка, скорость и таймауты
Для больших файлов всегда включайте -c: wget отправит запрос с диапазоном и продолжит с места обрыва. Без этого файл начнётся заново.
wget -c https://mirror.example.org/debian.iso
wget --limit-rate=2M -c https://mirror.example.org/debian.iso
wget -t 5 -T 30 --waitretry=10 https://example.org/big.tar.zst
wget -q --show-progress -c https://example.org/big.tar.zst
-t — число попыток, -T — таймаут в секундах, --waitretry — пауза между повторами. В неинтерактивных скриптах -q убирает прогресс, но --show-progress возвращает его, не засоряя лог. Ограничение скорости полезно на общем канале: --limit-rate=500k понимает суффиксы k и m.
Скачивание набора URL и фильтры
Список ссылок можно держать в файле — по одной на строку. Комментарии начинаются с решётки. Это удобно для пакетного скачивания документации или обновлений.
wget -i urls.txt -P ~/Downloads
wget -r -l 2 -np -A pdf,zip -P ~/docs https://docs.example.org/manual/
wget --spider -S https://example.org/file.tar.gz
-P задаёт каталог, -i — файл со списком. --spider не скачивает тело, а только проверяет наличие; вместе с -S показывает заголовки ответа, включая Content-Length и Last-Modified. Флаги -A и -R фильтруют по расширениям, --accept-regex — по регулярному выражению.
Ещё несколько флагов из той же серии. -nc не перезаписывает существующие файлы, --content-disposition берёт имя из заголовка ответа, --trust-server-names использует имя из последнего перенаправления. Если сайт доступен только по IPv4, помогает -4; обратная ситуация — -6.
Зеркало сайта: что важно и чего делать не стоит
Рекурсивное скачивание применяйте к своим сайтам, документации с разрешением правообладателя и открытым данным. Чужой контент, закрытые разделы и материалы с платным доступом зеркалировать нельзя — это нарушает авторские права и условия использования. По умолчанию wget уважает robots.txt, и отключать эту проверку без необходимости не нужно.
wget --mirror --convert-links --page-requisites --no-parent https://my-site.example/
wget -r -np -nH --cut-dirs=2 -k -E https://my-site.example/docs/v2/
wget -r -np -R '*.jpg,*.png' -A '*.html' https://my-site.example/
--mirror— рекурсия без ограничения глубины плюс сохранение меток времени.-np— не подниматься выше начального каталога. Без него можно утащить весь домен.-k— переписать ссылки для локального просмотра,-E— добавить расширение.html.-p— докачать картинки, CSS и скрипты, без которых страница выглядит голой.--cut-dirsи-nHубирают лишние уровни каталогов.
Помните ограничение: wget не выполняет JavaScript. Страницы, которые собираются в браузере, в зеркале останутся пустыми контейнерами. Для таких сайтов нужен другой подход, а не увеличение глубины рекурсии.
Авторизация, cookies и токены
Закрытые разделы требуют учётных данных. Пароль в командной строке виден в списке процессов и в истории оболочки, поэтому используйте --ask-password или файл .wgetrc с правами 600.
wget --user=student --ask-password https://portal.example.org/notes.pdf
wget --load-cookies cookies.txt --save-cookies cookies.txt --keep-session-cookies https://example.org/
wget --header='Authorization: Bearer TOKEN' -O data.json https://api.example.org/v1/items
wget --certificate=client.crt --private-key=client.key --ca-certificate=ca.crt https://example.org/
Для API удобнее заголовок с токеном, чем Basic-авторизация. Клиентские сертификаты применяются в корпоративных контурах. Файлы с секретами не коммитьте в git и не передавайте в общий каталог.
Настройки по умолчанию и .wgetrc
Повторяющиеся параметры удобно вынести в ~/.wgetrc. Файл читается при каждом запуске, поэтому не храните там пароли в открытом виде. Для отдельной задачи можно указать другой конфиг через --config.
cat > ~/.wgetrc <<'EOF'
timeout = 30
tries = 3
limit_rate = 1M
continue = on
EOF
wget --config=~/.wgetrc https://example.org/archive.tar.zst
Синтаксис отличается от командной строки: длинные опции пишутся через подчёркивание, логические значения — on и off. Ошибка в имени параметра не всегда заметна, поэтому после правки проверьте загрузку небольшого файла.
Целостность и журнал
После скачивания сверяйте контрольную сумму, если она опубликована. wget не проверяет хеши сам, но легко встраивается в скрипт.
wget -O debian.iso https://mirror.example.org/debian.iso
sha256sum debian.iso
wget -o ~/wget-docs.log -r -np https://docs.example.org/
grep -c '200 OK' ~/wget-docs.log
-o пишет лог в файл, -a дописывает в конец. В логе видно каждый запрос, код ответа и итоговую статистику — это первый источник при разборе сбоев.
Диагностика: коды возврата и заголовки
wget возвращает разные коды для разных классов ошибок: 0 — успех, 4 — сетевая ошибка, 6 — неверные логин или пароль, 8 — сервер ответил ошибкой. Скрипт должен проверять код, иначе тихий сбой останется незамеченным.
wget -q https://example.org/file || echo "exit=$?"
wget -S --spider https://example.org/file 2>&1 | grep -i 'HTTP/'
curl -I https://example.org/file
wget --no-proxy https://example.org/file
Если непонятно, на каком шаге всё ломается, запустите с -d: отладочный вывод показывает разрешение имени, TLS-рукопожатие и каждый заголовок. В отчёты прикладывайте такой лог целиком, предварительно убрав токены и cookies.
Если соединение устанавливается, но файл не идёт, проверьте переменные http_proxy и https_proxy, а также флаг --no-proxy. Ошибка сертификата чаще всего означает корпоративный прокси с перехватом TLS: лечится установкой корневого сертификата, а не флагом --no-check-certificate, который отключает защиту.
Итог
wget остаётся лучшим выбором там, где нужна простая, повторяемая загрузка без зависимостей: -c для докачки, --limit-rate для бережного отношения к каналу, -i для пакетов ссылок, -r -np для собственных сайтов. Добавьте проверку кода возврата и sha256sum — и загрузка перестанет быть лотереей. А зеркалирование чужих материалов оставьте в стороне: техническая возможность не равна разрешению.