Warum wird ein Befehl ausgeführt, wenn sudo den Befehl nicht zurückgibt?

12

Beispielbefehl:

drush cc all

funktioniert, aber das:

sudo drush cc all

gibt mir:

sudo: drush: command not found

Warum? Wie kann ich das beheben?

Codium
quelle
Ich hatte auch dieses Problem manchmal mit solchen grundlegenden Befehlen wie cd. Mit der dzdo cdRückkehr „Befehl nicht gefunden“. Natürlich merkte ich später , dass cdin ein Verzeichnis ing , dass ich nicht über die Berechtigungen in, wird nicht helfen , sehr viel, also entweder ich eine Root - Shell oder Notwendigkeit zu müssen dzdo ls, dzdo mvusw. den Inhalt von außen , dass dir.
Wildcard
2
Das Problem dabei sudo cdist, dass cdes sich um einen integrierten Befehl handelt, nicht um ein Programm. Wenn Sie in ein Verzeichnis gehen möchten, auf das Sie keinen Zugriff haben, und dort (zum Beispiel) eine Datei umbenennen möchten , können Sie (zum Beispiel) sudo mv dir/oldfile dir/newfile oder sudo sh -c "cd dir; mv oldfile newfile" .
G-Man sagt "Reinstate Monica"

Antworten:

13

Wenn Sie sudo, erhalten Sie eine vorkonfigurierte $PATH, die so etwas wie der Standardpfad des Root- Benutzers ist (sein soll) . Ihr Programm befindet sich nicht in der Liste der Verzeichnisse, die durch gekennzeichnet sind $PATH.

Siehe zum Beispiel

sudo versucht, bei der Ausführung externer Befehle sicher zu sein.

Es gibt zwei verschiedene Möglichkeiten, mit Umgebungsvariablen umzugehen. Standardmäßig ist die Option env_reset sudoers aktiviert. Diese Ursachen Befehle mit einer minimalen Umgebung ausgeführt werden , die TERM, PATH, HOME, SHELL, LOGNAME, USERund USERNAMEzusätzlich zu Variablen aus dem rufenden Prozess erlaubt durch die env_checkund env_keep sudoers Optionen. Es gibt effektiv eine Whitelist für Umgebungsvariablen.

Wenn Sie nicht konfigurieren können sudo, um Ihre zu erhalten $PATH, besteht die übliche Problemumgehung darin, den vollständigen Pfadnamen des Programms anzugeben. Dies funktioniert möglicherweise nicht gut mit Skripten, die andere ausführbare Dateien im Verzeichnis (auf die nicht zugegriffen wird) aufrufen.

Thomas Dickey
quelle
0

Sie sollten den vollständigen Pfad angeben. Es ist auch sicherer; Wenn Sie den Pfad nicht angeben, ist es denkbar, dass ein Angreifer ein anderes Programm erstellt, das mit Root-Berechtigungen ausgeführt wird.

Außerdem müssen Sie eine Zeile einfügen /etc/sudoers, um dies zuzulassen. man sudoersFür die Syntax ist es viel zu viel, um es hier zu formulieren.

Tom Zych
quelle