Jak sprawić, by `sudo` zachowało $ PATH?

123

Muszę uruchomić program zainstalowany na / opt / godi / sbin (katalog niestandardowy). Jeśli dodam ten katalog do mojej ŚCIEŻKI, dodając następujący wiersz do mojego pliku .bashrc

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

wtedy mogę spróbować uruchomić polecenie w porządku (z wyjątkiem tego, że nie powiedzie się, ponieważ wymaga sudo). Jednak gdy próbuję użyć sudo:

sudo godi_console

Pojawia się następujący błąd

sudo: godi_console: command not found

Sprawdzanie zmiennej PATH po użyciu sudo ujawnia, że ​​nie zawiera ona tej samej PATH, którą mam jako zwykły użytkownik:

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

Dlaczego ŚCIEŻKA nie jest taka sama? czy robię coś źle? Jestem na Debianie Jessie i niestety nie mogę obejść tego problemu, przekazując sudo absolutny link do godi_console, ponieważ sama godi_console zależy również od prawidłowego ustawienia PATH.

hugomg
źródło
2
Spróbować sudo -E godi_console. -Eoznacza „chronić środowisko”.
D_Bye
5
@D_Bye, to nie zadziała, jeśli secure_pathi / lub env_reset są skonfigurowane tak jak ma to miejsce w wielu sudowdrożeniach, takich jak Debian.
Stéphane Chazelas,
@StephaneChazelas Dzięki za informację - nie używam Debiana, więc może powinienem był po prostu milczeć!
D_Bye
stackoverflow.com/questions/257616/sudo-changes-path-why
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件
Powiązanym pytaniem o sunie sudojest: unix.stackexchange.com/questions/460478 .
JdeBP

Odpowiedzi:

149

Zawsze możesz zrobić:

sudo env "PATH=$PATH" godi_console

Ze względów bezpieczeństwa na Debianie, /etc/sudoersposiada secure_pathzestaw opcji do bezpiecznej wartości.

Uwaga:

sudo "PATH=$PATH" godi_console

W przypadku gdy sudotraktuje wiodące argumenty zawierające =znaki jako przypisania zmiennych środowiskowych, działałoby to również przy pracy godi_consolez twoim $PATH (w przeciwieństwie do secure_path) w jego środowisku, ale nie wpływałoby na sudościeżkę wyszukiwania plików wykonywalnych, więc nie pomogłoby to sudoznaleźć godi_console.

Stéphane Chazelas
źródło
5
Najbardziej podoba mi się ta odpowiedź, ponieważ pozwala uniknąć globalnej zmiany ustawień (tj. Zachowuje zasadę najmniejszych uprawnień)
Alois Mahdal
5
sudo "PATH=$PATH" godi_console Nawiasem mówiąc, nie działał w CentOs7. Potrzebował env
Hakan Baba
1
@ StéphaneChazelas Czy sudo "PATH=$PATH" godi_consolekiedykolwiek naprawdę działa? sudoprzyjmuje VAR=valueargumentów, mających wpływ na środowisko polecenia to działa, ale w przeciwieństwie do envlub bash, sudonie wydaje się, aby to miało wpływ, jak to wygląda w górę komendę. Testowałem to (ostatnio) na Ubuntu 16.04. Ale próbowałem dodać exempt_groupopcję sudoers(tylko do testów - nie uważam tego za rozwiązanie!), A wyniki były olśniewające. Polecenia formularza PATH="$PATH" sudo some-commandzaczęły działać, ale polecenia formularza sudo PATH="$PATH" some-command nadal nie działały .
Eliah Kagan
2
@ballsatballsdotballs. Ponieważ ten alias powinien mieć wpływ tylko na interaktywne powłoki, powinien być względnie nieszkodliwy.
Stéphane Chazelas,
2
Właśnie tworzę alias o nazwie psudo dla tego typu przypadków, gdzie: alias psudo = "sudo env \" PATH = $ PATH \ "". Wtedy moje normalne użycie sudo pozostaje nienaruszone.
mikeTronix
46

Możesz także ustawić domyślną ŚCIEŻKĘ na /etc/sudoers

edytować plik za pomocą visudo

i zaktualizuj linię do tego, co chcesz: Defaults secure_path = /sbin:/bin:/usr/sbin:/usr/bin

michaelbn
źródło
18

SUDO domyślnie resetuje zmienne env.

Sprawdź jego instrukcję i opcję o nazwie env_reset.

Musisz go tylko wyłączyć w / etc / sudoers.

KWubbufetowicz
źródło
5
Chłodny! W Ubuntu możesz wyświetlać i komentować linie secure_path i env_reset. Sprawia, że ​​system jest znacznie mniej bezpieczny, więc uważaj.
RawwrBag
Wyłączenie env_resetwydaje się nie wpływać na sudozachowanie w / r / t ŚCIEŻKA.
Zanna,
5

To działa :

sudo $(which your_command)

Przykład wywołania mojego gpsskryptu, który wyświetla procesy GPU Nvidii:

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

Objaśnienie:

$ 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
źródło
3
sudo --preserve-env=PATH env [command]

to przecina bezpieczną ścieżkę na moim końcu

odtąd
źródło
1

To działało:

sudo "PATH=$PATH" [your command]

Nie zmieniaj $ PATH z wartością ścieżki, po prostu napisz to w ten sposób

przykład: $ sudo env "PATH=$PATH" ant -f webAppConfig.xml regenWebAppConf....

imane kichu
źródło
0

Może nie dokładnie to, o co prosi OP, ale może to pomóc:

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

Zmienia ŚCIEŻKA wewnątrz polecenia sudoed.

Edycja: Nie jestem pewien, co miałam na myśli, ponieważ powyższe jest w zasadzie nonsensem. Zamiast tego użyj następujących opcji:

sudo -u the_user sh -c 'PATH=$PATH:/opt/godi/bin echo $PATH'
phil294
źródło