Jak zignorować serwer proxy, jeśli nie jest dostępny?

15

Postępując zgodnie z instrukcjami w Najlepszy sposób na buforowanie apt pobrań w sieci LAN? , Skonfigurowałem buforujący serwer proxy w mojej sieci lokalnej. Ponieważ ten komputer nie zawsze działa, chciałbym móc odświeżyć listę źródeł i zainstalować pakiety bez używania tego serwera proxy, jeśli jest niedostępny.

Przeczytałem już sekcję Zdobądź grupę na stronie podręcznika apt.conf(5), ale nie mogłem znaleźć opcji takiej jak „Silent-Fail”.

W tej chwili sudo apt-get updatepowiązane polecenia nie działają, ponieważ nie można nawiązać połączenia. Jak więc skonfigurować klienta, aby serwer proxy był ignorowany, jeśli nie jest dostępny?

Lekensteyn
źródło
Czy używasz wykrywania zeroconf, czy ręcznie ustawiasz proxy na każdym kliencie?
Jorge Castro,
Ręcznie konfiguruję serwer proxy ze względu na możliwe zapory ogniowe / wyłączone nadawanie.
Lekensteyn,

Odpowiedzi:

20

Jest tam nieudokumentowane ustawienia, Acquire::http::ProxyAutoDetect. To ustawienie powinno zawierać pełną ścieżkę do pliku binarnego i nie może zawierać argumentów. Polecenie powinno wypisać proxy, które ma być użyte (przykład http://10.0.0.1:8000:).

Biorąc pod uwagę powyższe informacje, można utworzyć skrypt, który próbuje ustawić proxy przed jego ustawieniem. Jeśli nie jest dostępny serwer proxy, należy użyć bezpośredniego połączenia.

Poniżej znajduje się taki skrypt wykrywający proxy, który próbuje http://10.0.0.1:8000/i http://10.0.0.2:8000proxy.

Wprowadź kod /etc/apt/detect-http-proxy:

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

# Author: Lekensteyn <[email protected]>

# 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

Teraz APT musi być skonfigurowany do używania powyższego skryptu wykrywającego proxy, więc wstaw następujący kod /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";

Do pliku umieściłem również następny kod, aby zapobiec pośredniczeniu niektórych hostów.

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

Domyślnie skrypt wyświetla, czy proxy jest używane, czy nie. Aby to wyłączyć, edytuj /etc/apt/detect-http-proxyi zmień show_proxy_messages=1na show_proxy_messages=0.

Lekensteyn
źródło
Lekensteyn, czy mogę prosić o wklejenie tego do puppet-apt-cacher-ng jako opcję apt-cacher-ng::client?
Garth Kidd
1
Udzielone pozwolenie, rób co chcesz :)
Lekensteyn
2
Bardzo się cieszę, że znalazłem tę odpowiedź, kiedy jakiś czas temu konfigurowałem apt-cacher-ng. Mam apt-cacher-ng zainstalowany na jednym z moich komputerów domowych (192.168.0.2). Skrypt czułem się trochę przesadą moim przypadku, więc napisałem uproszczony wykryć-http-proxy: if nc -w1 -z 192.168.0.2 3142; then printf http://192.168.0.2:3142; else printf DIRECT; fi. Miejmy tylko nadzieję, że nieudokumentowana funkcja zostanie usunięta :)
geirha
2
Skrypt obszernie udokumentowałem na twoją korzyść, jeśli zależy ci na rozmiarze, możesz go jeszcze skrócić dzięki i=192.168.0.2;nc -zw1 $i 3142&&echo http://$i:3142/||echo DIRECT: p
Lekensteyn
3

Jest teraz oficjalnie obsługiwany sposób, aby to zrobić - używając opcji - Acquire::http::Proxy-Auto-Detect(patrz apt.confstrona podręcznika ). Zachowanie jest podobne do starego nieudokumentowanegoAcquire::http::ProxyAutoDetect (zauważ obecność / brak łączników w nowych / starych opcjach konfiguracji), jest w dużej mierze kompatybilne wstecz, ale zostało rozszerzone ...

Jestem w trakcie przesyłania łaty do opiekunów apt w celu ulepszenia dokumentacji, ale ponieważ jest mało prawdopodobne, aby zrobiła to wersja apt, która jest dostarczana z wersją dystrybucyjną przez dłuższy czas, dołączę tekst proponowana łatka tutaj:

Acquire::http::Proxy-Auto-Detectmoże być użyty do określenia zewnętrznego polecenia do wykrycia proxy HTTP do użycia. APT może wywoływać polecenie wiele razy i przekaże identyfikator URI do polecenia jako pierwszy i jedyny parametr. APT oczekuje, że polecenie wyświetli serwer proxy, który ma zostać użyty do skontaktowania się z danym identyfikatorem URI na jego stdout jako pojedynczy wiersz w stylu http://proxy:port/lub słowoDIRECT jeśli nie należy używać proxy. Brak danych wyjściowych wskazuje, że należy użyć ogólnych ustawień proxy.

Zauważ, że automatyczne wykrywanie nie będzie używane dla hosta, jeśli konfiguracja proxy specyficzna dla hosta jest już ustawiona za pośrednictwem Acquire::http::Proxy::HOST.

Aby zdiagnozować interakcje z zewnętrznym poleceniem, ustaw Debug::Acquire::http=yesi / lub Debug::Acquire::https=yesnp. Używając -oparametru wiersza poleceń.

Zauważ, że używasz przedpremierowej wersji apt, wersji 1.3 ~ exp2 do 1.3, wtedy występuje błąd (prawdopodobnie naprawiony przez 1.3.1), który powoduje, że apt analizuje stderr polecenia zewnętrznego wraz ze stdout.

Tim Small
źródło
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

Wiersz poleceń

  • Musi ncdziałać ( sudo apt-get install netcat), jeśli go brakuje.
  • Upewnij się, że chmod +x /usr/local/bin/apt-proxy-detect.sh
  • Podaj pełną ścieżkę podczas określania skryptu.

Jak to działa

Jeśli może połączyć się z serwerem proxy, drukuje serwer proxy, z którego korzysta APT. Jeśli nie, drukuje normalnie DIRECT i APT.

sos

Luke Mlsna
źródło