Wie kann man `sudo` dazu bringen, $ PATH zu erhalten?

123

Ich muss ein auf / opt / godi / sbin installiertes Programm ausführen (ein benutzerdefiniertes Verzeichnis). Wenn ich dieses Verzeichnis meinem PATH hinzufüge, fügen Sie meiner .bashrc-Datei die folgende Zeile hinzu

export PATH=$PATH:/opt/godi/bin:/opt/godi/sbin

Dann kann ich versuchen, den Befehl ganz gut auszuführen (außer dass er fehlschlägt, weil er sudo benötigt). Wenn ich jedoch versuche, sudo zu verwenden:

sudo godi_console

Ich erhalte den folgenden Fehler

sudo: godi_console: command not found

Wenn Sie die PATH-Variable nach der Verwendung von sudo untersuchen, werden Sie feststellen, dass sie nicht denselben PATH enthält, den ich als normaler Benutzer habe:

$ sudo sh
# echo $PATH                 
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

Warum ist der PFAD nicht derselbe? Mache ich etwas falsch? Ich bin auf Debian Jessie und kann das Problem leider nicht umgehen, indem ich sudo den absoluten Link zu godi_console übergebe, da godi_console selbst auch davon abhängt, ob PATH richtig eingestellt ist.

hugomg
quelle
2
Versuchen Sie es sudo -E godi_console. -Ebedeutet "Umwelt schützen".
D_Bye
5
@D_Bye, das funktioniert nicht, wenn secure_pathund / oder env_reset so konfiguriert sind, wie es in vielen sudoImplementierungen wie unter Debian der Fall ist .
Stéphane Chazelas
@StephaneChazelas Danke für die Info - ich benutze Debian nicht, also hätte ich vielleicht einfach schweigen sollen!
D_Bye
Eine damit verbundene Frage, etwa sunicht sudo, ist unix.stackexchange.com/questions/460478 .
JdeBP

Antworten:

149

Sie können immer tun:

sudo env "PATH=$PATH" godi_console

Hat aus Sicherheitsgründen unter Debian /etc/sudoersdie secure_pathOption auf einen sicheren Wert gesetzt.

Beachten Sie, dass:

sudo "PATH=$PATH" godi_console

Wo sudobehandelt Argument enthält führende =Zeichen als Umgebungsvariable Zuordnungen von selbst, würde auch bei laufenden Arbeiten godi_consolemit Ihrem $PATH (im Gegensatz zu dem secure_pathin seiner Umgebung), würde aber keinen Einfluss auf sudofür ausführbare ‚s Suchpfad, so würde nicht helfen sudobei der Suche nach, dass godi_console.

Stéphane Chazelas
quelle
5
Diese Antwort gefällt mir am besten, da es nicht erforderlich ist, Einstellungen global zu ändern (dh das Prinzip des geringsten Privilegs zu bewahren)
Alois Mahdal
5
sudo "PATH=$PATH" godi_console hat übrigens nicht in CentOs7 funktioniert. Benötigte die Umwelt
Hakan Baba
1
@ StéphaneChazelas Funktioniert das sudo "PATH=$PATH" godi_consoleüberhaupt? sudonimmt VAR=valueArgumente, die Umwelt des Befehls beeinflusst es läuft, aber anders als in envoder bash, sudoscheint nicht so berührt zu lassen , wie es den Befehl nachschlägt. Ich habe dies (vor kurzem) nur auf Ubuntu 16.04 getestet. Aber ich habe versucht, die exempt_groupOption hinzuzufügen sudoers(nur zum Testen - ich halte dies nicht für eine Lösung!) Und die Ergebnisse waren aufschlussreich. Die Befehle des Formulars PATH="$PATH" sudo some-commandbegannen zu funktionieren, die des Formulars jedoch sudo PATH="$PATH" some-command immer noch nicht.
Eliah Kagan
2
@ballsatballsdotballs. Da sich dieser Alias ​​nur auf Ihre interaktiven Shells auswirken sollte, sollte er relativ harmlos sein.
Stéphane Chazelas
2
Ich erstelle gerade einen Alias ​​namens psudo für diese Art von Fällen, in denen: alias psudo = "sudo env \" PATH = $ PATH \ "". Dann ist meine normale Sudonutzung nicht betroffen.
mikeTronix
46

Sie können den Standard-PFAD auch auf einstellen /etc/sudoers

Bearbeiten Sie die Datei mit visudo

und aktualisiere die Zeile nach Belieben: Defaults secure_path = /sbin:/bin:/usr/sbin:/usr/bin

michaelbn
quelle
18

SUDO setzt die Umgebungsvariablen standardmäßig zurück.

Lesen Sie das Handbuch und die Option env_reset.

Sie müssen es nur in / etc / sudoers deaktivieren.

KWubbufetowicz
quelle
5
Cool! In Ubuntu können Sie die Zeilen secure_path und env_reset anzeigen und auskommentieren. Macht das System erheblich unsicherer, seien Sie also vorsichtig.
RawwrBag
Das Deaktivieren env_resetscheint das sudoVerhalten von PATH nicht zu beeinflussen .
Zanna
5

Das funktioniert :

sudo $(which your_command)

Beispiel für den Aufruf meines gpsSkripts, in dem die Prozesse der Nvidia-GPU aufgelistet sind:

$ sudo gps
sudo: gps: command not found
$ sudo $(which gps)
  PID TTY          TIME CMD
 9922 tty7     02:42:47 Xorg

Erklärung:

$ set -x;sudo $(which gps);set +x
++ which gps
+ sudo /home/xyztuv/myScripts/shl/gps
  PID TTY          TIME CMD
 9922 tty7     02:42:39 Xorg
+ set +x
SebMa
quelle
3
sudo --preserve-env=PATH env [command]

Dadurch wird "secure_path" auf meiner Seite außer Kraft gesetzt

untore
quelle
1

Das hat funktioniert:

sudo "PATH=$PATH" [your command]

Ändern Sie $ PATH nicht mit Ihrem Pfadwert, sondern schreiben Sie es einfach so

Beispiel: $ sudo env "PATH=$PATH" ant -f webAppConfig.xml regenWebAppConf....

Iman Kichu
quelle
0

Vielleicht nicht genau das, wonach OP fragt, aber das könnte helfen:

sudo -u the_user PATH=$PATH:/opt/godi/bin sh -c 'echo $PATH'

Dies ändert den Pfad innerhalb des sudoed-Befehls.

Edit: Ich bin mir nicht sicher, was ich damit gemeint habe, da das oben so ziemlich Unsinn ist. Verwenden Sie stattdessen Folgendes:

sudo -u the_user sh -c 'PATH=$PATH:/opt/godi/bin echo $PATH'
phil294
quelle