PATH durch sudo führen

16918
whitequark

Kurz gesagt : Wie kann man Sudo dazu bringen, PATH nicht jedes Mal zu spülen?

Ich habe einige Websites auf meinem Server installiert (Debian-Tests), die mit Ruby on Rails geschrieben wurden. Ich verwende Mongrel + Nginx, um sie zu hosten. Es gibt jedoch ein Problem, wenn Mongrel neu gestartet werden muss (z. B. nach einigen Änderungen).

Alle Sites werden in VCS geprüft (git, aber es ist nicht wichtig), und der Besitzer und die Gruppe sind auf meinen Benutzer eingestellt, während Mongrel unter dem, huh, Mongrel-Benutzer ausgeführt wird, dessen Rechte stark eingeschränkt sind. Mongrel muss also unter root gestartet werden (es kann automatisch die UID geändert werden) oder mongrel.

Zum Verwalten von Mongrel verwende ich mongrel_cluster gem, da es möglich ist, eine beliebige Anzahl von Mongrel-Servern mit nur einem Befehl zu starten oder zu stoppen. Das Verzeichnis /var/lib/gems/1.8/bin muss sich jedoch in PATH befinden: Dies reicht nicht aus, um es mit einem absoluten Pfad zu starten .

Das Ändern von PATH in root .bashrc änderte nichts, das Ändern von sudos env_reset und env_keep auch nicht.

Also die Frage: wie man ein Verzeichnis zu PATH hinzufügt oder PATH des Benutzers in sudo hält?

Update: einige Beispiele

$ env | grep PATH PATH=/usr/local/bin:/usr/bin:/bin:/usr/games:/var/lib/gems/1.8/bin $ sudo cat /etc/sudoers | egrep -v '^$|^#' Defaults env_keep = "PATH" root ALL=(ALL) ALL %sudo ALL=NOPASSWD: ALL $ sudo env | grep PATH PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/X11R6/bin 

Ich kann auch sagen, dass es in Debian Stable (Lenny) genauso funktioniert.

12
Siehe auch http://stackoverflow.com/questions/257616/sudo-changes-path-why rogerdpack vor 10 Jahren 1

4 Antworten auf die Frage

11
Rob

Kämpfte ein paar Stunden mit demselben Problem. In debian lenny können Sie das Problem durch Hinzufügen beheben

Defaults exempt_group=<your group> 

in die Sudoers-Datei.

Dies ist der einzige Weg, um die kompilierte Option --secure-path (soweit ich weiß) zu umgehen.

Bemerkenswert ist, wird dies auch entbindet den Anwender benötigen ihr Passwort einzugeben, wenn sie sudo.

2
Draemon

Wenn Sie secure_pathin setzen /etc/sudoers, können Sie spielen mit env_reset/ env_keepalles, was Sie mögen und es wird keinen Unterschied machen, auf den Weg. Wenn Sie so etwas sehen, kommentieren Sie es aus.

Defaults secure_path = /sbin:/bin:/usr/sbin:/usr/bin 
Nein, natürlich war es nicht festgelegt. whitequark vor 13 Jahren 0
0
dubiousjim

Ich würde mal in die Optionen env_reset und env_keep von man sudo schauen . Aber es hört sich an, als hätten Sie das schon getan (Sie nennen einfach unv_keep "keepenv"). Wenn Sie die Option env_reset deaktivieren (Standardeinstellung ist aktiviert), denke ich, dass sie keine env-Variablen löschen soll . Das ist aber weniger sicher.

Es gibt auch eine secure_path-Option für sudo. Ich denke, das ist standardmäßig aktiviert. Sie könnten versuchen, es zu deaktivieren.

Die vorstehenden Optionen sind in Ihrer Datei / etc / sudoers festgelegt. Es gibt auch die -iBefehlszeilenoption für Sudo. Das führt dazu, dass sudo /root/.profile oder /root/.login ausführt. Sie können dort den gewünschten Pfad einstellen.

Nein, wenn env_reset deaktiviert ist, wird PATH immer noch geändert (nicht gelöscht). Möglicherweise werden hier / * / sbin-Verzeichnisse hinzugefügt. Nein, die Option -i ist nicht geeignet, da eine interaktive Shell gestartet wird und ich nur einen Befehl ausführen muss. whitequark vor 14 Jahren 1
Okay, das Problem verschwand nach der Neuinstallation von Debian (wegen der Migration zu LVM) und auch von RubyGems. Ihre Antwort war die nützlichste von allen, so dass sie jetzt akzeptiert werden kann. whitequark vor 14 Jahren 0
-1
Emmel

Nun, du machst etwas falsch. Sie haben auch nicht angegeben, was Sie mit Ihrer Datei / etc / sudoers gemacht haben. Das sollten Sie tun - dies ist ein CentOS-System, BTW:

Dies ist zunächst mit der richtigen Einstellung für env_keep (Hinweis PATH ist dort drin):

Sudo grep -5 PATH / etc / sudoers Defaults env_keep = "-Farben HOST HISTSIZE INPUTRC KDEDIR \ LS_COLORS MAIL PS1 PS2 QTDIR NUTZERNAME \ LANG LC_ADDRESS DARSTELLEN LC_CTYPE LC_COLLATE LC_IDENTIFICATION \ LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC \ LC_PAPER LC_TELEPHONE LC_TIME LC_ALL LANGUAGE LINGUAS \ _XKB_CHARSET XAUTHORITY PATH"

Defaults timestamp_timeout = 15   ## Next comes the main part: which users can run what software on  ## which machines (the sudoers file can be shared between multiple  -> export PATH=$PATH:hithere -> sudo sh -c 'echo $PATH' /sbin:/bin:/usr/sbin:/usr/bin:/usr/kerberos/bin:/usr/local/bin:/bin:/usr/bin:/bin:hithere 

Sieht gut aus. Nun entfernen wir die Einstellung env_keep und versuchen es erneut:

-> sudo visudo -> sudo grep -5 PATH /etc/sudoers LS_COLORS MAIL PS1 PS2 QTDIR USERNAME \ LANG LC_ADDRESS LC_CTYPE LC_COLLATE LC_IDENTIFICATION \ LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC \ LC_PAPER LC_TELEPHONE LC_TIME LC_ALL LANGUAGE LINGUAS \ _XKB_CHARSET XAUTHORITY" #_XKB_CHARSET XAUTHORITY PATH" 

Was für ein trauriger PFAD:

 -> sudo sh -c 'echo $PATH' /usr/bin:/bin 
Ich habe das MEHR als zweimal überprüft! Überprüfen Sie das Update im Post. whitequark vor 14 Jahren 1
Ich habe das gleiche Problem, ich habe definitiv die richtigen Einstellungen, die Sie erwähnen Draemon vor 13 Jahren 0