A variável de ambiente não parece funcionar no sudo

6

Eu uso o apt por trás de um firewall, então eu especifico um proxy na variável de ambiente http_proxy .

O que eu fiz foi adicionar a seguinte linha ao .profile e .bashrc (para uma boa medida) do usuário root:

export http_proxy=http://proxyserver:8080

Quando faço o seguinte, imprime o valor do proxy corretamente:

sudo echo $http_proxy

No entanto, quando eu chamo sudo apt-get update , parece não ver a variável http_proxy como usuário root.

Somente quando eu su para root, apt-get funciona como esperado, através do proxy, então obviamente vê a variável.

Então, minha pergunta é, como acima, por que sudo apt-get não vê a variável?

UPDATE Acabei de aprender que quando eu chamo sudo echo , ele ecoa o valor da variável definida no perfil do usuário atual. Mas, mesmo assim, por que sudo apt-get não usa esse valor de variável?

    
por mydoghasworms 05.04.2013 / 08:30

5 respostas

5

Não "parece não funcionar" no caso de sudo apt-get , parece funcionar quando você faz sudo echo $http_proxy .

Quando você insere um comando shell, ele expande e expande todas as variáveis e aliases antes de serem executados.

Então, sudo echo $http_proxy se torna sudo echo http://proxyserver:8080 , que passa bem.

O motivo $http_proxy não é visto por apt-get porque sudo limpa todas as variáveis de ambiente, exceto as que estão explicitamente na lista de permissões em /etc/sudoers com a diretiva env_keep .

Mais informações sobre como manipular a maneira como sudo lida com variáveis de ambiente (ou como, normalmente, não ) podem ser encontradas em man sudoers .

    
por 05.04.2013 / 13:09
2

Apenas para informá-lo, porque é nisso que eu decidi, sendo específico para este caso e, portanto, uma solução melhor, é modificar /etc/apt/apt.conf para adicionar uma linha ao proxy:

Acquire::http::Proxy "http://yourproxyaddress:proxyport";

Como este sistema reside permanentemente atrás do proxy, esta é uma solução melhor do que usar a variável de ambiente http_proxy no longo prazo.

    
por 05.04.2013 / 08:53
2

Ah, acabei de ver algo nesta página:

link

If you normally use sudo to run apt-get you will need to login as root first for this to work unless you also add some explicit environment settings to /etc/sudoers, e.g.

Defaults env_keep = "http_proxy https_proxy ftp_proxy"

Embora não entre em detalhes sobre o motivo (a menos que eu tenha perdido), isso confirma minha experiência e me dá a solução que preciso.

    
por 05.04.2013 / 08:37
0

Como já foi mencionado, sudo limpa variáveis de ambiente personalizadas definidas pelo usuário.

Como solução alternativa, você pode tentar:

export http_proxy='http://proxyserver:8080'
sudo sh -c 'export "${1}"; echo "$http_proxy"; apt-get update' _ "http_proxy=${http_proxy}"
    
por 05.04.2013 / 15:22
0

Acho que você só precisa usar a opção '-E' para o sudo, por exemplo

sudo -E echo $http_proxy
    
por 05.04.2013 / 16:05