Befehl bei Verwendung von sudo nicht gefunden

145

Ich habe ein Skript foo.shin meinem Home-Ordner aufgerufen .

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

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

Wenn ich benutze sudo ./foo.sh, bekomme ich

sudo: foo.sh: command not found.

Warum passiert das und wie kann ich es beheben?

Neko
quelle

Antworten:

151

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 chmodBefehl 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 chmododer 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 chmodBefehl 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 PATHUmgebungsvariable für root nicht das Verzeichnis enthält, in dem foo.shsich 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 envBefehls 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.shbefindet, ist in der PATH-Variablen des Root-Benutzers nicht vorhanden, daher wurde der Befehl nicht gefunden .

Rob Kielty
quelle
1
@ Nakilon, wenn Sie das in eine Frage mit allen Details stellen, sollte ich in der Lage sein, es für Sie weiter zu beheben. Das Problem ist wahrscheinlich, welche Shell (Ihre erste Befehlsshell oder die von sudo gestartete Shell) $ PWD
Rob Kielty
6
@ Rob: so wie macht man sudo‚s PATHdie gleiche wie die des Benutzers?
Tom
1
@Rob: Ich habe in der Zwischenzeit einen Weg gefunden (siehe meine Antwort unten).
Tom
1
Ich mag die Art, wie du es erklärt hast! Danke :)
Kasparov92
1
@ Tom können Sie den sicheren Pfad in / etc / sudoers ändern
DennisLi
97

Die anderen Lösungen, die ich bisher hier gesehen habe, basieren auf einigen Systemdefinitionen, aber es ist tatsächlich möglich, sudodie aktuelle PATH(mit dem envBefehl) und / oder den Rest der Umgebung (mit der -EOption) zu verwenden, 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 zu benennen sudound das Original zu ersetzen sudo.)

Tom
quelle
3
Ich mag diese Lösung, Tom, weil Sie bewusst mit einem anderen Sudo-Aufruf arbeiten. Es ist wichtig zu wissen, welche PATH-Variable zu jeder Zeit verwendet wird (und es gibt viele), wie sie eingerichtet ist.
Rob Kielty
4
Ich glaube, dass dies die richtige und standardisierteste Lösung für command not foundProbleme in der Ubuntu-Distribution ist. Danke, Mann.
Omar Tariq
Sie können den Alias ​​zu Ihrem hinzufügen ./bashrc, um ihn zwischen den Sitzungen zu speichern
George
18

Suchen Sie auf sudo nach Secure_path

[root@host ~]# sudo -V | grep 'Value to override'
Value to override user's $PATH with: /sbin:/bin:/usr/sbin:/usr/bin

Wenn $PATHüberschrieben wird, verwenden visudound bearbeiten/etc/sudoers

Defaults    secure_path = /sbin:/bin:/usr/sbin:/usr/bin:/usr/local/bin
Codemonkee
quelle
Vielen Dank! Dies half, ein Rätsel zu lösen, dass sudo keine Befehle ausführen konnte.
Evgeny Goldin
7
  1. Überprüfen Sie, ob Sie über Ausführungsberechtigungen für das Skript verfügen. dhchmod +x foo.sh
  2. Überprüfen Sie, ob die erste Zeile dieses Skripts #!/bin/shoder eine solche Zeile ist .
  3. Für sudo befinden Sie sich im falschen Verzeichnis. erkundigen Sie sich beisudo pwd
Ed Heal
quelle
5

Sie können auch einen Softlink zu Ihrem Skript in einem der Verzeichnisse ( /usr/local/binzum Beispiel) im Superuser-Pfad erstellen . Es wird dann dem Sudo zur Verfügung stehen.

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 ein Softlink eingefügt werden soll.

TrigonaMinima
quelle
2

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

[veeam@jsandbox ~]$ sudo /tmp/uid.sh;echo $?
sudo: /tmp/uid.sh: command not found
1
[veeam@jsandbox ~]$ chmod +x /tmp/uid.sh
[veeam@jsandbox ~]$ sudo /tmp/uid.sh;echo $?
0

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.

Jeff MacDonald
quelle
1

Ok, das ist meine Lösung: Fügen Sie 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 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

Fernando D Jaime
quelle
1

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

Was ist in einer Google-Suche?
quelle
1

Es gibt oben ausgezeichnete Antworten. Wenn Sie nach dem Ausprobieren immer noch command not foundden gesamten Dateipfad versuchen:

sudo /home/user/path/to/foo.sh
IggyM
quelle