Warum sind einige Befehle nicht vorhanden?

1679
Ross

Ich bin ein ziemlich neuer Linux-Benutzer und mir ist aufgefallen, dass einige Befehle nur für den Superbenutzer verfügbar sind - beispielsweise zum Herunterfahren. Ich werde oft verwirrt, wenn ich weiß, dass es einen Befehl gibt, versuche, ihn auszuführen, aber man sagt mir, dass er gar nicht existiert - aber alles, was ich brauchte, war root, um ihn auszuführen.

Meine Frage ist, warum diese Befehle nicht besagen, dass Sie nicht über ausreichende Berechtigungen verfügen, um es auszuführen, oder dass Sie root sein müssen? Gibt es einen technischen Grund dafür oder ist es einfach so?

0

4 Antworten auf die Frage

6
heavyd

Sie sind "nicht vorhanden", weil sich ihre Position nicht in unserer Umgebungsvariablen PATH befindet. Sie können die Verzeichnisse in Ihrem PFAD anzeigen, indem Sie Folgendes eingeben:

echo $PATH 

Sie können den Ort Ihres Befehls durch Eingabe prüfen

whereis shutdown 

Normalerweise sehen Sie, dass sich das Verzeichnis des gesuchten Befehls nicht in Ihrem PATH befindet. Sie können Ihrem Pfad Verzeichnisse hinzufügen, indem Sie die folgenden Zeilen in Ihr Anmeldeskript einfügen (~ / .bash_profile).

PATH=$PATH:/my/new/directory export PATH 
4
Telemachus

Die Antwort, die Sie wahrscheinlich sehen, zeigt nicht an, dass die Befehle nicht existieren, sondern dass sie "nicht gefunden" werden:

telemachus ~ $ ifconfig -a bash: ifconfig: command not found 

Einige Fehlermeldungen sind unbrauchbar, aber diese ist relativ hilfreich. Die Wörter "nicht gefunden" sagen Ihnen, wo das Problem liegt. Ihre Shell (in meinem Fall ist es eindeutig Bash) sucht nach Befehlen entlang ihrer $PATHVariablen. Das PATHist eine Menge von durch Doppelpunkt getrennten Werten. Jeder Wert ist ein Verzeichnis, in dem ausführbare (binäre) Programme abgelegt werden, und die Shell sucht nach Befehlen in der Reihenfolge von links nach rechts entlang der Verzeichniskette. So können Sie sehen, was Ihr PFAD ist:

telemachus ~ $ echo $PATH /home/telemachus/bin:/usr/local/bin:/usr/bin:/bin:/usr/games 

(Beachten Sie, dass der Fall wichtig ist, PATH ist alles übergeordnet. Auch die $Angelegenheit.) Also sucht meine Shell nach Befehlen im binVerzeichnis in meinem Home-Ordner, dann in /usr/local/bin, dann in /usr/binusw. Die Reihenfolge ist wichtig, da Sie manchmal zwei Versionen von einer haben Programm, und Sie möchten sicherstellen, dass Sie zuerst ein bestimmtes Programm finden. (Ich habe eine andere Version von Ruby in meinem $HOME/binVerzeichnis als die systemweite, und ich möchte, dass sie zuerst gefunden wird.)

Um ein Verzeichnis zu PATH hinzuzufügen, können Sie normalerweise das Profil Ihrer Shell bearbeiten. Je nachdem, welche Linux-Distribution Sie verwenden, wird diese Datei als .profileoder .bash_profilebezeichnet und befindet sich in Ihrem Home-Verzeichnis. Dateien, die mit einem .(oft als Punktdateien bezeichnet) beginnen, werden standardmäßig ausgeblendet. Sie werden nicht in einem GUI-Dateimanager angezeigt, und der lsBefehl kann sie nicht (ohne Hilfe) sehen. Um zu sehen, was in Ihrem Zuhause vorhanden ist, öffnen Sie eine Shell (Sie befinden sich standardmäßig in Ihrem Home-Verzeichnis in einer neuen Shell), und geben Sie ls -A ein . Das -A- Flag weist den Befehl ls an, versteckte Dateien anzuzeigen. Sie sollten entweder .profileoder sehen.bash_profile, die Sie dann bearbeiten können. Fügen Sie einen Doppelpunkt und den vollständigen Pfad des gewünschten Verzeichnisses hinzu (ein vollständiger Pfad sollte mit einem beginnen/um seine Position von der Wurzel Ihres Laufwerks anzugeben). Sie möchten keinen Doppelpunkt nach dem letzten Wert. Wenn Sie einen normalen PFAD haben, können Sie /sbindiesen Weg hinzufügen :

PATH=$PATH:/sbin 

Trotz alledem kann man immer noch nicht direkt auf /sbin/shutdowndiesen Weg gelangen:

telemachus ~ $ /sbin/shutdown -h now shutdown: you must be root to do that! 

Durch die Angabe des vollständigen Pfads des Befehls habe ich den Befehl "gefunden", konnte ihn jedoch immer noch nicht ausführen. Einige Befehle shutdownbenötigen spezielle Berechtigungen. Um die Erlaubnis zur Ausgabe shutdownvon einer Shell zu erhalten, müssen Sie suoder sudoabhängig davon, auf welchem ​​System Sie sich befinden. Ich habe bereits einen Roman geschrieben, das ist also eine Geschichte für einen anderen Tag.

3
Kirill V. Lyadvinsky

Sie werden in gespeichert /usr/sbinoder /sbinVerzeichnissen, die in dem vom Benutzer nicht enthalten sind PATHvariabel (Standard).

1
Andrea Ambu

Denken Sie an Linux als Mehrbenutzer-System, und es macht Sinn. Sie möchten nicht, dass der Computer, an dem Sie arbeiten, von einem anderen Benutzer heruntergefahren wird . Wenn root es gut macht, hat er vielleicht einen guten Grund, es abzuschalten.

Als Benutzer sollten Sie in der Lage sein, Dinge zu tun, die nur Ihren Raum betreffen. Wenn Sie Linux als Desktop ausführen (und Sie sagen, Sie sind neu dabei), haben Sie wahrscheinlich etwas wie Ubuntu oder ähnliches. In diesen Distributionen können Sie die GUI verwenden, um fast alles zu verwenden, und das System fragt Sie bei Bedarf nach dem Kennwort.

Auf der Konsole können Sie root-Zugriff erhalten, indem Sie den suBefehl (wenn Sie das Passwort von root kennen) verwenden oder sudo suwenn Ihre Distribution sudo verwendet. Danach haben Sie alle Kräfte und Privilegien, die Sie benötigen, um Ihr System zu durchbrechen: P