Перейти к содержанию

Руководство · На русском

Прокси в Wget: настройка с авторизацией

GNU Wget выбирает прокси по схеме адреса назначения и своим источникам конфигурации. В примере HTTP-шлюз задаётся явно, а пароль передаётся через временный защищённый файл. Начните с одного ограниченного запроса, прежде чем загружать разрешённый набор данных.

Каталог и инструкции — на русском. Страница отдельного товара, аккаунт, корзина, оплата и полные условия обслуживания пока доступны на английском.

Опубликовано:

Короткие ответы

Какие параметры задают прокси в Wget?

Для HTTP-назначения используется http_proxy, для HTTPS — https_proxy. В обоих значениях может стоять HTTP-шлюз. Конфигурационные файлы и исключения также влияют на маршрут.

Какие логин и пароль нужны?

proxy_user и proxy_password относятся к шлюзу. Данные сайта и --ask-password решают другую задачу. Сохраняйте полное имя пользователя из конструктора подключения.

Можно скачать HTTPS через HTTP-прокси?

Да: CONNECT создаёт туннель, затем Wget проверяет сертификат назначения. Но авторизация начального HTTP-участка до шлюза этим TLS не защищается.

Доказывает успешный echo работу всего задания?

Нет. Он подтверждает результат одного запроса. Рабочее задание может использовать другой адрес, конфигурацию, окружение или исключение; проверьте его отдельно в разрешённых пределах.

Проверьте реализацию и версию Wget

Исходный пример рассчитан на GNU Wget 1.25.0, Python 3.10 или новее и окружение macOS/Linux. Wget 2 — другая реализация; имя команды может скрывать BusyBox или оболочечную обёртку. Проверьте фактический исполняемый файл. Здесь не утверждается совместимость каждого нового выпуска или среды Windows.

Проверьте установленную командуsh
wget --no-config --version

При необходимости используйте доверенный источник пакетов своей системы. Пример не устанавливает зависимости автоматически. Его историческая локальная проверка в английской версии использовала Python 3.12.14 и отдельную сборку Wget с OpenSSL; это не новый сетевой тест этой редакции.

Разделите назначение, шлюз и авторизацию

Настройки решают разные задачи
ПараметрНазначениеЧастая ошибка
http_proxyМаршрут HTTP-назначенийЗадать только его для HTTPS-загрузки
https_proxyМаршрут HTTPS-назначенийЗаменить http:// шлюза на https:// без поддержки
proxy_user / proxy_passwordАвторизация проксиПодставить пароль сайта или API-ключ
no_proxy и конфигурацияИсключения и источник настроекЗабыть окружение планировщика

Руководство GNU описывает переменные и настройки. Возьмите HTTP-подключение из Connection builder · English. Порт и полный логин должны относиться к одному продукту; данные арендованного устройства нельзя получать подменой имени общего трафика.

Выполните один ограниченный запрос

Сохраните код как wget_check.py и запускайте в интерактивном терминале. Полное имя вводится отдельно либо берётся из PROXY_USER; пароль запрашивается скрыто. PROXY_SERVER, если задан, содержит только HTTP-шлюз без авторизации. Не помещайте реальные секреты в историю команд, опубликованный файл или снимок.

Тело кода сохранено из английского руководства. Подставляемые координаты шлюза остаются согласованными с сайтом. Новый запрос к шлюзу при подготовке не выполнялся.

wget_check.py — исходный ограниченный примерpython
import getpass
import ipaddress
import json
import os
from pathlib import Path
import selectors
import shutil
import subprocess
import tempfile
import time
import warnings
from urllib.parse import urlsplit


class CheckFailure(Exception):
    pass


def check():
    wget = shutil.which("wget")
    if not wget:
        raise CheckFailure("Install GNU Wget 1 and check your PATH")
    version = subprocess.run([wget, "--no-config", "--version"],
                             capture_output=True, text=True, timeout=5)
    if not version.stdout.startswith("GNU Wget 1."):
        raise CheckFailure("This example requires GNU Wget 1")
    server = os.environ.get("PROXY_SERVER", "http://gw.portproof.org:7000")
    parsed = urlsplit(server)
    if (parsed.scheme != "http" or not parsed.hostname or not parsed.port
            or parsed.username is not None or parsed.password is not None
            or parsed.path not in ("", "/") or parsed.query or parsed.fragment
            or any(ord(c) <= 32 or ord(c) == 127 for c in server)):
        raise CheckFailure("Use an HTTP gateway URL without credentials")
    user = os.environ.get("PROXY_USER") or input("Full proxy username: ")
    warnings.simplefilter("error", getpass.GetPassWarning)
    password = getpass.getpass("Proxy password: ")
    for value in (user, password):
        if (not value or value != value.strip()
                or any(ord(c) < 32 or ord(c) == 127 for c in value)):
            raise CheckFailure("This config method requires nonempty credentials without edge whitespace or controls")
    if ":" in user:
        raise CheckFailure("A Basic-auth username cannot contain a colon")
    env = {k: v for k, v in os.environ.items()
           if k.lower() not in {"http_proxy", "https_proxy", "ftp_proxy",
                                "all_proxy", "no_proxy", "wgetrc"}}
    with tempfile.TemporaryDirectory(prefix="wget-check-") as folder:
        config = Path(folder) / "wgetrc"
        fd = os.open(config, os.O_WRONLY | os.O_CREAT | os.O_EXCL, 0o600)
        with os.fdopen(fd, "w", encoding="utf-8") as stream:
            stream.write(f"use_proxy = on\nhttp_proxy = {server}\nhttps_proxy = {server}\n"
                         f"no_proxy =\nproxy_user = {user}\nproxy_password = {password}\n")
        command = [wget, f"--config={config}", "--quiet", "--no-netrc",
                   "--no-hsts", "--no-cookies", "--tries=1", "--timeout=5",
                   "--max-redirect=0", "--output-document=-"]
        if os.environ.get("PROXY_CA_BUNDLE"):
            command.append("--ca-certificate=" + os.environ["PROXY_CA_BUNDLE"])
        command.append("https://api.portproof.org/v1/echo-ip")
        with subprocess.Popen(command, stdout=subprocess.PIPE,
                              stderr=subprocess.DEVNULL, env=env) as process:
            deadline = time.monotonic() + 20
            data = bytearray()
            try:
                with selectors.DefaultSelector() as ready:
                    ready.register(process.stdout, selectors.EVENT_READ)
                    while True:
                        left = deadline - time.monotonic()
                        if left <= 0 or not ready.select(left):
                            raise CheckFailure("Overall download deadline reached")
                        chunk = os.read(process.stdout.fileno(), 4096)
                        if not chunk:
                            break
                        data.extend(chunk)
                        if len(data) > 65536:
                            raise CheckFailure("Echo body exceeds 64 KiB")
                process.wait(timeout=max(0.001, deadline - time.monotonic()))
                if process.returncode:
                    raise CheckFailure(f"Wget exited with status {process.returncode}")
            finally:
                if process.poll() is None:
                    process.kill()
                process.wait()
        payload = json.loads(data)
        if not isinstance(payload, dict) or not isinstance(payload.get("ip"), str):
            raise ValueError("Echo response has no IP string")
        address = ipaddress.ip_address(payload["ip"])
        print("Exit address:", address)


if __name__ == "__main__":
    try:
        check()
    except CheckFailure as error:
        print(error)
        raise SystemExit(1)
    except (OSError, ValueError, subprocess.SubprocessError, getpass.GetPassWarning) as error:
        print("Check failed:", type(error).__name__)
        raise SystemExit(1)

Понимайте границы временного файла

Обёртка создаёт файл режима 0600 в отдельном временном каталоге. Пароль не входит в URL и аргументы процесса, но остаётся открытым текстом в этом файле на время работы. Используйте доверенную учётную запись и хранилище. Обработанные завершения очищают каталог; принудительное прекращение процесса не даёт универсальной гарантии удаления.

Способ не принимает пустые значения, управляющие символы и пробелы по краям. Двоеточие в Basic-имени пользователя тоже отклоняется. Это ограничения данного примера, а не причина самовольно изменять выданный секрет. Если реквизиты не подходят формату клиента, выясните поддерживаемый способ до новой покупки.

Отделите пределы клиента от срока задания

Для диагностического запроса отключены повторы и перенаправления. Таймаут Wget в пять секунд не является общим сроком всей программы: обёртка дополнительно ограничивает чтение двадцатью секундами и телом 64 KiB. Это пределы примера, не обещание скорости или допустимого размера рабочей загрузки.

Обёртка убирает конфликтующие унаследованные proxy-переменные и WGETRC, задаёт настройки явно, не использует netrc, cookies и HSTS. Не копируйте такой диагностический контекст вслепую в рабочее задание: необходимые организационные политики и доверенный CA нужно сохранить. Проверка сертификата назначения остаётся включённой; при необходимости предусмотрен PROXY_CA_BUNDLE.

Читайте ошибку на её уровне

Сначала отделите отсутствие GNU Wget, неверный формат и локальную конфигурацию от DNS/TCP и ответа HTTP. 407 означает требование авторизации прокси; ошибка сертификата относится к TLS. Успешный CONNECT ещё не означает пригодный ответ назначения. Не отключайте TLS и не добавляйте повторы ради проходящего результата.

Скрипт выводит адрес только после успешного Wget и разбора JSON с IP. Этот адрес не доказывает страну, будущую доступность или результат другого сайта. Если обычное задание расходится с примером, сравните схему назначения, источники настроек и исключения по руководству curl и приложения.

Измерьте рабочую задачу до заказа

Для разрешённой загрузки задайте отдельные пределы попыток, времени и объёма. Включите ошибки и повторы в расчёт ГБ, затем сверьте цену заказа. Покупка и кабинет доступны на английском. Код проверен на точное соответствие английскому примеру; его исторические локальные фикстуры не означают новую загрузку или платёж 2 ноября.

Допустимое использование

Выполняйте только разрешённые действия в пределах правил назначения. Сохраняйте учётные данные и личное содержимое в тайне; соблюдайте политику допустимого использования · English.

Следующий шаг