Bootstrap

Wget и Curl: полное руководство по скачиванию файлов в терминале Linux

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/download

12. **Проверка ссылок (без загрузки)**

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

? Полезные опции (сводка)

ОпцияНазначение
-cContinue (возобновить)
-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 -Vgrep -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` для скачивания

Задачаwgetcurl
Простое скачивание файлаwget URLcurl -LO URL
Возобновлениеwget -ccurl -C - -o file URL
Фоновая загрузкаwget -bЧерез nohup curl ... &
Рекурсивное скачивание сайта✅ (-r)❌ (нет встроенной поддержки)
Отправка POST/JSON/APIВозможна, но неудобно✅ (-d, -H, -X)
Работа с куками/сессиями✅ (--load-cookies)✅ (-b, -c)
Многопоточность❌ (но можно в нескольких процессах)
Поддержка протоколовHTTP(S), FTPHTTP(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 работает?

  1. Запустите загрузку, дождитесь ~30%.
  2. Нажмите Ctrl+C.
  3. Посмотрите размер файла: ``bash ls -lh jami-all_amd64.deb # например: 150M ``
  4. Запустите команду снова — прогресс-бар начнётся не с 0, а с ~30%, и скорость будет x-bytes/s (а не x KB/s как в начале — признак докачки).

Копирование материалов разрешается только с указанием автора Roman Sakhno и индексируемой прямой ссылкой на сайт (http://itdid.ru)!

Добавляйтесь ко мне в друзья ВКонтакте: http://vk.com/sahroman.
Если Вы хотите дать оценку мне и моей работе, то напишите её в моей группе: http://vk.com/sahroman.

Если у Вас остались какие-либо вопросы, либо у Вас есть желание высказаться по поводу этой статьи, то Вы можете оставить свой комментарий внизу страницы.

Порекомендуйте эту статью друзьям:

Если Вам понравился сайт, то разместите ссылку на него (у себя на сайте, на форуме, в контакте):

  1. Кнопка:

    Она выглядит вот так: Как настроить свой компьютер

  2. Текстовая ссылка:

    Она выглядит вот так: Как настроить свой компьютер

  3. BB-код ссылки для форумов (например, можете поставить её в подписи):

Комментарии (0):

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

крипто-донат, на развитие сайта itdid.ru:

В новом окне с терминалом itdid.ru, введите любую сумму: