Como ignorar um proxy se não estiver disponível?

15

Siga as instruções em Melhor maneira de cache de downloads do apt em uma LAN? , eu configurei um proxy de cache na minha rede local. Como essa máquina nem sempre está ativa, gostaria de atualizar a lista de fontes e instalar pacotes sem usar esse proxy, se não estiver disponível.

Eu já li a seção Adquirir grupo na página de manual de apt.conf(5) , mas não consegui encontrar uma opção como" Falha silenciosa ".

No momento, sudo apt-get update e comandos relacionados falham porque nenhuma conexão pôde ser estabelecida. Então, como eu configuro o cliente para que o proxy seja ignorado se não estiver disponível?

    
por Lekensteyn 17.07.2011 / 14:24

2 respostas

20

Existe uma configuração não documentada, Acquire::http::ProxyAutoDetect . Essa configuração deve conter o caminho completo para o binário e não pode ter argumentos. O comando deve gerar o proxy a ser usado (exemplo: http://10.0.0.1:8000 ).

Dadas as informações acima, é possível criar um script que tente um proxy antes de defini-lo. Se nenhum proxy estiver disponível, uma conexão direta deve ser usada.

Abaixo está um script de detecção de proxy que tenta os http://10.0.0.1:8000/ e http://10.0.0.2:8000 proxies.

Coloque o código em /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

Agora, o APT deve ser configurado para usar o script de detecção de proxy acima, portanto, coloque o seguinte código em /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";

Eu também coloquei o próximo código no arquivo para evitar que algum host seja proxificado.

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

Por padrão, o script mostra se um proxy é usado ou não. Para desativá-lo, edite /etc/apt/detect-http-proxy e altere show_proxy_messages=1 para show_proxy_messages=0 .

    
por Lekensteyn 22.07.2011 / 09:26
3

Existe agora uma maneira oficialmente suportada de fazer isso - usando a opção - Acquire::http::Proxy-Auto-Detect (consulte apt.conf man page). Comportamento é semelhante ao antigo% documentadoAcquire::http::ProxyAutoDetect (observe presença / ausência de hífens em opções de configuração novas / antigas), é amplamente compatível com versões anteriores, mas foi estendido ...

Eu estou no processo de enviar um patch para os mantenedores do apt para melhorar a documentação, mas como é improvável que isso seja feito em uma versão do apt que vem com uma distribuição de distro por um bom tempo, eu vou incluir o texto do patch proposto aqui:

Acquire::http::Proxy-Auto-Detect pode ser usado para especificar um comando externo para descobrir o proxy http a ser usado. O APT pode invocar o comando várias vezes e passará um URI ao comando como seu primeiro e único parâmetro. O APT espera que o comando emita o proxy que deve ser usado para contatar o URI em questão em seu stdout como uma única linha no estilo http://proxy:port/ , ou a palavra DIRECT se nenhum proxy deve ser usado. Nenhuma saída indica que as configurações de proxy genéricas devem ser usadas.

Observe que a detecção automática não será usada para um host se uma configuração de proxy específica do host já estiver definida por meio de Acquire::http::Proxy::HOST .

Para diagnosticar interações com o comando externo, defina Debug::Acquire::http=yes e / ou Debug::Acquire::https=yes , por exemplo, usando o parâmetro de linha de comando -o .

Note que usando uma versão de pré-lançamento do apt, versões 1.3 ~ exp2 para 1.3, então existe um bug (provavelmente corrigido por 1.3.1) que faz com que o apt analise o stderr do comando externo junto com o stdout.

    
por Tim Small 29.09.2016 / 18:07