Zugang verweigert
Um ein Skript ausführen zu können, 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 den chmod
Befehl lesen. chmod , eine Abkürzung für change mode , ist der Befehl, mit dem die Berechtigungseinstellungen einer Datei geändert werden.
Führen Sie man chmod
oder info chmod
über die Befehlszeile die chmod-Dokumentation für Ihr lokales System aus. Sobald Sie gelesen und verstanden haben, sollten Sie in der Lage sein, die Ausgabe des Laufens zu verstehen ...
ls -l foo.sh
... die die READ-, WRITE- und EXECUTE-Berechtigungen für den Dateieigentümer, den Gruppeneigentümer und alle anderen Personen auflisten, die nicht der Dateieigentümer oder ein Mitglied der Gruppe sind, zu der die Datei gehört (auf die letzte Berechtigungsgruppe wird manchmal verwiesen als "Welt" oder "andere")
Hier finden Sie eine Zusammenfassung der Fehlerbehebung bei dem 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
Der Besitzer hat Lese- und Schreibzugriff rw, aber das - zeigt an, dass die ausführbare Berechtigung fehlt
Der chmod
Befehl behebt das. (Gruppe und andere haben nur Leseberechtigungen für die Datei festgelegt, 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 jetzt 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, führen Sie ihn effektiv als Superuser oder Root aus.
Der Grund dafür, dass der Root-Benutzer Ihren Befehl nicht findet, ist wahrscheinlich, dass die PATH
Umgebungsvariable für root nicht das Verzeichnis enthält, in dem foo.sh
sich das Verzeichnis 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 ausgeführt werden soll
env | grep ^PATH
Hier ist eine Beispielausgabe zum Ausführen des obigen env
Befehls zuerst als normaler Benutzer und dann als Root-Benutzer mit sudo
rkielty@rkielty-laptop:~$ env | grep ^PATH
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games
rkielty@rkielty-laptop:~$ 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 in diesem Fall die im PATH enthaltenen Verzeichnisse der nicht privilegierte Benutzer (rkielty) und der Superuser nicht identisch sind, obwohl sie ähnlich sind .
Das Verzeichnis, in dem sich das Verzeichnis foo.sh
befindet, ist in der PATH-Variablen des Root-Benutzers nicht vorhanden, daher wurde der Befehl nicht gefunden .