it-swarm.com.de

So behalten Sie Umgebungsvariablen bei, wenn Sie sudo verwenden

Wenn ich einen Befehl mit Sudo verwende, sind die Umgebungsvariablen nicht vorhanden. Zum Beispiel funktioniert nach dem Setzen von HTTP_PROXY der Befehl wget ohne Sudo. Wenn ich jedoch Sudo wget eingebe, heißt es, dass die Proxy-Einstellung nicht umgangen werden kann.

380
Ahmed Aswani

Der Trick besteht darin, Umgebungsvariablen über den Befehl Sudo visudo zur Datei sudoers hinzuzufügen und die folgenden Zeilen hinzuzufügen:

Defaults env_keep += "ftp_proxy http_proxy https_proxy no_proxy"

entnommen aus ArchLinux-Wiki .

Für Ubuntu 14 müssen Sie in separaten Zeilen angeben, da die Fehler für Zeilen mit mehreren Variablen zurückgegeben werden:

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

Zuerst musst du export HTTP_PROXY. Zweitens müssen Sie man Sudo sorgfältig lesen und auf das -E -Flag achten. Das funktioniert:

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

Hier ist das Zitat aus der Manpage:

-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

Für einzelne Variablen, die Sie einmalig zur Verfügung stellen möchten, können Sie sie als Teil des Befehls definieren.

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

Sie können auch die beiden env_keep -Anweisungen in Ahmed Aswanis Antwort zu einer einzigen Anweisung wie der folgenden kombinieren:

Defaults env_keep += "http_proxy https_proxy"

Sie sollten auch erwägen, env_keep nur für einen einzigen Befehl wie diesen anzugeben:

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

22
Stian S

Wenn Sie die Umgebungsvariablen in einem Skript behalten müssen, können Sie Ihren Befehl in ein solches Dokument einfügen. Vor allem, wenn Sie viele Variablen zum Festlegen haben, sieht es auf diese Weise aufgeräumt aus.

# 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