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.
Antworten
Zu viele Anzeigen?Zunächst müssen Sie export HTTP_PROXY
. Zweitens: Sie müssen lesen man sudo
und sehen Sie sich die -E
Flagge. 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.
Der Trick besteht darin, Umgebungsvariablen zu sudoers
Datei über sudo visudo
und fügen Sie diese Zeilen hinzu:
Defaults env_keep += "ftp_proxy http_proxy https_proxy no_proxy"
entnommen aus ArchLinux-Wiki .
Bei Ubuntu 14 müssen Sie die Angaben in separaten Zeilen machen, da bei mehrvariablen Zeilen Fehler auftreten:
Defaults env_keep += "http_proxy"
Defaults env_keep += "https_proxy"
Defaults env_keep += "HTTP_PROXY"
Defaults env_keep += "HTTPS_PROXY"
Sie können die beiden auch kombinieren env_keep
Aussagen in der Antwort von Ahmed Aswani zu einer einzigen Aussage wie dieser zusammenfassen:
Defaults env_keep += "http_proxy https_proxy"
Sie sollten auch folgende Angaben machen env_keep
für nur einen einzigen Befehl wie diesen:
Defaults!/bin/[your_command] env_keep += "http_proxy https_proxy"
Eine einfache Wrapper-Funktion (oder in-line for-Schleife)
Ich habe eine einzigartige Lösung gefunden, weil:
sudo -E "$@"
undichte Variablen, die Probleme für meinen Befehl verursachtensudo VAR1="$VAR1" ... VAR42="$VAR42" "$@"
war in meinem Fall lang und hässlich
demo.sh
#!/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
Ergebnis
$ ./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.
Wie?
Dies wird durch eine Funktion des Bash-Builtins ermöglicht printf
. Die %q
erzeugt eine Zeichenkette in Anführungszeichen. Anders als die Parametererweiterung in bash 4.4 Dies funktioniert in Bash-Versionen < 4.0
- See previous answers
- Weitere Antworten anzeigen