Wget и Curl: полное руководство по скачиванию файлов в терминале Linux
Утилита wget
wget — это мощная утилита командной строки для загрузки файлов по протоколам HTTP, HTTPS и FTP. Она особенно полезна в системах без графического интерфейса (например, на серверах) и поддерживает такие функции, как возобновление прерванных загрузок, рекурсивное скачивание сайтов, зеркалирование и многое другое.
? Установка (для Alpine Linux)
☯
Terminal:
⌕
≡
✕
apk add wget
> Обычно wget уже предустановлен, но на минималистичных Alpine-образах его может не быть.
? Базовый синтаксис
☯
Terminal:
⌕
≡
✕
wget [опции] URL
? Основные возможности и примеры использования
1. **Простая загрузка файла**
☯
Terminal:
⌕
≡
✕
wget https://example.com/file.zip
→ Сохранит файл в текущую директорию с оригинальным именем (file.zip).
2. **Сохранить под другим именем**
☯
Terminal:
⌕
≡
✕
wget -O newname.zip https://example.com/file.zip
> ⚠️ -O (заглавная буква) — перезаписывает файл, если он существует.
> Чтобы добавить (дописать) в конец — не поддерживается wget, используйте curl -C - или другие инструменты.
3. **Возобновление прерванной загрузки (resume)**
☯
Terminal:
⌕
≡
✕
wget -c https://example.com/largefile.iso
-c(--continue) — продолжает загрузку с места остановки (если сервер поддерживаетRange-запросы).- Если файл не существует — просто начнёт с нуля.
- Важно: если сервер не поддерживает частичные загрузки (например, некоторые CGI-скрипты),
-cне сработает.
> ✅ Это главный способ возобновить загрузку после обрыва.
4. **Загрузка в фоновом режиме**
☯
Terminal:
⌕
≡
✕
wget -b https://example.com/bigfile.tar.gz
→ Запустит wget в фоне и запишет лог в wget-log.
Добавьте -o logfile.txt, чтобы указать свой лог-файл:
☯
Terminal:
⌕
≡
✕
wget -b -o download.log https://example.com/file
5. **Скачивание списка URL из файла**
☯
Terminal:
⌕
≡
✕
wget -i urls.txt
где urls.txt:
☯
Terminal:
⌕
≡
✕
https://example.com/file1.zip https://example.com/file2.tar.gz ftp://ftp.example.net/data/file3.bin
Можно комбинировать с -c, -P, -t и др.
6. **Ограничение скорости**
☯
Terminal:
⌕
≡
✕
wget --limit-rate=200k https://example.com/largefile.iso
→ Ограничить скорость до 200 КБ/с.
7. **Количество попыток при ошибках**
☯
Terminal:
⌕
≡
✕
wget -t 5 -c https://unstable-server.com/file.zip
-t 5— сделать до 5 попыток при неудаче.-t 0— бесконечные попытки (осторожно!).
8. **Ожидание между запросами (вежливость к серверу)**
☯
Terminal:
⌕
≡
✕
wget --wait=5 https://example.com/page1.html
→ Ждёт 5 секунд перед каждым запросом.
Для случайной задержки:
☯
Terminal:
⌕
≡
✕
wget --wait=10 --random-wait https://example.com/
→ Ждёт от 5 до 15 секунд между запросами (0.5wait до 1.5wait).
9. **Рекурсивное скачивание (архивирование сайта)**
☯
Terminal:
⌕
≡
✕
wget --recursive --no-parent --page-requisites --html-extension \
--convert-links --restrict-file-names=windows \
--domains=example.com --no-clobber \
https://example.com/docs/Пояснение ключевых опций:
| Опция | Значение |
-r / --recursive | Рекурсивно скачивать связанные страницы |
-np / --no-parent | Не подниматься выше указанного каталога (например, не идти в /) |
-p / --page-requisites | Скачать всё, что нужно для отображения страницы (CSS, JS, изображения) |
-E / --html-extension | Добавлять .html к файлам без расширения |
-k / --convert-links | Преобразовать ссылки для локального просмотра |
-nc / --no-clobber | Не перезаписывать существующие файлы |
-l depth | Глубина рекурсии (по умолчанию 5); -l inf — бесконечная |
> ? Для полного «зеркала» сайта используйте:
☯
Terminal:
⌕
≡
✕
wget --mirror --convert-links --adjust-extension --page-requisites \
--no-parent https://example.com/или короче:
☯
Terminal:
⌕
≡
✕
wget -mkEpnp https://example.com/
10. **Авторизация (логин/пароль)**
HTTP Basic Auth:
☯
Terminal:
⌕
≡
✕
wget --user=johndoe --password=secret https://example.com/protected/file.zip
> ⚠️ Пароль виден в истории и ps. Безопаснее использовать .netrc.
.netrc (рекомендуется):
Создайте ~/.netrc:
☯
Terminal:
⌕
≡
✕
machine example.com login johndoe password secret
Затем:
☯
Terminal:
⌕
≡
✕
chmod 600 ~/.netrc wget https://example.com/protected/file.zip
11. **Использование куков (например, для сайтов с сессией)**
☯
Terminal:
⌕
≡
✕
# Сохранить куки после логина (например, через curl или браузер) wget --load-cookies cookies.txt https://example.com/private/file.pdf
Или сохранить куки из ответа:
☯
Terminal:
⌕
≡
✕
wget --save-cookies cookies.txt --keep-session-cookies \
--post-data 'user=john&pass=123' https://example.com/login
wget --load-cookies cookies.txt https://example.com/download12. **Проверка ссылок (без загрузки)**
☯
Terminal:
⌕
≡
✕
wget --spider -r -nd -nv -o spider.log https://example.com/
--spider— только проверяет, не скачивает.-nv— менее подробный вывод (non-verbose).-nd— не создавать директории.
> Удобно для поиска битых ссылок.
13. **Скачивание по FTP**
☯
Terminal:
⌕
≡
✕
wget ftp://user:pass@ftp.example.com/dir/file.bin
или анонимно:
☯
Terminal:
⌕
≡
✕
wget ftp://ftp.example.com/pub/file.txt
14. **Обход robots.txt**
☯
Terminal:
⌕
≡
✕
wget -e robots=off https://example.com/
→ Игнорировать robots.txt (используйте ответственно!).
15. **Указание User-Agent**
☯
Terminal:
⌕
≡
✕
wget --user-agent="Mozilla/5.0 (X11; Linux x86_64)" https://example.com/
Полезно, если сайт блокирует wget по User-Agent.
16. **Прокси**
☯
Terminal:
⌕
≡
✕
wget -e use_proxy=yes -e http_proxy=http://proxy.local:3128 https://example.com/
Или задайте переменные окружения:
☯
Terminal:
⌕
≡
✕
export http_proxy=http://proxy.local:3128 wget https://example.com/file
? Полезные опции (сводка)
| Опция | Назначение |
-c | Continue (возобновить) |
-O file | Сохранить как один файл (перезаписывает!) |
-P dir | Сохранять в указанную директорию |
-q | Тихий режим (quiet) |
-v / -nv | Подробный / менее подробный вывод |
--show-progress | Показывать прогресс-бар (wget ≥1.16) |
-S | Показывать заголовки HTTP-ответов |
--timeout=SECONDS | Таймаут соединения/чтения |
--tries=N | Количество попыток |
--referer=URL | Указать Referer |
--header="X-Custom: value" | Добавить HTTP-заголовок |
? Советы для Alpine Linux
- В Alpine по умолчанию может не быть
ca-certificates, что вызывает ошибки SSL: ``bash apk add ca-certificates update-ca-certificates`` - Если
wgetне поддерживает HTTPS — убедитесь, что установленwgetс SSL: ``bash apk add wget # в Alpine он собран с TLS (обычно wolfSSL или OpenSSL)``
Проверить поддержку:
☯
Terminal:
⌕
≡
✕
wget -V | grep +https
→ Должно быть +https.
? Альтернативы
curl -C - -O URL— тоже поддерживает resume (-C -).aria2c— многопоточная загрузка, более современная, но не везде есть по умолчанию.
Утилита curl
curl — это ещё более гибкая и мощная утилита для передачи данных по различным протоколам (HTTP, HTTPS, FTP, SFTP, SCP, LDAP, MQTT и многим другим). В отличие от wget, curl по умолчанию выводит данные в stdout, а не сохраняет в файл — но это легко настроить.
Ниже — подробное руководство по curl, аналогичное предыдущему по wget: от базового использования до продвинутых сценариев, с акцентом на скачивание файлов, возобновление загрузок, работу с авторизацией, заголовками, прокси и т.д.
Для Alpine Linux (как у вас):
☯
Terminal:
⌕
≡
✕
apk add curl
> ⚠️ В минимальных образах curl может отсутствовать — особенно если используется wget вместо него по умолчанию.
? Базовый синтаксис
☯
Terminal:
⌕
≡
✕
curl [опции] URL
По умолчанию — вывод в терминал (stdout). Чтобы сохранить, нужны дополнительные флаги.
? Основные способы скачивания файлов
1. **Сохранить файл с оригинальным именем**
☯
Terminal:
⌕
≡
✕
curl -O https://example.com/file.zip
> ? -O (заглавная O) — сохранить как file.zip (только если URL заканчивается именем файла!).
❌ Не сработает для https://example.com/download?id=123.
2. **Сохранить под конкретным именем**
☯
Terminal:
⌕
≡
✕
curl -o mycopy.zip https://example.com/file.zip
> ? -o (строчная o) — указывает имя выходного файла.
✅ Работает всегда.
3. **Возобновить прерванную загрузку**
☯
Terminal:
⌕
≡
✕
curl -C - -o largefile.iso https://example.com/largefile.iso
-C -— продолжить загрузку с текущего размера файла (если он частично существует).- Если файл не существует — начнёт с нуля.
- Требует поддержки
Range: bytes=N-на сервере (как и вwget -c).
> ✅ Это главный способ resume в curl — аналог wget -c.
? Совет: комбинируйте с -# для прогресс-бара:
☯
Terminal:
⌕
≡
✕
curl -C - -# -o bigfile.tar.gz https://example.com/bigfile.tar.gz
? Прогресс и вывод
| Флаг | Поведение |
-# | Прогресс-бар (по умолчанию в новых версиях) |
-s | Тихий режим (silent) — скрыть прогресс и ошибки |
-S | Показывать ошибки даже в -s (часто: -sS) |
-v | Подробный вывод (заголовки, редиректы, соединения) |
--fail | Возвращать ненулевой код при HTTP-ошибках (404, 500 и т.д.) |
Пример:
☯
Terminal:
⌕
≡
✕
curl -# -o data.json https://api.example.com/data
? Работа с HTTP-заголовками
Указать User-Agent
☯
Terminal:
⌕
≡
✕
curl -A "Mozilla/5.0 (X11; Linux x86_64)" https://example.com/
Или явно:
☯
Terminal:
⌕
≡
✕
curl -H "User-Agent: MyBot/1.0" https://example.com/
Отправить Referer
☯
Terminal:
⌕
≡
✕
curl -e https://referrer.com/ https://target.com/ # или curl -H "Referer: https://referrer.com/" https://target.com/
Отправить кастомный заголовок
☯
Terminal:
⌕
≡
✕
curl -H "Authorization: Bearer abc123" \
-H "X-API-Version: 2" \
https://api.example.com/v2/users? Авторизация
HTTP Basic Auth
☯
Terminal:
⌕
≡
✕
curl -u username:password https://example.com/protected/file # или (без ввода в команду): curl -u username https://example.com/ # пароль спросят интерактивно
> ? Лучше использовать -u user, чтобы пароль не остался в истории.
Bearer Token (JWT/API-ключи)
☯
Terminal:
⌕
≡
✕
curl -H "Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.xxxxx" \
https://api.example.com/dataКуки (cookies)
☯
Terminal:
⌕
≡
✕
# 1. Загрузить и сохранить куки (например, после логина) curl -c cookies.txt -d 'user=john&pass=123' https://example.com/login # 2. Использовать их для скачивания curl -b cookies.txt https://example.com/download/data.zip -o data.zip
-c file— сохранить куки после ответа.-b file— отправить куки из файла.-b "name=val"— отправить куки вручную:-b "sessionid=abc; lang=en".
? Работа с POST / формами / API
POST-запрос с данными формы
☯
Terminal:
⌕
≡
✕
curl -d "name=John&age=30" -X POST https://example.com/submit
(по умолчанию Content-Type: application/x-www-form-urlencoded)
POST JSON
☯
Terminal:
⌕
≡
✕
curl -d '{"name":"John","age":30}' \
-H "Content-Type: application/json" \
-X POST https://api.example.com/usersЗагрузка файла (multipart/form-data)
☯
Terminal:
⌕
≡
✕
curl -F "file=@/path/to/photo.jpg" https://example.com/upload
→ Автоматически использует multipart/form-data.
? Работа с FTP / SFTP
FTP-скачивание
☯
Terminal:
⌕
≡
✕
curl -u user:pass ftp://ftp.example.com/file.txt -o file.txt
SFTP (требует поддержки в сборке `curl`)
☯
Terminal:
⌕
≡
✕
curl -u user:pass sftp://sftp.example.com/home/user/data.zip -o data.zip
> ❗ В Alpine: убедитесь, что curl собран с поддержкой libssh2. Проверьте:
> ```bash
| > curl -V | grep -i ssh |
> ```
> Если нет — установите curl с SSH-поддержкой (в Alpine обычно curl в репозитории main уже включает libssh2).
? Прокси
☯
Terminal:
⌕
≡
✕
curl -x http://proxy.local:3128 https://example.com/file # или curl --proxy http://user:pass@proxy.local:3128 https://example.com/
Поддерживает http, https, socks4, socks5:
☯
Terminal:
⌕
≡
✕
curl --socks5 127.0.0.1:9050 https://check.torproject.org/
? Таймауты и повторы
| Опция | Описание |
--connect-timeout 10 | Таймаут на установку соединения (10 сек) |
--max-time 60 | Максимальное время выполнения (60 сек) |
--retry 3 | Повторить до 3 раз при ошибках сети |
--retry-delay 5 | Ждать 5 сек между попытками |
--retry-connrefused | Повторять даже при "Connection refused" |
Пример устойчивой загрузки:
☯
Terminal:
⌕
≡
✕
curl -C - -o file.zip \
--retry 5 --retry-delay 10 --retry-connrefused \
--connect-timeout 20 --max-time 300 \
https://unstable.example.com/file.zip? Редиректы
- По умолчанию
curlне следует редиректам (301/302). - Чтобы включить: ``
bash curl -L https://bit.ly/short-url -o file.zip`→-L(--location) — следовать редиректам (до 50 по умолчанию, можно изменить через--max-redirs`).
⚠️ Осторожно: при комбинации -L и -u/-b/-H — заголовки/авторизация не передаются на перенаправленный хост (политика безопасности). Нужно явно разрешить:
☯
Terminal:
⌕
≡
✕
curl -L --location-trusted -u user:pass https://redirect.to/protected
? Проверка без скачивания (аналог `--spider` у `wget`)
☯
Terminal:
⌕
≡
✕
curl -I https://example.com/file.zip
→ Только заголовки (HEAD-запрос).
Или эмулировать wget --spider:
☯
Terminal:
⌕
≡
✕
curl -sSfI https://example.com/file.zip >/dev/null && echo "OK" || echo "FAIL"
-sS— тихо, но с ошибками,-f— не выводить тело при HTTP-ошибке,-I— только заголовки.
? Скачивание диапазона байтов (частичное скачивание)
☯
Terminal:
⌕
≡
✕
curl -r 0-999 https://example.com/bigfile.bin -o first1000.bin
→ Скачать первые 1000 байт.
Полезно для:
- проверки заголовка файла (например, ELF, ZIP),
- докачки, если
-C -недоступен.
? Сравнение `wget` vs `curl` для скачивания
| Задача | wget | curl |
| Простое скачивание файла | wget URL | curl -LO URL |
| Возобновление | wget -c | curl -C - -o file URL |
| Фоновая загрузка | wget -b | Через nohup curl ... & |
| Рекурсивное скачивание сайта | ✅ (-r) | ❌ (нет встроенной поддержки) |
| Отправка POST/JSON/API | Возможна, но неудобно | ✅ (-d, -H, -X) |
| Работа с куками/сессиями | ✅ (--load-cookies) | ✅ (-b, -c) |
| Многопоточность | ❌ | ❌ (но можно в нескольких процессах) |
| Поддержка протоколов | HTTP(S), FTP | HTTP(S), FTP, SFTP, SCP, LDAP, MQTT, SMB, IMAP… |
> ? Вывод:
> - Для скачивания файлов и архивирования сайтов — wget.
> - Для интеграции в API, скрипты, отправки данных — curl.
? Полезные алиасы (добавьте в `~/.profile` или `~/.bashrc`)
☯
Terminal:
⌕
≡
✕
# Безопасное скачивание с resume и прогрессом alias get='curl -# -C - -O' # Скачать и распаковать .tar.gz на лету alias gettar='curl -sL' # Пример использования: # get https://example.com/file.zip # gettar https://example.com/data.tar.gz | tar xz
? Проверка поддержки в Alpine
☯
Terminal:
⌕
≡
✕
curl -V
Пример вывода (в Alpine):
☯
Terminal:
⌕
≡
✕
curl 8.9.1 (x86_64-alpine-linux-musl) libcurl/8.9.1 OpenSSL/3.3.2 zlib/1.3.1 brotli/1.1.0 libidn2/2.3.7 libpsl/0.21.5 (+libidn2/2.3.0) libssh2/1.11.0 nghttp2/1.62.1 Release-Date: 2024-07-31 Protocols: dict file ftp ftps gopher gophers http https imap imaps mqtt pop3 pop3s rtsp scp sftp smb smbs smtp smtps telnet tftp Features: alt-svc AsynchDNS brotli GSS-API HSTS HTTP2 HTTPS-proxy IDN IPv6 Kerberos Largefile libz NTLM NTLM_WB PSL SPNEGO SSL threadsafe TLS-SRP UnixSockets
Если нет https или sftp — пересоберите curl или установите пакет с расширенной поддержкой.
пример где почти сделали правильно — но **ошибка в комбинации флагов**:
☯
Terminal:
⌕
≡
✕
curl -c -v -# -S -O -o jami-all_amd64.deb https://dl.jami.net/...
❌ Проблема: вы использовали **одновременно `-O` и `-o`**
Это привело к конфликту:
-O— сохранить файл с именем из URL (jami-all_amd64.deb).-o jami-all_amd64.deb— сохранить в указанный файл.
→ curl видит два выходных направления, но один URL → отсюда и ворнинг:
☯
Terminal:
⌕
≡
✕
Warning: Got more output options than URLs
И что ещё важнее:
> ? -C - (возобновление) не работает с -O, если файл ещё не существует в нужном месте — но даже если бы вы его добавили, конфликт -O/-o мешал бы.
А у вас вообще не было -C -, поэтому загрузка всегда начиналась с нуля.
✅ Как исправить: правильная команда для возобновляемой загрузки
☯
Terminal:
⌕
≡
✕
curl -C - -# -S -o jami-all_amd64.deb https://dl.jami.net/ring-manual/debian_12/jami-all_amd64.deb
Разберём по флагам:
| Флаг | Значение |
-C - | ❗ главный флаг для resume — продолжить с места остановки (по размеру существующего файла) |
-# | Прогресс-бар (можно заменить на -v, но -# чище для скачивания) |
-S | Показывать ошибки даже при -s (но у вас нет -s, так что можно убрать — или заменить на -sS, если хотите тишину + ошибки) |
-o jami-all_amd64.deb | Сохранить именно в этот файл (обязательно, если хотите control над именем и resume) |
(без -O, без -c) | — |
> ✅ Эта команда:
> - сохранит файл как jami-all_amd64.deb,
> - при прерывании — следующий запуск докачает остаток (если сервер поддерживает Range — а dl.jami.net поддерживает ✅),
> - покажет прогресс и ошибки.
? Почему `-c` у вас не дал эффекта?
Вы использовали -c как сокращение от --cookie-jar, а не как «continue»!
-c FILE— сохранить куки в файл → у вас-cбез аргумента → некорректно.- Для возобновления в
curlнужен-C -(заглавнаяC, дефис как аргумент).
? Запомните:
| Утилита | Возобновить загрузку |
wget | -c |
curl | -C - |
✅ Проверим на практике (рекомендуемый финальный вариант)
☯
Terminal:
⌕
≡
✕
# Запустить загрузку (с resume и чистым выводом)
curl -C - -# -o jami-all_amd64.deb \
https://dl.jami.net/ring-manual/debian_12/jami-all_amd64.debЕсли хотите ещё надёжнее — добавьте повторы и таймауты:
☯
Terminal:
⌕
≡
✕
curl -C - -# -o jami-all_amd64.deb \
--retry 3 --retry-delay 5 \
--connect-timeout 30 --max-time 600 \
https://dl.jami.net/ring-manual/debian_12/jami-all_amd64.deb? Тест: как убедиться, что resume работает?
- Запустите загрузку, дождитесь ~30%.
- Нажмите
Ctrl+C. - Посмотрите размер файла: ``
bash ls -lh jami-all_amd64.deb # например: 150M`` - Запустите команду снова — прогресс-бар начнётся не с 0, а с ~30%, и скорость будет
x-bytes/s(а неx KB/sкак в начале — признак докачки).
-
Создано 14.12.2025 15:15:39
-
Roman Sakhno

Комментарии (0):
Для добавления комментариев надо войти в систему.
Если Вы ещё не зарегистрированы на сайте, то сначала зарегистрируйтесь.