Come posso ignorare un proxy se non disponibile?


15

Seguendo le istruzioni nel modo migliore per memorizzare nella cache i download di apt su una LAN? , Ho impostato un proxy di memorizzazione nella cache nella mia rete locale. Dal momento che quella macchina non è sempre attiva, mi piacerebbe essere in grado di aggiornare l'elenco delle fonti e installare i pacchetti senza utilizzare quel proxy se non disponibile.

Ho già letto la sezione Acquisisci gruppo nella pagina del manuale di apt.conf(5), ma non sono riuscito a trovare un'opzione come "Silent-Fail".

Al momento, sudo apt-get updatee i relativi comandi falliscono perché non è stato possibile stabilire alcuna connessione. Quindi, come posso configurare il client in modo che il proxy venga ignorato se non è disponibile?


Stai utilizzando il rilevamento zeroconf o imposti manualmente il proxy su ciascun client?
Jorge Castro,

Sto impostando manualmente il proxy a causa di possibili firewall / trasmissione disabilitata.
Lekensteyn,

Risposte:


20

C'è un'impostazione non documentata, Acquire::http::ProxyAutoDetect. Questa impostazione dovrebbe contenere il percorso completo del file binario e non può avere argomenti. Il comando dovrebbe generare il proxy da utilizzare (esempio:) http://10.0.0.1:8000.

Date le informazioni di cui sopra, è possibile creare uno script che tenta un proxy prima di impostarlo. Se non è disponibile alcun proxy, è necessario utilizzare una connessione diretta.

Di seguito è riportato uno script di rilevamento proxy che prova i proxy http://10.0.0.1:8000/e http://10.0.0.2:8000.

Inserisci il codice in /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

Ora, APT deve essere configurato per utilizzare lo script di rilevamento proxy sopra riportato, quindi inserisci il seguente codice /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";

Ho anche inserito il codice successivo nel file per impedire che un host venga proxy.

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

Per impostazione predefinita, lo script indica se viene utilizzato o meno un proxy. Per disabilitarlo, modifica /etc/apt/detect-http-proxye modifica show_proxy_messages=1in show_proxy_messages=0.


Lekensteyn, potrei avere il tuo permesso di incollarlo in puppet-apt-cacher-ng come opzione per apt-cacher-ng::client?
Garth Kidd,

1
Autorizzazione concessa, fai quello che vuoi :)
Lekensteyn

2
Sono molto felice di aver trovato questa risposta quando ho installato apt-cacher-ng qualche tempo fa. Ho apt-cacher-ng installato su uno dei miei computer di casa (192.168.0.2). Lo script si sentiva un po 'eccessivo per il mio caso, così ho scritto un semplificato rilevare-http-proxy: if nc -w1 -z 192.168.0.2 3142; then printf http://192.168.0.2:3142; else printf DIRECT; fi. Speriamo solo che la funzione non documentata venga rimossa :)
geirha

2
Ho documentato ampiamente la sceneggiatura a tuo vantaggio, se ti preoccupi delle dimensioni puoi renderla ancora più breve con i=192.168.0.2;nc -zw1 $i 3142&&echo http://$i:3142/||echo DIRECT: p
Lekensteyn

3

Ora c'è un modo ufficialmente supportato per farlo - usando l'opzione - Acquire::http::Proxy-Auto-Detect(vedi la apt.confpagina man). Il comportamento è simile al vecchio non documentato Acquire::http::ProxyAutoDetect(nota presenza / assenza di trattini nelle nuove / vecchie opzioni di configurazione), è ampiamente retrocompatibile, ma è stato esteso ...

Sono in procinto di presentare una patch ai manutentori di apt per migliorare la documentazione, ma poiché è improbabile che questo diventi una versione di apt che viene fornita con una versione di distribuzione per un po ', includerò il testo di la patch proposta qui:

Acquire::http::Proxy-Auto-Detectpuò essere usato per specificare un comando esterno per scoprire il proxy http da usare. APT può richiamare il comando più volte e passerà un URI al comando come primo e unico parametro. APT si aspetta che il comando emetta il proxy che deve essere usato per contattare l'URI in questione sul suo stdout come una singola linea nello stile http://proxy:port/, o la parola DIRECTse non si deve usare alcun proxy. Nessun output indica che è necessario utilizzare le impostazioni proxy generiche.

Si noti che il rilevamento automatico non verrà utilizzato per un host se una configurazione proxy specifica dell'host è già impostata tramite Acquire::http::Proxy::HOST.

Per diagnosticare le interazioni con il comando esterno, impostare Debug::Acquire::http=yese / o Debug::Acquire::https=yesad esempio utilizzando il -oparametro della riga di comando.

Nota che sta usando una versione pre-release di apt, versioni da 1.3 ~ exp2 a 1.3, quindi c'è un bug (probabilmente risolto da 1.3.1) che fa sì che apt analizzi lo standard del comando esterno insieme allo standard.


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

Riga di comando

  • Deve ncfunzionare ( sudo apt-get install netcat) se manca.
  • Accertati di chmod +x /usr/local/bin/apt-proxy-detect.sh
  • Utilizzare il percorso completo quando si specifica lo script.

Come funziona

Se riesce a connettersi a un proxy, stampa il proxy che APT lo utilizza. In caso contrario, stampa normalmente i chugs DIRECT e APT.

salsa

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.