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 .
sudo
‚sPATH
die gleiche wie die des Benutzers?Die anderen Lösungen, die ich bisher hier gesehen habe, basieren auf einigen Systemdefinitionen, aber es ist tatsächlich möglich,
sudo
die aktuellePATH
(mit demenv
Befehl) und / oder den Rest der Umgebung (mit der-E
Option) zu verwenden, indem Sie sie einfach richtig aufrufen ::Tatsächlich kann man daraus einen Alias machen:
(Es ist auch möglich, den Alias selbst zu benennen
sudo
und das Original zu ersetzensudo
.)quelle
command not found
Probleme in der Ubuntu-Distribution ist. Danke, Mann../bashrc
, um ihn zwischen den Sitzungen zu speichernSuchen Sie auf sudo nach Secure_path
Wenn
$PATH
überschrieben wird, verwendenvisudo
und bearbeiten/etc/sudoers
quelle
chmod +x foo.sh
#!/bin/sh
oder eine solche Zeile ist .sudo pwd
quelle
Sie können auch einen Softlink zu Ihrem Skript in einem der Verzeichnisse (
/usr/local/bin
zum Beispiel) im Superuser-Pfad erstellen . Es wird dann dem Sudo zur Verfügung stehen.Schauen Sie sich diese Antwort an, um eine Vorstellung davon zu bekommen, in welches Verzeichnis ein Softlink eingefügt werden soll.
quelle
Es scheint, dass Linux "Befehl nicht gefunden" sagt, selbst wenn Sie den Pfad zur Datei explizit angeben.
Es ist ein etwas irreführender Fehler, aber wahrscheinlich technisch korrekt. Eine Datei ist bis zu ihrer ausführbaren Datei kein Befehl und kann daher nicht gefunden werden.
quelle
Ok, das ist meine Lösung: Fügen Sie in ~ / .bash_aliases einfach Folgendes hinzu:
Voila! Jetzt können Sie Ihre eigenen Skripte mit sudo ausführen oder als ROOT festlegen, ohne jedes Mal einen Export durchführen zu müssen. PATH = $ PATH: / home / your_user / bin.
Beachten Sie, dass ich beim Hinzufügen meines PFADS explizit sein muss, da HOME für Superuser / root ist
quelle
Versuchen Sie es
chmod u+x foo.sh
stattdessen,chmod +x foo.sh
wenn Sie Probleme mit den obigen Anleitungen haben. Dies funktionierte für mich, wenn die anderen Lösungen dies nicht taten.quelle
Es gibt oben ausgezeichnete Antworten. Wenn Sie nach dem Ausprobieren immer noch
command not found
den gesamten Dateipfad versuchen:quelle