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.

659voto

Employed Russian Punkte 180738

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.

382voto

Ahmed Aswani Punkte 7671

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"

94voto

buckaroo1177125 Punkte 1355

Für einzelne Variablen, die Sie einmalig verfügbar machen wollen, können Sie sie in den Befehl aufnehmen.

sudo http_proxy=$http_proxy wget "http://stackoverflow.com"

27voto

Stian S Punkte 527

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"

13voto

Bruno Bronosky Punkte 60135

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 verursachten
  • sudo 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

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