Wie mache ich, dass sudo meine Umgebungsvariablen beibehält?

90526
aknuds1

Verwenden von sudo 1.7.4p4 unter Solaris 5.10 und sudo 1.6.7p5 unter RHEL4 u6 Ich kann nicht sehen, wie meine Umgebungsvariablen beibehalten werden, beispielsweise $ PYTHONPATH. Ich habe diese Zeile zu Sudoern hinzugefügt, aber es macht keinen Unterschied:

Defaults !env_reset 

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

Edit: 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, erhält! Env_preset die Umgebung (einschließlich PATH und LD_LIBRARY_PATH). Das ist ziemlich verwirrend, muss ich sagen.

45
http://stackoverflow.com/questions/8633461/how-to-keep-environment-variables-when-using-sudo Ciro Santilli 新疆改造中心 六四事件 法轮功 vor 8 Jahren 0

4 Antworten auf die Frage

41
user39559

Verwenden Sie sorgfältig, es gibt Sicherheitsprobleme mit Sudo und Variablen.

Von man sudoersfand ich, dass Sie verwenden sollten

Standardwerte env_reset Defaults env_keep + = "PYTHONPATH ANDERE VARIABLE YETANOTHER" 

In Ubuntu sudobleiben einige Variablen erhalten. sudo -iEs ist mehr wie ein Login als root und dann den Befehl ausführen. Beides kann unbequem sein, die ersteren sudo nano myfilelassen root-eigene Dateien in Ihrem Zuhause und die letzteren 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

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

ersetzen durch das, was Sie gerade 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 nehmen viel Sorgfalt mit sich PATH, und Sie sollten vorsichtig sein, bevor Sie damit spielen. Seien Sie besonders vorsichtig beim Hinzufügen von Pfaden wie " ." oder /home/usernamees ist unsicher.

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

Danke für den Vorschlag. Zumindest unter Solaris scheint es jedoch, dass env_keep nur teilweise funktioniert, da PATH und LD_LIBRARY_PATH ignoriert werden. Vielleicht ist Sudo mit Einstellungen gebaut, die es ablehnen, "gefährliche" Variablen beizubehalten? aknuds1 vor 13 Jahren 0
Hat es mit einem anderen Anbieter wie AKNUDS funktioniert? 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 liegt bei PATH. In Ubuntu bauen sie Sudo, das PATH absichtlich zurücksetzt. user39559 vor 13 Jahren 0
env_keep hat für mich PYTHONPATH und HOME erhalten, daher gibt es offensichtlich einige Filter. aknuds1 vor 13 Jahren 0
In Ihrer überarbeiteten Lösung schlagen Sie vor, dass Sie den sudo PATH durch das Ändern von secure_path fest verdrahten, oder? Ich glaube nicht, dass ich das machen will. Wir sind wahrscheinlich schon nahe an einer Antwort auf meine Frage; Ich denke, Sudo ist so aufgebaut, dass es reset_env ignoriert und Variablen wie PATH und LD_LIBRARY_PATH ignoriert, wenn es mit env_keep angegeben wird. Ich denke, ich kann auf PATH / LD_LIBRARY_PATH verzichten, es ist kein großes Problem, aber es ist trotzdem interessant zu wissen, warum es nicht funktioniert :) aknuds1 vor 13 Jahren 0
Es wird nicht funktionieren, weil "sudo" -Schreiber Sie vorsichtig daran hinderten, es zu tun. Sie möchten nicht, dass schädliche Bibliotheken geladen werden, weil sie in dem von sudo verwendeten Pfad gefunden wurden. Deshalb ist es zurückgesetzt. Wenn Sie Sachen programmieren, die von root ausgeführt werden sollen, kopieren Sie sie in das entsprechende Systemverzeichnis. user39559 vor 13 Jahren 0
Wenn Sie die Überarbeitung meiner Frage sehen, werden Sie feststellen, dass dieses Verhalten aus irgendeinem Grund von der verwendeten Shell abhängt, zumindest von Solaris. aknuds1 vor 13 Jahren 0
Führen Sie `sudo sudo -V | less` und das gibt Ihnen viele Informationen, einschließlich, ob "PATH" überschrieben wird. Sie können testen, ob es wirklich Ihr "PATH" ist, der an "sudo bash" übergeben wird, aber nicht an "sudo bourne", sondern an etwas, das von bash selbst angegeben wurde. Wenn Sie wirklich sicher sind, dass dies der Fall ist (was unwahrscheinlich erscheint), dann ist dies ein schwerwiegender Fehler von Sudo, den ich wirklich nicht verstehen würde. Was Ihre ursprüngliche Frage anbelangt, ist die sichere und korrekte Vorgehensweise, Ihre ausführbaren Dateien und Bibliotheken in Standardsystemverzeichnissen zu platzieren, die bereits von "sudo" erreicht werden, und nicht in "PATH". user39559 vor 13 Jahren 0
Danke für den Vorschlag, ich versuche sudo -V, wenn ich wieder bei der Arbeit bin. Wenn Sie die ausführbaren Dateien / Bibliotheken auf den Standardpfad setzen, ist dies nicht immer das, was Sie tun möchten. In meinem Fall wollte ich Erweiterungen für eine isolierte Python-Installation installieren, auf die nur root Schreibzugriff hatte. Ich möchte nicht, dass es der Standard-Python für alle sudo-Benutzer im System ist. aknuds1 vor 13 Jahren 0
Sudo Sudo -V auf Solaris sagt, dass zum Beispiel PYTHONPATH zu den zu entfernenden Umgebungsvariablen gehört. Die Installation muss so konfiguriert werden, dass diese und bestimmte andere Variablen ignoriert werden, auch wenn env_reset deaktiviert ist. aknuds1 vor 13 Jahren 0
Ich denke, es wäre viel sinnvoller, die Gefahren zu erklären, als die Warnhinweise "Vorsicht vor Gips". Meinten Sie, dass durch das Hinzufügen von Pfaden zu sudos Umgebung ein schlechter Benutzer die Systembinärdateien überschreiben kann, indem er den Pfad für den Benutzerraum ändert? ubershmekel vor 11 Jahren 0
Es öffnet sich ein großes Fenster. Eine der Möglichkeiten ist die, die Sie erwähnen. Ich kann nicht vorgeben, eine vollständige Liste zu erstellen. user39559 vor 11 Jahren 0
@ user39559 `sudo sudo -V` sagt, dass es 'PATH` behält, aber in Wirklichkeit ist` sudo` immer noch ahnungslos über meine Binaries. mcandre vor 11 Jahren 0
@mcandre Das liegt daran, dass `secure_path` aktiv ist. Sudo Sudo -V listet diesen Pfad auf, behauptet aber immer noch, dass "PATH" erhalten geblieben ist (was vermutlich ein Fehler ist). kynan vor 10 Jahren 0
Mein Problem mit [Server Fault] (http://serverfault.com/questions/541847/why-doesnt-sudo-know-where-psql-is) wurde gelöst! Vielen Dank. Iain Samuel McLean Elder vor 10 Jahren 0
Die Priorität von secure_path ist höher als keep_env. Fügen Sie also einfach keep_env + = "PATH" hinzu. okwap vor 7 Jahren 0
8
Russ

Das Fummeln sudoersist mit Vorsicht zu tun, wie andere gesagt haben.

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

In diesem kleinen Beispiel habe ich es auch für mehr als eine Variable gezeigt.

$ 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. So wie:

$ alias sudopy='sudo PYTHONPATH=$PYTHONPATH' 
3
Mikel

Ihr Defaults !env_resetAussehen ist in Ordnung, vorausgesetzt, Sie rufen mit der -EOption nicht auch sudo an .

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

Haben Sie überprüft, dass Sie die richtige Sudoers-Datei bearbeiten? Ich vermute, es könnte sein /etc/sudoersoder /usr/local/etc/sudoersabhängig davon, wie es installiert wurde. Hast du es mit bearbeitet visudo?

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

Was env | grep PYTHONPATHsagt Wenn nichts, stellen Sie sicher, dass PYTHONPATH durch Ausführen exportiert wird, export PYTHONPATHund versuchen Sie es erneut.

Was sudo env | grep PYTHONPATHsagt Wenn der erwartete Wert ausgegeben wird, wird der PYTHONPATH-Wert durch etwas anderes überschrieben. Möglicherweise root .bashrc oder .bash_profile oder die systemweiten Konfigurationsdateien.

Ich bin mir ziemlich sicher, dass ich die richtigen Sudoer bearbeite, wobei das Installationspräfix sudo entspricht. Ich führe Sudo als "Sudo Su". Ich muss mich in einigen Tagen noch einmal mit Ihnen in Verbindung setzen. Vielen Dank! aknuds1 vor 13 Jahren 1
Versuchen Sie, eine unwichtige Einstellung wie "Editor" oder "Passprompt" zu ändern, um zu sehen, ob Sie die richtige Datei haben. Oder verwenden Sie strace, dtrace, truss oder ähnliches und sehen Sie, welche Dateien geöffnet werden. Mikel vor 13 Jahren 1
env | grep PYTHONPATH als mein Benutzer gibt den erwarteten Wert aus, unter sudo wird jedoch nichts gedruckt. Beim Bearbeiten von Sudoern kann ich sicherstellen, dass PYTHONPATH erhalten bleibt, indem "env_keep" geändert wird. Env_keep behält jedoch PATH oder LD_LIBRARY_PATH nicht bei. Ich denke, Sudo hat eine Sicherheitsbeschränkung, um Variablen wie PATH und LD_LIBRARY_PATH nicht zu erhalten. Eine Bauzeit vielleicht? aknuds1 vor 13 Jahren 0
Wenn sudo mit --with-secure-path kompiliert wurde, würde dies PATH ändern, aber die Dokumente sagen nicht aus, dass LD_LIBRARY_PATH berührt wird. Mikel vor 13 Jahren 0
Was ist mit env_delete? Die Manpage sagt außerdem: Beachten Sie, dass viele Betriebssysteme potenziell gefährliche Variablen aus der Umgebung eines Setuid-Prozesses (wie z. B. sudo) entfernen. Mikel vor 13 Jahren 0
Nicht sicher, warum Sie env_keep ändern müssen, um PYTHONPATH zu behalten. Wenn! Env_reset aktiviert ist und keine env_delete-Einträge vorhanden sind, sollte dies AFAIUI ausreichen. Mikel vor 13 Jahren 0
! 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 wird, aber ich kann das auch überprüfen. aknuds1 vor 13 Jahren 1
Ich habe bestätigt, dass! Env_reset ignoriert und env_delete nicht gesetzt wird. aknuds1 vor 13 Jahren 1
-1
OlPo

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 Ihres hinzuLD_LIBRARY_PATH

  2. Aktualisieren Sie den Cache mit:

    sudo ldconfig -v 
Schön, aber die Frage bezieht sich nicht auf Ubuntu. Hinweis: Beim nächsten Mal sehen Sie sich die Tags unter der Frage an. DavidPostill vor 7 Jahren 0