Wie kann ich dafür sorgen, dass sudo meine Umgebungsvariablen beibehält?

47

Mit sudo 1.7.4p4 unter Solaris 5.10 und sudo 1.6.7p5 unter RHEL4 u6 kann ich meine Umgebungsvariablen, z. B. $ PYTHONPATH, nicht beibehalten. Ich habe diese Zeile zu sudoers hinzugefügt, aber es macht keinen Unterschied:

Defaults !env_reset

Mache ich etwas falsch oder beachtet die sudo-Installation einfach nicht das env_reset-Flag?

Bearbeiten: Zumindest unter Solaris haben wir festgestellt, dass dieses Problem von der Shell abhängt! Die Standard-Root-Shell ist Bourne. Wenn Sie Bash unter sudo ( sudo bash) ausführen, wird die Umgebung durch! Env_preset erhalten (einschließlich PATH und LD_LIBRARY_PATH). Das ist ziemlich verwirrend, muss ich sagen.

aknuds1
quelle

Antworten:

44

Vorsichtig verwenden, es gibt Sicherheitsprobleme mit sudo und Variablen.

Von man sudoersmir fand ich, dass du verwenden solltest

Standardeinstellung ist env_reset
Standardwerte env_keep + = "PYTHONPATH ANDERVARIABLE YETANOTHER"

Erhält in Ubuntu sudoeinige Variablen. sudo -iEs ist eher so, als würde man sich als root anmelden und dann den Befehl ausführen. Beides kann unpraktisch sein, da erstere Stammdateien sudo nano myfilein Ihrem Heim belässt und letztere sudo -i nano myfileversuchen, / root / myfile zu öffnen.


Lauf

sudo printenv PATH

und sehen, was es gibt. Hier gibt es

/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/X11R6/bin

zum Beispiel. Führen sudo visudoSie nun die Zeile aus und fügen Sie sie hinzu

Defaults        secure_path=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/X11R6/bin

Ersetzen durch das, was Sie gerade zuvor gefunden haben. Fügen Sie bei Bedarf einen neuen Pfad hinzu.

Über Bibliotheken:

sudo LD_LIBRARY_PATH=/usr/lib/path/to/a/safe/library your command

Linux-Distributionen sind sehr PATHvorsichtig, und Sie sollten wirklich vorsichtig sein, bevor Sie damit spielen. Seien Sie besonders vorsichtig, wenn Sie Pfade wie " ." oder " " hinzufügen. Dies /home/usernameist unsicher.

Eine der Gefahren beim Hinzufügen von Pfaden besteht darin, dass die Möglichkeit besteht, dass Dateien auf diesen Pfaden ausgeführt werden rootund ein Fenster in der Systemsicherheit geöffnet wird, das möglicherweise von bösartiger Software ausgenutzt wird. Es kann andere Gefahren geben. Stellen Sie einfach sicher, dass Sie wissen, was Sie tun. Durch das Umgehen von sudoSicherheitsmaßnahmen wird Solaris möglicherweise so sicher wie Windows XP.

user39559
quelle
Danke für den Vorschlag. Zumindest unter Solaris scheint env_keep jedoch nur teilweise zu funktionieren, da PATH und LD_LIBRARY_PATH ignoriert werden. Vielleicht wurde sudo mit Einstellungen erstellt, die verhindern, dass "gefährliche" Variablen erhalten bleiben?
aknuds1
Hat es mit einem anderen Vairable wie AKNUDS geklappt? Sie können auch sudo sudo -V (ja, zweimal sudo!) Ausführen und sehen, was darin steht. Hier funktioniert die obige Lösung gut mit PYTHONPATH, aber PATH scheint wirklich etwas Besonderes zu sein. Das wahre Problem ist mit PATH. In Ubuntu erstellen sie sudo, indem sie PATH absichtlich zurücksetzen.
user39559
env_keep hat für mich PYTHONPATH und HOME erhalten, daher ist offensichtlich eine gewisse Filterung im Gange.
Aknuds1
In Ihrer überarbeiteten Lösung schlagen Sie vor, den sudo-PFAD durch Ändern von secure_path fest zu verkabeln, oder? Ich glaube nicht, dass ich das machen will. Wir sind aber wahrscheinlich kurz davor, meine Frage zu beantworten. Ich denke, Sudo ist gebaut, um reset_env zu ignorieren und Variablen wie PATH und LD_LIBRARY_PATH zu ignorieren, wenn mit env_keep angegeben. Ich denke, ich kann ohne PATH / LD_LIBRARY_PATH unter sudo auskommen, es ist kein Problem, aber es ist immer noch interessant zu wissen, warum es nicht funktioniert :)
aknuds1
Es wird nicht funktionieren, weil die sudoAutoren sorgfältig darauf geachtet haben, Sie daran zu hindern. Sie möchten nicht, dass schädliche Bibliotheken geladen werden, da sie in dem von sudo verwendeten Pfad gefunden wurden. Deshalb wird es zurückgesetzt. Wenn Sie Dinge codieren, die von root ausgeführt werden sollen, kopieren Sie sie in das entsprechende Systemverzeichnis.
user39559
8

Hantieren mit sudoersist mit Vorsicht zu tun, wie andere gesagt haben.

Ein einfacherer Ansatz für einfachere Fälle, in denen bestimmte Umgebungsvariablen beibehalten werden sollen, besteht darin, die gewünschte Umgebungsvariable direkt über sudo zu übergeben (dies wird [VAR=value]in der sudo-Cmdline-Hilfe angezeigt).

Sehen Sie sich dieses kleine Beispiel an, in dem ich es auch für mehr als eine Variable demonstriert habe.

$ export MY_V1=1
$ export MY_V2=2
$ printenv | grep MY_V
MY_V2=2
MY_V1=1
$ sudo MY_V1=$MY_V1 MY_V2=$MY_V2 printenv | grep MY_V
MY_V2=2
MY_V1=1

PYTHONPATHVerwenden Sie für das ursprüngliche Beispiel in der Frage einfach Folgendes:

$ sudo PYTHONPATH=$PYTHONPATH python some_script.py
<script_output_here>

Das Erstellen eines Alias ​​für diese Art von Dingen ist praktisch. Wie so:

$ alias sudopy='sudo PYTHONPATH=$PYTHONPATH python'
Russ
quelle
1
könnte gut sein, das zu machen - alias sudopy = 'sudo PYTHONPATH = $ PYTHONPATH python' - dann benutze sudopy some_script.py
Able Mac
@AbleMac Du hast recht. Das war ein Fehler ... Ich werde es beheben. Vielen Dank!
Russ
3

Sie sehen in Defaults !env_resetOrdnung aus, vorausgesetzt, Sie rufen mit dieser -EOption nicht auch sudo auf .

Sie können versuchen, diesen Eintrag vollständig zu entfernen.

Haben Sie überprüft, ob Sie die richtige sudoers-Datei bearbeiten? Ich vermute, es könnte sein /etc/sudoersoder /usr/local/etc/sudoersje nachdem, wie es installiert wurde. Hast du es mit bearbeitet visudo?

Wie läuft Sudo? sudo python, sudo su, sudo su -, sudo -s, Etwas anderes? Nur sudo pythonund sudo suwürde Ihre Umwelt erhalten.

Was env | grep PYTHONPATHheißt das? Wenn nichts, stellen Sie sicher, dass PYTHONPATH exportiert wird, indem Sie ausführen export PYTHONPATHund es erneut versuchen.

Was sudo env | grep PYTHONPATHheißt das? Wenn der erwartete Wert ausgegeben wird, überschreibt etwas anderes Ihren PYTHONPATH-Wert. Vielleicht Roots .bashrc oder .bash_profile oder die systemweiten Konfigurationsdateien.

Mikel
quelle
1
Ich bin mir ziemlich sicher, dass ich die richtigen Sudoer bearbeite, wobei das Installationspräfix sudo entspricht. Ich lasse sudo als "sudo su" laufen. Ich werde mich in ein paar Tagen leider bei Ihnen melden müssen, um den Rest Ihrer Vorschläge zu beantworten. Vielen Dank!
aknuds1
1
Versuchen Sie, eine unwichtige Einstellung wie editoroder passpromptzu ändern, um festzustellen, ob Sie die richtige Datei haben. Oder verwenden Sie strace, dtrace, truss oder ähnliches und sehen Sie, welche Dateien geöffnet werden.
Mikel
env | grep PYTHONPATH wie mein Benutzer den erwarteten Wert druckt, unter sudo wird jedoch nichts gedruckt. Wenn ich Sudoer bearbeite, kann ich sicherstellen, dass PYTHONPATH erhalten bleibt, indem ich "env_keep" ändere. Env_keep behält jedoch weder PATH noch LD_LIBRARY_PATH bei. Ich vermute, sudo hat eine Sicherheitsbeschränkung, um Variablen wie PATH und LD_LIBRARY_PATH nicht beizubehalten? Eine Build-Time-Einstellung vielleicht?
Aknuds1
1
! env_reset wird, soweit ich das beurteilen kann, ignoriert, aber ich kann es morgen noch einmal überprüfen. Ich bin mir ziemlich sicher, dass env_delete nicht gesetzt ist, aber ich kann das auch überprüfen.
Aknuds1
1
Ich habe bestätigt, dass! Env_reset ignoriert wird und env_delete nicht gesetzt ist.
Aknuds1
-1

Laut Ubuntu-Dokumentation für LD_LIBRARY_PATH :

Sie müssen die Konfigurationsdateien /etc/ld.so.conf.d/*.conf verwenden

Dann:

  1. Fügen Sie eine ld.soKonfigurationsdatei /etc/ld.so.conf.d/mit dem Pfad Ihrer hinzuLD_LIBRARY_PATH

  2. Aktualisiere den Cache mit:

    sudo ldconfig -v
    
OlPo
quelle
Schön, aber die Frage ist nicht über Ubuntu. Hinweis: Schauen Sie sich das nächste Mal die Tags unter der Frage an.
DavidPostill