Suchen Sie nach secure_path auf sudo
[[email protected] ~]# sudo -V | grep 'Value to override'
Value to override user's $PATH with: /sbin:/bin:/usr/sbin:/usr/bin
Wenn $PATH
überschrieben wird, verwenden Sie visudo
und bearbeiten Sie /etc/sudoers
Defaults secure_path = /sbin:/bin:/usr/sbin:/usr/bin:/usr/local/bin
Berechtigung verweigert
Um ein Skript auszuführen, muss für die Datei ein ausführbares Berechtigungsbit gesetzt sein .
Um die Linux-Dateiberechtigungen vollständig zu verstehen, können Sie die Dokumentation für chmod
studieren Befehl. chmod, eine Abkürzung für Änderungsmodus , ist der Befehl, der verwendet wird, um die Berechtigungseinstellungen einer Datei zu ändern.
Um die chmod-Dokumentation für Ihr lokales System zu lesen, führen Sie man chmod
aus oder info chmod
von der Kommandozeile. Einmal gelesen und verstanden, sollten Sie in der Lage sein, die Ausgabe von running ...
ls -l foo.sh
... die die LESEN-, SCHREIBEN- und AUSFÜHREN-Berechtigungen für den Dateieigentümer, den Gruppeneigentümer und alle anderen auflistet, die nicht der Dateieigentümer oder ein Mitglied der Gruppe sind, zu der die Datei gehört (diese letzte Berechtigungsgruppe wird manchmal bezeichnet als "Welt" oder "Andere")
Im Folgenden finden Sie eine Zusammenfassung der Fehlerbehebung für den Fehler Berechtigung verweigert in Ihrem Fall.
$ ls -l foo.sh # Check file permissions of foo
-rw-r--r-- 1 rkielty users 0 2012-10-21 14:47 foo.sh
^^^
^^^ | ^^^ ^^^^^^^ ^^^^^
| | | | |
Owner| World | |
| | Name of
Group | Group
Name of
Owner
Eigentümer hat Lese- und Schreibzugriff rw, aber das - zeigt an, dass die Berechtigung zur Ausführung fehlt
Die chmod
Befehl behebt das. (Gruppe und andere haben nur Leseberechtigung für die Datei, sie können nicht darauf schreiben oder sie ausführen)
$ chmod +x foo.sh # The owner can set the executable permission on foo.sh
$ ls -l foo.sh # Now we see an x after the rw
-rwxr-xr-x 1 rkielty users 0 2012-10-21 14:47 foo.sh
^ ^ ^
foo.sh ist nun für Linux ausführbar.
Die Verwendung von sudo führt dazu, dass der Befehl nicht gefunden wurde
Wenn Sie einen Befehl mit sudo ausführen Sie führen es effektiv als Superuser oder Root aus.
Der Grund dafür, dass der Root-Benutzer Ihren Befehl nicht findet, ist wahrscheinlich, dass PATH
Umgebungsvariable für root enthält nicht das Verzeichnis, in dem foo.sh
befindet . Daher wird der Befehl nicht gefunden.
Die Umgebungsvariable PATH enthält eine Liste von Verzeichnissen, die nach Befehlen durchsucht werden. Jeder Benutzer legt seine eigene PATH-Variable entsprechend seinen Anforderungen fest. Um zu sehen, was zur Ausführung eingestellt ist,
env | grep ^PATH
Hier ist eine Beispielausgabe der Ausführung des obigen env
Befehl zuerst als normaler Benutzer und dann als Root-Benutzer mit sudo
[email protected]:~$ env | grep ^PATH
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games
[email protected]:~$ sudo env | grep ^PATH
[sudo] password for rkielty:
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/X11R6/bin
Beachten Sie, dass, obwohl ähnlich, in diesem Fall die im PATH enthaltenen Verzeichnisse des nichtprivilegierten Benutzers (rkielty) und des Superusers nicht identisch sind .
Das Verzeichnis, in dem foo.sh
befindet sich nicht in der PATH-Variablen des Root-Benutzers, daher der Befehl nicht gefunden Fehler.
Die anderen Lösungen, die ich bisher hier gesehen habe, basieren auf einigen Systemdefinitionen, aber es ist tatsächlich möglich, sudo
zu haben Verwenden Sie den aktuellen PATH
(mit dem env
Befehl) und/oder der Rest der Umgebung (mit dem -E
Option), indem Sie sie einfach richtig aufrufen:
sudo -E env "PATH=$PATH" <command> [arguments]
Tatsächlich kann man daraus einen Alias machen:
alias mysudo='sudo -E env "PATH=$PATH"'
(Es ist auch möglich, den Alias selbst sudo
zu nennen , ersetzt den ursprünglichen sudo
.)