it-swarm.com.de

Befehl bei Verwendung von sudo nicht gefunden

Ich habe ein Skript namens foo.sh In meinem Home-Ordner.

Wenn ich zu diesem Ordner navigiere und ./foo.sh Eingebe, erhalte ich

-bash: ./foo.sh: Permission denied.

Wenn ich Sudo ./foo.sh Verwende, bekomme ich

Sudo: foo.sh: command not found.

Warum passiert das und wie kann ich das beheben?

124
Neko

Berechtigung verweigert

Um ein Skript ausführen zu können, muss für die Datei ein ausführbares Berechtigungsbit festgelegt sein .

Um Linux vollständig zu verstehen Dateiberechtigungen , können Sie die Dokumentation für den Befehl chmod lesen. chmod , eine Abkürzung für change mode, ist der Befehl, mit dem die Berechtigungseinstellungen einer Datei geändert werden.

Um die chmod-Dokumentation für Ihr lokales System zu lesen, führen Sie man chmod Oder info chmod In der Befehlszeile aus. Sobald Sie es gelesen und verstanden haben, sollten Sie in der Lage sein, die Ausgabe des Laufens zu verstehen ...

ls -l foo.sh

... das die READ-, WRITE- und EXECUTE-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 (auf die letzte Berechtigungsgruppe wird manchmal verwiesen) als "Welt" oder "andere")

Im Folgenden finden Sie eine Zusammenfassung der Problembehandlung für den Fehler " Permission Denied" 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 Eigentümer hat Lese- und Schreibzugriff auf rw, aber das - zeigt an, dass die ausführbare Berechtigung fehlt

Der Befehl chmod behebt das. (Gruppen und andere Benutzer haben nur Leseberechtigungen 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
   ^  ^  ^

für Linux ist foo.sh jetzt ausführbar.

Die Verwendung von Sudo führt dazu, dass der Befehl nicht gefunden wird.

Wenn Sie einen Befehl mit Sudo ausführen, wird er effektiv als Superuser oder Root ausgeführt.

Der Grund, warum der Root-Benutzer Ihren Befehl nicht findet, ist wahrscheinlich, dass die Umgebungsvariable PATH für root nicht das Verzeichnis enthält, in dem sich 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 es laufen soll

env | grep ^PATH

Hier ein Beispiel für die Ausführung des obigen Befehls env 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 in diesem Fall die im PATH enthaltenen Verzeichnisse der nicht privilegierte Benutzer (rkielty) und der Superuser nicht dasselbe sind.

Das Verzeichnis, in dem sich foo.sh Befindet, ist in der PATH-Variablen des Root-Benutzers nicht vorhanden, daher der Fehler Befehl nicht gefunden.

134
Rob Kielty

Die anderen Lösungen, die ich bisher hier gesehen habe, basieren auf einigen Systemdefinitionen, aber es ist tatsächlich möglich, dass Sudo den aktuellen PATH verwendet (mit dem Befehl env). und/oder der Rest der Umwelt (mit dem -E Option), indem Sie es 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 benennen und den ursprünglichen Sudo zu ersetzen.)

77
Tom

Suchen Sie in Sudo nach secure_path

[[email protected] ~]# Sudo -V | grep 'Value to override'
Value to override user's $PATH with: /sbin:/bin:/usr/sbin:/usr/bin

Ob $PATH wird überschrieben benutze visudo und bearbeite /etc/sudoers

Defaults    secure_path = /sbin:/bin:/usr/sbin:/usr/bin:/usr/local/bin
14
codemonkee
  1. Stellen Sie sicher, dass Sie über die Berechtigung zum Ausführen des Skripts verfügen. d.h. chmod +x foo.sh
  2. Überprüfen Sie, ob die erste Zeile dieses Skripts #!/bin/sh Oder ein solches ist.
  3. Für Sudo befinden Sie sich im falschen Verzeichnis. überprüfen Sie mit Sudo pwd
7
Ed Heal

Sie können auch einen Softlink zu Ihrem Skript in einem der Verzeichnisse erstellen (/usr/local/bin zum Beispiel) im Superuser PATH. Es steht dann dem Sudo zur Verfügung.

chmod +x foo.sh
Sudo ln -s path-to-foo.sh /usr/local/bin/foo

Schauen Sie sich diese Antwort an, um eine Vorstellung davon zu bekommen, in welches Verzeichnis der Softlink eingefügt werden soll.

4
TrigonaMinima

Versuchen chmod u+x foo.sh anstatt chmod +x foo.sh wenn Sie Probleme mit den obigen Anleitungen haben. Dies funktionierte für mich, als die anderen Lösungen dies nicht taten.

1

Ok, das ist meine Lösung: Füge in ~/.bash_aliases einfach Folgendes hinzu:

# ADDS MY PATH WHEN SET AS ROOT
if [ $(id -u) = "0" ]; then
   export PATH=$PATH:/home/your_user/bin 
fi

Voila! Jetzt können Sie Ihre eigenen Skripte mit Sudo ausführen oder als ROOT festlegen, ohne jedes Mal einen Export-PATH = $ PATH:/home/your_user/bin ausführen zu müssen.

Beachten Sie, dass ich explizit sein muss, wenn ich meinen PATH hinzufüge, da HOME für den Superuser/root ist

1

Es scheint, dass Linux "Befehl nicht gefunden" sagt, auch wenn Sie den Pfad zur Datei explizit angeben.

[[email protected] ~]$ Sudo /tmp/uid.sh;echo $?
Sudo: /tmp/uid.sh: command not found
1
[[email protected] ~]$ chmod +x /tmp/uid.sh
[[email protected] ~]$ Sudo /tmp/uid.sh;echo $?
0

Es ist ein etwas irreführender Fehler, aber wahrscheinlich technisch korrekt. Eine Datei ist erst dann ein Befehl, wenn sie ausführbar ist. Sie kann daher nicht gefunden werden.

1
Jeff MacDonald

Es gibt hervorragende Antworten oben. Wenn Sie nach dem Ausprobieren immer noch command not found versuche es erneut mit dem gesamten Dateipfad:

Sudo /home/user/path/to/foo.sh
0
IggyM