web-dev-qa-db-fra.com

Comment conserver les variables d'environnement lors de l'utilisation de sudo

Lorsque j'utilise une commande avec Sudo, les variables d'environnement ne sont pas présentes. Par exemple, après avoir défini HTTP_PROXY, la commande wget fonctionne correctement sans Sudo. Cependant, si je tape Sudo wget, il indique qu'il ne peut pas contourner le paramètre de proxy.

380
Ahmed Aswani

L'astuce consiste à ajouter des variables d'environnement au fichier sudoers via la commande Sudo visudo et d'ajouter les lignes suivantes:

Defaults env_keep += "ftp_proxy http_proxy https_proxy no_proxy"

tiré de ArchLinux wiki .

Pour Ubuntu 14, vous devez spécifier dans des lignes séparées car il renvoie les erreurs pour les lignes multi-variables:

Defaults  env_keep += "http_proxy"
Defaults  env_keep += "https_proxy"
Defaults  env_keep += "HTTP_PROXY"
Defaults  env_keep += "HTTPS_PROXY"
289
Ahmed Aswani

Vous devez d’abord export HTTP_PROXY. Deuxièmement, vous devez lire attentivement man Sudo et faire attention au drapeau -E. Cela marche:

$ export HTTP_PROXY=foof
$ Sudo -E bash -c 'echo $HTTP_PROXY'

Voici la citation de la page de manuel:

-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.
440
Employed Russian

Pour les variables individuelles que vous souhaitez rendre disponibles au cas par cas, vous pouvez les intégrer à la commande.

Sudo http_proxy=$http_proxy wget "http://stackoverflow.com"
52
buckaroo1177125

Vous pouvez également combiner les deux déclarations env_keep de la réponse de Ahmed Aswani en une seule déclaration comme celle-ci:

Defaults env_keep += "http_proxy https_proxy"

Vous devriez également envisager de spécifier env_keep pour une seule commande comme celle-ci:

Defaults!/bin/[your_command] env_keep += "http_proxy https_proxy"

22
Stian S

Si vous avez besoin de conserver les variables d'environnement dans un script, vous pouvez placer votre commande dans un document here comme celui-ci. Surtout si vous avez beaucoup de variables pour régler les choses de cette manière.

# 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
0
Wolfgang Fahl