Як ігнорувати проксі, якщо його немає?


15

Слідуючи інструкціям " Найкращий спосіб кешувати влучні завантаження в локальній мережі" , Я встановив проксі-сервер кешування у своїй локальній мережі. Оскільки ця машина не завжди працює, я хотів би мати можливість оновити список джерел та встановити пакети, не використовуючи проксі, якщо він недоступний.

Я вже читав розділ групи Придбати на сторінці керівництва apt.conf(5), але не зміг знайти такий варіант, як "Silent-Fail".

На даний момент sudo apt-get updateі пов’язані команди не вдається, оскільки не вдалося встановити з'єднання. Отже, як налаштувати клієнта так, щоб проксі проігнорувався, якщо він недоступний?


Використовуєте ви відкриття zeroconf або вручну встановлюєте проксі для кожного клієнта?
Хорхе Кастро

Я встановлюю проксі-сервер вручну через можливі брандмауери / вимкнене мовлення.
Лекенштейн

Відповіді:


20

Існує недокументований параметр, Acquire::http::ProxyAutoDetect. Цей параметр повинен містити повний шлях до двійкового файлу і не може мати аргументів. Команда повинна вивести проксі, який буде використовуватися (приклад http://10.0.0.1:8000:).

З огляду на вищенаведену інформацію, може бути створений сценарій, який намагається проксі-сервер перед його встановленням. Якщо проксі немає, слід використовувати пряме з'єднання.

Нижче наводиться такий скрипт виявлення проксі, який намагається виконати проксі http://10.0.0.1:8000/та http://10.0.0.2:8000проксі.

Введіть код у /etc/apt/detect-http-proxy:

#!/bin/bash
# detect-http-proxy - Returns a HTTP proxy which is available for use

# Author: Lekensteyn <lekensteyn@gmail.com>

# Supported since APT 0.7.25.3ubuntu1 (Lucid) and 0.7.26~exp1 (Debian Squeeze)
# Unsupported: Ubuntu Karmic and before, Debian Lenny and before

# Put this file in /etc/apt/detect-http-proxy and create and add the below
# configuration in /etc/apt/apt.conf.d/30detectproxy
#    Acquire::http::ProxyAutoDetect "/etc/apt/detect-http-proxy";

# APT calls this script for each host that should be connected to. Therefore
# you may see the proxy messages multiple times (LP 814130). If you find this
# annoying and wish to disable these messages, set show_proxy_messages to 0
show_proxy_messages=1

# on or more proxies can be specified. Note that each will introduce a routing
# delay and therefore its recommended to put the proxy which is most likely to
# be available on the top. If no proxy is available, a direct connection will
# be used
try_proxies=(
10.0.0.1:8000
10.0.0.2:8000
)

print_msg() {
    # \x0d clears the line so [Working] is hidden
    [ "$show_proxy_messages" = 1 ] && printf '\x0d%s\n' "$1" >&2
}

for proxy in "${try_proxies[@]}"; do
    # if the host machine / proxy is reachable...
    if nc -z ${proxy/:/ }; then
        proxy=http://$proxy
        print_msg "Proxy that will be used: $proxy"
        echo "$proxy"
        exit
    fi
done
print_msg "No proxy will be used"

# Workaround for Launchpad bug 654393 so it works with Debian Squeeze (<0.8.11)
echo DIRECT

Тепер APT має бути налаштовано для використання вищевказаного скрипта виявлення проксі, тому введіть такий код у /etc/apt/apt.conf.d/30detectproxy:

# Fail immediately if a file could not be retrieved. Comment if you have a bad
# Internet connection
Acquire::Retries 0;

# undocumented feature which was found in the source. It should be an absolute
# path to the program, no arguments are allowed. stdout contains the proxy
# server, stderr is shown (in stderr) but ignored by APT
Acquire::http::ProxyAutoDetect "/etc/apt/detect-http-proxy";

Я також поклав наступний код у файл, щоб запобігти знаходженню якогось хоста.

# Override the default proxy, DIRECT causes a direct connection to be used
Acquire::http::Proxy {
    deb.opera.com DIRECT;
    dl.google.com DIRECT;
};

За замовчуванням сценарій виводить, чи використовується проксі-сервер чи ні. Щоб вимкнути це, відредагуйте /etc/apt/detect-http-proxyта змініть show_proxy_messages=1на show_proxy_messages=0.


Лекенштейн, чи можу я мати ваш дозвіл вставити це в marpet-apt-cacher-ng як варіант apt-cacher-ng::client?
Garth Kidd

1
Дозвіл наданий, робіть з ним все, що завгодно :)
Лекенштейн

2
Я дуже щасливий, що знайшов цю відповідь, коли я налаштував apt-cacher-ng на час назад. У мене на одному з домашніх комп'ютерів встановлений apt-cacher-ng (192.168.0.2). Сценарій відчував себе трохи надлишкова для мого випадку, так що я написав спрощена детектувати-HTTP-проксі: if nc -w1 -z 192.168.0.2 3142; then printf http://192.168.0.2:3142; else printf DIRECT; fi. Будемо сподіватися, що недокументована функція буде видалена :)
geirha

2
Я детально задокументував сценарій на вашу користь, якщо ви дбаєте про розмір, ви можете зробити його ще коротшим i=192.168.0.2;nc -zw1 $i 3142&&echo http://$i:3142/||echo DIRECT: p
Лекенштейн

3

Зараз існує офіційно підтримуваний спосіб зробити це - використовуючи параметр - Acquire::http::Proxy-Auto-Detect(див. apt.confСторінку людини). Поведінка схожа на стару незадокументовану Acquire::http::ProxyAutoDetect(зверніть увагу на наявність / відсутність дефісів у нових / старих параметрах конфігурації), вона значною мірою відстала назад, але була розширена ...

Я зараз надсилаю патч до технічних служб для вдосконалення документації, але оскільки це навряд чи перетворить його у версію apt, яка постачається з дистрибутивом дистрибутиву на досить довгий час, я включу текст запропонований патч тут:

Acquire::http::Proxy-Auto-Detectможна використовувати для вказівки зовнішньої команди для виявлення http проксі-сервера, який слід використовувати. APT може викликати команду кілька разів і передасть URI команді як її перший і єдиний параметр. APT очікує, що команда виведе проксі-сервер, який повинен використовуватись для контакту з відповідним URI на його stdout як єдиний рядок у стилі http://proxy:port/, або слово, DIRECTякщо не повинен бути використаний проксі-сервер. Немає висновку, що слід використовувати загальні параметри проксі.

Зауважте, що автоматичне виявлення не буде використовуватися для хоста, якщо конфігурація проксі-сервера вже встановлена ​​через Acquire::http::Proxy::HOST.

Для діагностування взаємодії із зовнішньою командою, встановіть Debug::Acquire::http=yesта / або, Debug::Acquire::https=yesнаприклад, використовуючи параметр -oкомандного рядка.

Зауважте, що використовується попередня версія версії apt, версії 1.3 ~ exp2 до 1.3, тоді виникає помилка (ймовірно, виправлена ​​1.3.1), яка спричиняє apt для розбору stderr зовнішньої команди разом з stdout.


1

/etc/apt/apt.conf.d/02proxy:

Acquire::http::Proxy-Auto-Detect "/usr/local/bin/apt-proxy-detect.sh";

/usr/local/bin/apt-proxy-detect.sh:

#!/bin/bash
IP=192.168.88.1
PORT=3142
if nc -w1 -z $IP $PORT; then
    echo -n "http://${IP}:${PORT}"
else
    echo -n "DIRECT"
fi

Командний рядок

  • Він повинен ncпрацювати ( sudo apt-get install netcat), якщо його немає.
  • Переконайтесь, що ви chmod +x /usr/local/bin/apt-proxy-detect.sh
  • Використовуйте повний шлях, визначаючи сценарій.

Як це працює

Якщо він може підключитися до проксі, він виводить проксі-сервер, який APT використовує. Якщо він не в змозі, він друкує DIRECT і APT патрони разом нормально.

соусом

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.