Dlaczego uruchamianie polecenia, ponieważ sudo zwraca polecenie, nie znaleziono polecenia?

12

Przykładowe polecenie:

drush cc all

działa, ale to:

sudo drush cc all

daje mi:

sudo: drush: command not found

Dlaczego? Jak to naprawić?

Codium
źródło
Czasami miałem ten problem z takimi podstawowymi poleceniami jak cd. Za pomocą dzdo cdzwracanego „polecenia nie znaleziono”. Oczywiście, że później sobie sprawę, że cding w katalogu, który nie ma uprawnień w, nie pomoże bardzo dużo, więc albo trzeba powłoki roota lub konieczności dzdo ls, dzdo mvitp zawartość spoza tego katalogu.
Wildcard
2
Problem sudo cdpolega na tym, że cdjest to wbudowane polecenie, a nie program. Jeśli chcesz wejść do katalogu, do którego nie masz dostępu, i (na przykład) zmienić tam nazwę pliku, możesz (na przykład) sudo mv dir/oldfile dir/newfile lub sudo sh -c "cd dir; mv oldfile newfile" .
G-Man mówi „Przywróć Monikę”

Odpowiedzi:

13

Gdy to zrobisz sudo, otrzymasz wstępnie skonfigurowaną $PATH, która jest (powinna być) czymś w rodzaju domyślnej ścieżki użytkownika root . Twojego programu nie ma na liście katalogów określonych przez $PATH.

Zobacz na przykład

sudo stara się być bezpiecznym podczas wykonywania poleceń zewnętrznych.

Istnieją dwa różne sposoby radzenia sobie ze zmiennymi środowiskowymi. Domyślnie opcja env_reset sudoers jest włączona. Powoduje to, że polecenia są wykonywane z minimalnym środowisku zawierającym TERM, PATH, HOME, SHELL, LOGNAME, USERa USERNAMEoprócz zmiennych z procesu wywołującego jest dozwolone przez env_checki env_keep sudoers opcji. W rzeczywistości istnieje biała lista zmiennych środowiskowych.

Jeśli nie możesz skonfigurować, sudoaby zachować swój $PATH, zwykłym obejściem jest podanie pełnej nazwy ścieżki programu. Może to nie działać dobrze ze skryptami wywołującymi inne pliki wykonywalne w katalogu (niedostępnym).

Thomas Dickey
źródło
0

Powinieneś podać pełną ścieżkę. Jest to również bardziej bezpieczne; jeśli nie podasz ścieżki, możliwe jest, że osoba atakująca utworzy inny program, który będzie uruchamiany z uprawnieniami administratora.

Musisz także wstawić linię, /etc/sudoersaby na to pozwolić. man sudoersjeśli chodzi o składnię, to o wiele za dużo tutaj.

Tom Zych
źródło