Wenn ich einen Befehl mit sudo verwende, sind die Umgebungsvariablen nicht vorhanden. Zum Beispiel funktioniert der Befehl nach dem Setzen von HTTP_PROXY wget
ohne sudo
. Wenn ich jedoch tippe sudo wget
, heißt es, dass die Proxy-Einstellung nicht umgangen werden kann.
linux
environment-variables
sudo
Ahmed Aswani
quelle
quelle
Antworten:
Zuerst musst du
export HTTP_PROXY
. Zweitens müssen Sieman sudo
sorgfältig lesen und auf die-E
Flagge achten . Das funktioniert:Hier ist das Zitat aus der Manpage:
quelle
LC_*
Variablen. Also einfach tunexport LOL_FOO=$LC_FOO
undLOL_FOO
stattdessen verwenden.PATH
in der.bashrc
Datei -, sagen sieexport PATH=myPath:$PATH
. Wenn ich schreibesudo -E bash -c 'echo $PATH'
, dannPATH
enthält keine myPath wahrscheinlich , weilsudo
bereits den lokalen Wert deaktiviertPATH
vor dem Aufrufbash
. Vielmehr fand ich die Antwort unter stackoverflow.com/a/33183620/5459638 effektiv, das heißtsudo PATH=$PATH command
Der Trick besteht darin, Umgebungsvariablen
sudoers
persudo visudo
Befehl zur Datei hinzuzufügen und folgende Zeilen hinzuzufügen:entnommen aus dem 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:
quelle
sudo -E
ist der sichere Weg, um Ad-hoc den gleichen Effekt für ein einmaliges Ergebnis zu erzielenetc/sudoers
direkt bearbeiten sollten . Verwenden Sie stattdessen denvisudo
Befehl, der Ihre Änderungen syntaktisch überprüft, bevor Sie diesudoers
Datei überschreiben . Auf diese Weise sperren Sie sich nicht aus, wenn Sie beim Bearbeiten einen Fehler machen.Für einzelne Variablen, die Sie einmalig verfügbar machen möchten, können Sie sie Teil des Befehls machen.
quelle
package
unter myPath getestet , derPATH
in der.bashrc
Datei hinzugefügt wurde (mitexport
Klausel). Dannsudo PATH=$PATH which package
findet er im Gegensatz dazu die richtige Antwortsudo which package
. Allerdingssudo PATH=$PATH package
geht nicht weiter alssudo package
(Datei nicht gefunden). Auf der anderen Seite bewahrt das Starten einer Ebenepackage
aus einer mit aufgerufenen Muschelsudo bash
den erweiterten Pfad und gibtpackage
Sudo-Rechte (zwei Tauben mit einer Klappe). Die Antwort hängt also wirklich davon ab, welche Befehle Sie startenSie können die beiden
env_keep
Aussagen in Ahmed Aswanis Antwort auch zu einer einzigen Aussage wie dieser kombinieren :Defaults env_keep += "http_proxy https_proxy"
Sie sollten auch in Betracht ziehen,
env_keep
nur einen einzigen Befehl wie diesen anzugeben :Defaults!/bin/[your_command] env_keep += "http_proxy https_proxy"
quelle
Eine einfache Wrapper-Funktion (oder eine Inline-for-Schleife)
Ich habe eine einzigartige Lösung gefunden, weil:
sudo -E "$@"
Es gab Variablen, die Probleme für meinen Befehl verursachtensudo VAR1="$VAR1" ... VAR42="$VAR42" "$@"
war lang und hässlich in meinem Falldemo.sh
Ergebnis
Wie?
Dies wird durch eine Funktion der eingebauten Bash ermöglicht
printf
. Das%q
erzeugt eine Shell-Zeichenfolge in Anführungszeichen. Im Gegensatz zur Parametererweiterung in Bash 4.4 funktioniert dies in Bash-Versionen <4.0quelle
Wenn Sie die Umgebungsvariablen in einem Skript behalten müssen, können Sie Ihren Befehl in ein solches Dokument einfügen. Besonders wenn Sie viele Variablen haben, um die Dinge auf diese Weise ordentlich einzustellen.
quelle