Wie ignoriere ich einen Proxy, wenn er nicht verfügbar ist?

15

Befolgen Sie die Anweisungen auf die beste Art und Weise, um geeignete Downloads in einem LAN zwischenzuspeichern. Ich habe einen Caching-Proxy in meinem lokalen Netzwerk eingerichtet. Da dieser Computer nicht immer verfügbar ist, möchte ich die Liste der Quellen aktualisieren und Pakete installieren können, ohne diesen Proxy zu verwenden, wenn er nicht verfügbar ist.

Ich habe bereits den Abschnitt " Gruppe erfassen" auf der Handbuchseite von gelesen apt.conf(5), konnte jedoch keine Option wie "Silent-Fail" finden.

Momentan sudo apt-get updateschlagen verwandte Befehle fehl, da keine Verbindung hergestellt werden konnte. Wie konfiguriere ich den Client so, dass der Proxy ignoriert wird, wenn er nicht verfügbar ist?

Lekensteyn
quelle
Verwenden Sie die Zeroconf-Erkennung oder legen Sie den Proxy auf jedem Client manuell fest?
Jorge Castro
Ich stelle den Proxy wegen möglicher Firewalls / deaktivierter Übertragung manuell ein.
Lekensteyn

Antworten:

20

Es gibt eine undokumentierte Einstellung Acquire::http::ProxyAutoDetect. Diese Einstellung sollte den vollständigen Pfad zur Binärdatei enthalten und darf keine Argumente enthalten. Der Befehl sollte den zu verwendenden Proxy ausgeben (Beispiel:) http://10.0.0.1:8000.

Anhand der obigen Informationen könnte ein Skript erstellt werden, das vor dem Festlegen eines Proxys versucht, einen Proxy zu erstellen. Wenn kein Proxy verfügbar ist, sollte eine direkte Verbindung verwendet werden.

Nachfolgend finden Sie ein solches Proxy-Erkennungsskript, das die http://10.0.0.1:8000/und http://10.0.0.2:8000-Proxies ausprobiert.

Gib den Code ein in /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

Jetzt muss APT für die Verwendung des obigen Proxy-Erkennungsskripts konfiguriert werden. Geben Sie daher den folgenden Code ein /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";

Ich habe auch den nächsten Code in die Datei eingefügt, um zu verhindern, dass ein Host als Proxy fungiert.

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

Standardmäßig gibt das Skript aus, ob ein Proxy verwendet wird oder nicht. Um dies zu deaktivieren, bearbeiten Sie /etc/apt/detect-http-proxyund wechseln Sie show_proxy_messages=1zu show_proxy_messages=0.

Lekensteyn
quelle
Lekensteyn, könnte ich Ihre Erlaubnis haben, das als Option in Marionetten-Apt-Cacher-Ng einzufügen apt-cacher-ng::client?
Garth Kidd
1
Erlaubnis erteilt, mach was immer du willst :)
Lekensteyn
2
Ich bin sehr froh, diese Antwort gefunden zu haben, als ich vor einiger Zeit apt-cacher-ng eingerichtet habe. Ich habe apt-cacher-ng auf einem meiner Heimcomputer installiert (192.168.0.2). Das Skript war ein bisschen übertrieben für meinen Fall, so dass ich ein vereinfachtes schrieb Ermittlungs- http-Proxy: if nc -w1 -z 192.168.0.2 3142; then printf http://192.168.0.2:3142; else printf DIRECT; fi. Hoffen wir nur, dass das undokumentierte Feature entfernt wird :)
geirha
2
Ich habe das Drehbuch zu Ihrem Vorteil ausführlich dokumentiert. Wenn Sie sich für die Größe interessieren, können Sie es noch kürzer machen mit i=192.168.0.2;nc -zw1 $i 3142&&echo http://$i:3142/||echo DIRECT: p
Lekensteyn
3

Es gibt jetzt einen offiziell unterstützten Weg, dies zu tun - mit der Option - Acquire::http::Proxy-Auto-Detect(siehe apt.confManpage). Das Verhalten ähnelt dem alten undokumentierten Acquire::http::ProxyAutoDetect(beachten Sie das Vorhandensein / Fehlen von Bindestrichen in neuen / alten Konfigurationsoptionen), es ist weitgehend abwärtskompatibel, wurde jedoch erweitert ...

Ich bin dabei, den Betreuern von apt einen Patch zur Verbesserung der Dokumentation zu übermitteln, aber da es unwahrscheinlich ist, dass dies zu einer Version von apt wird, die für eine Weile mit einer Distribution ausgeliefert wird, füge ich den Text von hinzu den vorgeschlagenen Patch hier:

Acquire::http::Proxy-Auto-Detectkann verwendet werden, um einen externen Befehl anzugeben, mit dem der zu verwendende http-Proxy ermittelt wird. APT kann den Befehl mehrmals aufrufen und übergibt dem Befehl einen URI als ersten und einzigen Parameter. APT erwartet, dass der Befehl den Proxy ausgibt, der verwendet wird, um die betreffende URI auf seiner Standardausgabe als einzelne Zeile im Stil zu kontaktieren http://proxy:port/, oder das Wort, DIRECTwenn kein Proxy verwendet werden soll. Keine Ausgabe zeigt an, dass die allgemeinen Proxy-Einstellungen verwendet werden sollten.

Beachten Sie, dass die automatische Erkennung für einen Host nicht verwendet wird, wenn über bereits eine hostspezifische Proxy-Konfiguration festgelegt wurde Acquire::http::Proxy::HOST.

Um Interaktionen mit dem externen Befehl zu diagnostizieren, setzen Debug::Acquire::http=yesund / oder verwenden Sie Debug::Acquire::https=yesz. B. den -oBefehlszeilenparameter.

Beachten Sie, dass bei Verwendung einer Vorabversion von apt, Versionen 1.3 ~ exp2 bis 1.3, ein (wahrscheinlich durch 1.3.1 behobener) Fehler vorliegt, der apt veranlasst, den stderr des externen Befehls zusammen mit dem stdout zu analysieren .

Tim Small
quelle
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

Befehlszeile

  • Es muss ncfunktionieren ( sudo apt-get install netcat), wenn es fehlt.
  • Stell sicher, dass du chmod +x /usr/local/bin/apt-proxy-detect.sh
  • Verwenden Sie den vollständigen Pfad, wenn Sie das Skript angeben.

Wie es funktioniert

Wenn es eine Verbindung zu einem Proxy herstellen kann, druckt es den Proxy aus, den APT verwendet. Wenn dies nicht möglich ist, werden DIRECT- und APT-Tucker normal ausgegeben.

Soße

Luke Mlsna
quelle