it-swarm.com.de

Wie kann ich feststellen, ob ich berechtigt bin, einen bestimmten Befehl auszuführen?

Gibt es eine Möglichkeit, festzustellen, ob ich als normaler Benutzer das Recht habe, einen Befehl zu erteilen?.

Zum Beispiel; Ich möchte überprüfen, ob ich das Recht habe, den Befehl shutdown abzusetzen, bevor ich ihn tatsächlich absetze.

Sowas wie die folgenden Befehle

-> doIhaveRightToIssue shutdown
-> Yes/No
18
Bernhard Colby

Der einfachste Fall ist der einer ausführbaren Binärdatei wie gzip. Zuerst suchen wir die ausführbare Datei:

$ which gzip
/bin/gzip

Dann schauen wir uns die Attribute dieser Datei an:

$ ls -l /bin/gzip
-rwxr-xr-x 1 root root 98240 oct 27  2014 /bin/gzip

Die drei xs sagen uns, dass die Datei vom Eigentümer (dem ersten root) oder jedem in der Gruppe root (dem zweiten root) bzw. jedem anderen ausgeführt werden kann. Ihr Benutzer darf also das Programm ausführen.

Ihre ausführbare Datei kann jedoch eine Skriptdatei sein, die andere ausführbare Dateien aufruft. Möglicherweise können Sie das Skript ausführen, jedoch nicht die darin aufgerufenen Programme. Es gibt keine Möglichkeit festzustellen, ob Ihr Benutzer dazu berechtigt ist, außer es tatsächlich auszuprobieren.

Dann gibt es Sonderfälle wie shutdown - dies ist wirklich eine symbolische Verknüpfung zu einem Kerndienstprogramm namens systemctl, das über eigene Mechanismen verfügt, um zu bestimmen, ob Sie es aufrufen dürfen, und um Sie nach Ihrem zu fragen Sudo-Passwort, wenn Sie dies nicht tun, zum Beispiel.

(Über den Befehl which: Hiermit werden ausführbare Dateien in Ihrem $ PATH gesucht, die Sie ausführen dürfen, und es wird angegeben, welche Sie verwenden, wenn Sie mehr als eine Datei mit demselben Namen im $ PATH haben. Sie werden nicht gefunden Ich verwende es hier als Beispiel für die Suche nach der Berechtigung. Die Tatsache, dass which die ausführbare Datei bereits findet, zeigt an, dass Sie die Berechtigung zum Ausführen haben.)

26
Jos

Mit Sudo:

$ Sudo -l shutdown
/sbin/shutdown

Wenn ich keine Erlaubnis hatte, beschwert sich Sudo, anstatt den Befehl anzuzeigen.

Mit polkit suchen Sie nach der Aktion, die Sie ausführen möchten:

$ pkcheck --action-id org.freedesktop.login1.power-off --process $$ -u --enable-internal-agent && echo yes
polkit\56temporary_authorization_id=tmpauthz1
yes

Das Finden der relevanten Aktion ist eine andere Frage.

21
muru

Sie können verwenden:

test -x $(command -v shutdown) && echo yes || echo no

command -v shutdown gibt den Pfad zum Befehl shutdown zurück. test -x prüft, ob dieser Pfad für Sie ausführbar ist.

Beachten Sie, dass der Befehl möglicherweise fehlschlägt, obwohl Sie ihn möglicherweise ausführen können, da er nicht über die erforderliche Berechtigung zum Ausführen der Aufgabe verfügt. Dies ist der häufigste Fall bei Unix-Systemen, bei denen der Zugriff auf Befehle nicht eingeschränkt, sondern auf die Vorgänge beschränkt wird, die Programme tatsächlich ausführen können.

8
Robie Basak

Nun, es kann manchmal ein bisschen schwierig sein ...

Schauen Sie sich zunächst die Berechtigungen mit ls -l... an.

 Befehl owngrpotr user group 
 - rwxr-xr-x root bin vim 

Wenn das letzte/dritte Triplett ein x ("kann ausführen") enthält, dann andere - und das heißt Sie - kann es ausführen ... Wenn es ein Shell-Skript oder ähnliches ist, dann würden andere r (" kann auch lesen ").

Wenn andere keine Ausführungsberechtigung haben, aber Gruppe (die zweite Triplett), dann können Sie es ausführen, wenn Sie ein Mitglied der Gruppe sind - im Beispiel über bin . Beispielsweise wird die Gruppe wheel häufig verwendet, um zu begrenzen, wer su ausführen darf, sodass nur Benutzer, die zu dieser Gruppe gehören, sie ausführen können alle. Ein weiteres Beispiel besteht darin, eine Gruppe für Entwickler zu erstellen und die Ausführung des C-Compilers und solcher Tools auf diese Gruppe zu beschränken.

Wenn nach dem letzten Triplet ein abschließendes + steht, bedeutet dies, dass AccessControllLists verwendet werden. Dadurch können zusätzliche Benutzer und Gruppen Ausführungsrechte erhalten.

+++

Selbst wenn Sie den Befehl ausführen können, hängt der Befehl möglicherweise vom Zugriff auf Dateien, Verzeichnisse und/oder Geräte ab, auf die Sie keinen Zugriff haben etwas tun).

Obwohl Sie möglicherweise einen Befehl ausführen dürfen, kann der Befehl selbst Ihre Identität überprüfen und die Verwendung verweigern, es sei denn, Sie sind in einer Konfigurationsdatei aufgeführt oder es handelt sich um bestimmte Benutzer (z. B. root ). Zum Beispiel erlaubt der Befehl mount nur root , ein Gerät zu mounten - normale Benutzer dürfen nur Geräte mounten, die als solche in/etc aufgeführt sind/fstab ... das kann keiner sein. Wenn Sie kein Root-Benutzer sind und versuchen, etwas bereitzustellen, beschwert sich mount und verweigert das Bereitstellen des Geräts. Ein weiteres Beispiel ist Sudo, das für alle Benutzer ausgeführt werden kann, aber nur Benutzer, die in/etc/sudoers aufgeführt sind, dürfen tatsächlich Dinge als root ausführen .

5
Baard Kopperud

Die Verwendung von which, type, command usw. ist eine praktische Lösung, die in 99% der Fälle funktioniert. Um jedoch 100% ig sicher zu sein, müssen Sie jedes ausführbare Verzeichnis manuell überprüfen aufgeführt in Ihrem $PATH. Viele Shells (einschließlich bash) werden Ihrem Befehl Einträge von $PATH voranstellen und versuchen, diese Dateien wiederholt auszuführen, bis sie erfolgreich sind. Da which den Befehl nicht wirklich ausführen kann, kann er nicht vorhersagen, welche Datei Ihre Shell wirklich auswählt.

Stellen Sie sich zum Beispiel vor, ich habe PATH=/opt/arm/bin:/bin, beide Verzeichnisse enthalten ausführbare Dateien, aber für unterschiedliche Architekturen. Wenn Sie which dd ausführen, wird /opt/arm/bin/dd zurückgegeben (vorausgesetzt, ich habe die Berechtigung, es auszuführen), da dieser Eintrag an erster Stelle steht. Wenn ich jedoch dd in meiner Shell ausführe, wird /bin/dd ausgeführt, da /opt/arm/bin/dd nicht ausgeführt werden kann. Die gleiche Situation kann bei beschädigten Binärdateien, fehlenden Bibliotheken usw. auftreten. Letztendlich gibt es keine sichere Möglichkeit, festzustellen, ob Sie einen Befehl ausführen können oder nicht, außer wenn Sie es versuchen.

Ein weiterer Aspekt ist, was Sie als "mit Berechtigungen" betrachten. Als Benutzer habe ich die Berechtigung, rm ~/file auszuführen, jedoch nicht rm /root/file. Auch hier gibt es keinen generellen Weg, dies zu wissen, ohne die manuelle Überprüfung oder das Ausgeben des Befehls und das Beobachten der Ergebnisse.

3