Quando eu uso qualquer comando com sudo, as variáveis de ambiente não estão lá. Por exemplo, depois de definir HTTP_PROXY, o comando wget
funciona bem sem sudo
. No entanto, se eu digitar, sudo wget
ele diz que não pode ignorar a configuração de proxy.
linux
environment-variables
sudo
Ahmed Aswani
fonte
fonte
Respostas:
Primeiro você precisa
export HTTP_PROXY
. Segundo, você precisa lerman sudo
atentamente e prestar atenção à-E
bandeira. Isso funciona:Aqui está a citação da página de manual:
fonte
LC_*
variável. Então, basta fazerexport LOL_FOO=$LC_FOO
e usarLOL_FOO
.PATH
no.bashrc
arquivo - digamos,export PATH=myPath:$PATH
. Se eu digitarsudo -E bash -c 'echo $PATH'
,PATH
provavelmente não conterá myPath porque provavelmentesudo
já desabilitou o valor local dePATH
antes de chamarbash
. Em vez disso, eu encontrei a resposta abaixo stackoverflow.com/a/33183620/5459638 eficaz, isto ésudo PATH=$PATH command
O truque é adicionar variáveis de ambiente ao
sudoers
arquivo viasudo visudo
comando e adicionar estas linhas:extraído do wiki do ArchLinux .
Para o Ubuntu 14, você precisa especificar em linhas separadas, pois ele retorna os erros para linhas com várias variáveis:
fonte
sudo -E
é a maneira infalível de adhoc obter o mesmo efeito em uma únicaetc/sudoers
diretamente. Em vez disso, use ovisudo
comando, que verifica a sintaxe de suas edições antes de substituir osudoers
arquivo. Dessa forma, você não se trava se cometer um erro durante a edição.Para variáveis individuais que você deseja disponibilizar de uma só vez, você pode torná-lo parte do comando.
fonte
package
sob algum myPath adicionado aPATH
no.bashrc
arquivo (comexport
clausule). Entãosudo PATH=$PATH which package
encontra a resposta certa, ao contráriosudo which package
. No entanto,sudo PATH=$PATH package
não vai além desudo package
(arquivo não encontrado). Por outro lado, lançar uma planície apackage
partir de uma concha invocada comsudo bash
preserva o caminho estendido e concedepackage
direitos ao sudo (dois pombos com uma pedra). Portanto, a resposta realmente depende de quais comandos você está iniciandoVocê também pode combinar as duas
env_keep
declarações da resposta de Ahmed Aswani em uma única declaração como esta:Defaults env_keep += "http_proxy https_proxy"
Você também deve especificar
env_keep
apenas um comando como este:Defaults!/bin/[your_command] env_keep += "http_proxy https_proxy"
fonte
Uma função simples de wrapper (ou em linha para loop)
Eu vim com uma solução única porque:
sudo -E "$@"
estava vazando variáveis que estavam causando problemas para o meu comandosudo VAR1="$VAR1" ... VAR42="$VAR42" "$@"
foi longo e feio no meu casodemo.sh
Resultado
Quão?
Isso é possível graças a um recurso do bash embutido
printf
. O%q
produz uma seqüência de caracteres citada pelo shell. Ao contrário da expansão de parâmetro no bash 4.4 , isso funciona nas versões do bash <4.0fonte
Se você precisar manter as variáveis de ambiente em um script, poderá colocar seu comando em um documento aqui como este. Especialmente se você tiver muitas variáveis para definir as coisas, dessa forma, arrume-as.
fonte