586 Stimmen

Beibehaltung von Umgebungsvariablen bei der Verwendung von sudo

Wenn ich einen Befehl mit sudo verwende, sind die Umgebungsvariablen nicht vorhanden. Zum Beispiel wird nach dem Setzen von HTTP_PROXY der Befehl wget funktioniert gut ohne sudo . Wenn ich jedoch eingebe sudo wget Es sagt, dass es die Proxy-Einstellung nicht umgehen kann.

4voto

Seamus Punkte 760

Hinzufügen von Codeschnipseln zu /etc/sudoers.d

Ich weiß nicht, ob dies in allen Distributionen verfügbar ist, aber in Debian-basierten Distributionen gibt es eine Zeile am oder nahe dem Ende der /etc/sudoers Datei, die den Ordner /etc/sudoers.d . Darin kann man Code hinzufügen "Schnipsel" die die Konfiguration von sudo ändern. Insbesondere erlauben sie die Kontrolle über alle Umgebungsvariablen, die in sudo .

Wie bei /etc/sudoers diese "Code-Schnipsel" sollte mit visudo . Sie können mit der Lektüre der README die auch ein praktischer Ort ist, um Notizen zu machen:

$ sudo visudo -f /etc/sudoers.d/README 

# files for your snippets may be created/edited like so:

$ sudo visudo -f /etc/sudoers.d/20_mysnippets

Lesen Sie den Abschnitt "Befehlsumgebung" in 'man 5 sudoers'.

Die vielleicht informativste Dokumentation zur Umgebungskonfiguration in sudo findet sich in der Command environment Abschnitt von man 5 sudoers . Hier erfahren wir, dass eine sudoers Umgebungsvariablen, die standardmäßig blockiert sind, können sein "auf der Whitelist" unter Verwendung der env_check o env_keep Optionen; z.B.

Defaults env_keep += "http_proxy HTTP_PROXY"
Defaults env_keep += "https_proxy HTTPS_PROXY"
Defaults env_keep += "ftp_proxy FTP_PROXY"

Und so können wir im Fall des Auftraggebers die Prüfung "bestehen". sudoer's Umgebungsvariablen wie folgt:

$ sudo visudo -f /etc/sudoers.d/10_myenvwlist

# opens the default editor for entry of the following lines: 
Defaults env_keep += "http_proxy HTTP_PROXY"
Defaults env_keep += "https_proxy HTTPS_PROXY"
# and any others deemed useful/necessary
# Save the file, close the editor, and you are done!

Orientieren Sie sich an '# sudo -V'.

Der OP hat vermutlich die fehlende Umgebungsvariable in sudo por Versuch und Irrtum . Es ist jedoch möglich, proaktiv zu handeln: Eine Auflistung aller Umgebungsvariablen und ihres erlaubten oder verweigerten Status ist verfügbar (und für jeden Host eindeutig) über die root wie folgt auffordern:

# sudo -V
...
Environment variables to check for safety: 
...
Environment variables to remove: 
...
Environment variables to preserve:
...

Beachten Sie, dass eine Umgebungsvariable, die wie oben beschrieben auf der "Whitelist" steht, in den nachfolgenden Auflistungen von sudo -V unter dem Eintrag "bewahren".

0voto

Wolfgang Fahl Punkte 13424

Wenn Sie die Umgebungsvariablen in einem Skript aufbewahren müssen, können Sie Ihren Befehl in ein Dokument wie dieses hier einfügen. Vor allem, wenn Sie viele Variablen zu setzen haben, sehen die Dinge auf diese Weise ordentlich 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

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X