Quando uso qualsiasi comando con sudo le variabili di ambiente non ci sono. Ad esempio, dopo aver impostato HTTP_PROXY, il comando wget
funziona senza sudo
. Tuttavia, se digito sudo wget
, dice che non può ignorare l'impostazione del proxy.
Quando uso qualsiasi comando con sudo le variabili di ambiente non ci sono. Ad esempio, dopo aver impostato HTTP_PROXY, il comando wget
funziona senza sudo
. Tuttavia, se digito sudo wget
, dice che non può ignorare l'impostazione del proxy.
Risposte:
Per prima cosa devi export HTTP_PROXY
. In secondo luogo, è necessario leggere man sudo
attentamente e prestare attenzione alla -E
bandiera. Questo funziona:
$ export HTTP_PROXY=foof
$ sudo -E bash -c 'echo $HTTP_PROXY'
Ecco la citazione dalla pagina man:
-E, --preserve-env
Indicates to the security policy that the user wishes to preserve their
existing environment variables. The security policy may return an error
if the user does not have permission to preserve the environment.
LC_*
variabile. Quindi basta fare export LOL_FOO=$LC_FOO
e usare LOL_FOO
invece.
PATH
nel .bashrc
file di - per esempio, export PATH=myPath:$PATH
. Se scriv sudo -E bash -c 'echo $PATH'
, quindi PATH
non contiene myPath probabilmente perché sudo
ha già disattivato il valore locale di PATH
prima di chiamare bash
. Piuttosto, ho trovato la risposta sotto stackoverflow.com/a/33183620/5459638 efficace, cioèsudo PATH=$PATH command
Il trucco è aggiungere variabili di ambiente al sudoers
file tramite sudo visudo
comando e aggiungere queste righe:
Defaults env_keep += "ftp_proxy http_proxy https_proxy no_proxy"
tratto dal wiki di ArchLinux .
Per Ubuntu 14, è necessario specificare in righe separate poiché restituisce gli errori per le righe multi-variabile:
Defaults env_keep += "http_proxy"
Defaults env_keep += "https_proxy"
Defaults env_keep += "HTTP_PROXY"
Defaults env_keep += "HTTPS_PROXY"
sudo -E
è il modo sicuro per ottenere lo stesso effetto per una tantum, però
etc/sudoers
direttamente. Utilizzare invece il visudo
comando, che controlla la sintassi delle modifiche prima di sovrascrivere il sudoers
file. In questo modo, non ti blocchi se commetti un errore durante la modifica.
Per le singole variabili che si desidera rendere disponibili una tantum, è possibile renderlo parte del comando.
sudo http_proxy=$http_proxy wget "http://stackoverflow.com"
package
sotto qualche myPath aggiunto PATH
nel .bashrc
file (con export
clausule). Quindi sudo PATH=$PATH which package
trova la risposta giusta, a differenza sudo which package
. Tuttavia, sudo PATH=$PATH package
non va oltre sudo package
(file non trovato). D'altra parte, il lancio di una pianura package
da una shell invocata con sudo bash
conserva il percorso esteso e conferisce i package
diritti di sudo (due piccioni con una fava). Quindi la risposta dipende davvero da quali comandi stai lanciando
Puoi anche combinare le due env_keep
affermazioni nella risposta di Ahmed Aswani in un'unica affermazione come questa:
Defaults env_keep += "http_proxy https_proxy"
Dovresti anche considerare di specificare env_keep
un solo comando come questo:
Defaults!/bin/[your_command] env_keep += "http_proxy https_proxy"
Ho trovato una soluzione unica perché:
sudo -E "$@"
perdeva variabili che causavano problemi al mio comandosudo VAR1="$VAR1" ... VAR42="$VAR42" "$@"
era lungo e brutto nel mio caso#!/bin/bash
function sudo_exports(){
eval sudo $(for x in $_EXPORTS; do printf '%q=%q ' "$x" "${!x}"; done;) "$@"
}
# create a test script to call as sudo
echo 'echo Forty-Two is $VAR42' > sudo_test.sh
chmod +x sudo_test.sh
export VAR42="The Answer to the Ultimate Question of Life, The Universe, and Everything."
export _EXPORTS="_EXPORTS VAR1 VAR2 VAR3 VAR4 VAR5 VAR6 VAR7 VAR8 VAR9 VAR10 VAR11 VAR12 VAR13 VAR14 VAR15 VAR16 VAR17 VAR18 VAR19 VAR20 VAR21 VAR22 VAR23 VAR24 VAR25 VAR26 VAR27 VAR28 VAR29 VAR30 VAR31 VAR32 VAR33 VAR34 VAR35 VAR36 VAR37 VAR38 VAR39 VAR40 VAR41 VAR42"
# clean function style
sudo_exports ./sudo_test.sh
# or just use the content of the function
eval sudo $(for x in $_EXPORTS; do printf '%q=%q ' "$x" "${!x}"; done;) ./sudo_test.sh
$ ./demo.sh
Forty-Two is The Answer to the Ultimate Question of Life, The Universe, and Everything.
Forty-Two is The Answer to the Ultimate Question of Life, The Universe, and Everything.
Ciò è reso possibile da una funzione del built-in bash printf
. Il %q
produce una stringa tra virgolette shell. A differenza dell'espansione dei parametri in bash 4.4 , questo funziona nelle versioni bash <4.0
Se hai la necessità di mantenere le variabili di ambiente in uno script puoi inserire il tuo comando in un documento qui come questo. Soprattutto se hai molte variabili per sistemare le cose in questo modo.
# prepare a script e.g. for running maven
runmaven=/tmp/runmaven$$
# create the script with a here document
cat << EOF > $runmaven
#!/bin/bash
# run the maven clean with environment variables set
export ANT_HOME=/usr/share/ant
export MAKEFLAGS=-j4
mvn clean install
EOF
# make the script executable
chmod +x $runmaven
# run it
sudo $runmaven
# remove it or comment out to keep
rm $runmaven