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

18

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

Beispielsweise; 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
Bernhard Colby
quelle
4
Der direkte Weg ist, es (ohne sudo) zu versuchen und es herauszufinden. Möglicherweise werden Befehle im Textmodus sudound grafische Befehle benötigt gksudo. Sie können auch überprüfen, wo der Befehl installiert ist which command. Wenn in /sbinoder /usr/sbin- können Sie erwarten, dass der Befehl sudooder benötigt gksudo.
Sudodus

Antworten:

26

Der einfachste Fall ist der einer ausführbaren Binärdatei 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 x zeigen an, dass die Datei vom Eigentümer (der ersten root) oder von jedem in der Gruppe root(der zweiten root) bzw. von 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 spezielle Fälle wie shutdown- dies ist wirklich eine symbolische Verknüpfung zu einem so genannten Kerndienstprogramm systemctl, das über eigene Mechanismen verfügt, um festzustellen, ob Sie es aufrufen dürfen, und um Sie nach Ihrem Sudo-Passwort zu fragen, wenn Sie dies nicht tun .

(Über den whichBefehl: 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. Es werden nicht nur alle ausführbaren Dateien gesucht. I Verwenden Sie es hier als Beispiel für die Suche nach der Berechtigung. Die Tatsache, dass whichdie ausführbare Datei bereits gefunden wird, zeigt an, dass Sie über die Berechtigung zum Ausführen verfügen.)

Jos
quelle
Sehr kurze Antwort (+1). Beispielsweise ist es möglich, das Ergebnis von apt-get install mit dem Flag -s zu simulieren (sudo apt-get install -s htop). Ich habe gedacht, wenn es keine Möglichkeit gibt, die Erlaubnis eines Befehls zu erlernen, bevor einer ausgegeben wird, gibt es zumindest so etwas wie "simulieren".
Bernhard Colby
Natürlich gibt es Dienstprogramme, die ein "Probelauf" - oder "Simulations" -Flag bereitstellen, das Sie verwenden können.
Jos
4
whichDer Befehl sollte für die Dateien ausreichen, die sich in einem der der $PATHVariablen hinzugefügten Verzeichnisse befinden . Zum Beispiel bewirkt sudo chmod 700 /bin/nanooder , dass keine Ausgabe erzeugt wird. Bei lokalen Skripten, die sich nicht in einem der Verzeichnisse befinden, oder bei Aufrufen ist dies ausreichend. Gute Antwort, aber bitte fügen Sie diese Information zu Ihrem Beitrag hinzusudo chmod 744 nanowhichPATHls -lstat
Sergiy Kolodyazhnyy
Gehen Sie von dem ab, was Serg gesagt hat, stat -c '%a' /bin/gzipund nehmen Sie 755zum Beispiel so etwas wie .
AT
21

Mit sudo:

$ sudo -l shutdown
/sbin/shutdown

Wenn ich keine Erlaubnis hatte, sudowerde ich mich beschweren, anstatt den Befehl zu zeigen.

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.

muru
quelle
Das Problem mit sudo ist, dass ich nicht sudoer im System bin. Aus diesem Grund versuche ich, vorsichtig zu sein, bevor ich wirklich einen Befehl erteile.
Bernhard Colby
4
@BernhardColby können Sie sicher ausführen, sudo -lauch wenn Sie kein Sudoer sind - das ist der springende Punkt -l-, um festzustellen, ob Sie einen Befehl mit sudo ausführen können.
muru
Danke (+1), ich wusste es nicht. Ich werde Ihre Lösung ausprobieren, sobald ich meinen PC habe.
Bernhard Colby
8

Sie können verwenden:

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

command -v shutdownGibt den Pfad zum shutdownBefehl zurück. test -xprü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.

Robie Basak
quelle
Was ist zum Beispiel alias shutdown="shutdown now"?
Dmitry Grigoryev
Um das Problem mit Aliasen zu vermeiden, können Sie $(which shutdown)oder verwenden $(shopt -u expand_aliases && command -v shutdown). Dieses Problem tritt jedoch nur im interaktiven Modus auf.
David Foerster
5

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

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

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

Wenn das letzte / dritte Triplet ein x ("kann ausführen") enthält, dann können andere - und das bedeutet, Sie - es ausführen ... Wenn es ein Shell-Skript oder ähnliches ist, dann benötigen andere r (" kann auch lesen ").

Wenn andere keine Ausführungsberechtigung haben, aber group (das zweite Triplet), können Sie sie ausführen, wenn Sie Mitglied der Gruppe sind - im Beispiel über bin . Zum Beispiel kann das Rad wird -group oft Grenze verwendet , die ausgeführt werden können su, so dass nur zu dieser Gruppe gehören Benutzer es überhaupt ausführen können. Ein anderes Beispiel ist die Erstellung einer Gruppe für Entwickler und die Beschränkung der Ausführung des C-Compilers und solcher Tools auf diese Gruppe.

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).

Schließlich kann es vorkommen, dass Sie einen Befehl ausführen dürfen, der Befehl selbst jedoch Ihre Identität überprüft und die Verwendung verweigert, es sei denn, Sie sind in einer Konfigurationsdatei aufgeführt oder es handelt sich um bestimmte Benutzer (z. B. root ). Zum Beispiel mounterlaubt der Befehl nur root , ein Gerät zu mounten - normale Benutzer dürfen nur Geräte mounten, die als solche in / etc / fstab ... aufgeführt sind, die möglicherweise keine sind. Wenn Sie nicht als Root angemeldet sind und versuchen, etwas zu mounten, mountwerden Sie sich beschweren und sich weigern, das Gerät zu mounten. Ein anderes Beispiel ist sudo, das für jeden läuft, aber nur Benutzer, die in / etc / sudoers aufgelistet sind, dürfen tatsächlich Dinge als root ausführen .

Baard Kopperud
quelle
3

Mit which, type, commandusw. ist eine praktische Lösung , die in 99% der Fälle funktioniert, aber 100% sicher sein , werden Sie manuell alle ausführbaren Verzeichnis aufgeführt in Ihrem überprüfen müssen $PATH. Viele Shells (einschließlich bash) werden Ihrem Befehl Einträge von voranstellen $PATHund versuchen, diese Dateien so oft auszuführen, bis sie erfolgreich sind. Da whichder Befehl nicht wirklich ausgeführt werden kann, kann er nicht vorhersagen, welche Datei Ihre Shell wirklich auswählt.

Stellen Sie sich zum Beispiel vor, ich habe PATH=/opt/arm/bin:/binbeide Verzeichnisse mit ausführbaren Dateien, aber für unterschiedliche Architekturen. Running which ddkehrt zurück /opt/arm/bin/dd(vorausgesetzt, ich habe die Berechtigung, es auszuführen), da dieser Eintrag an erster Stelle steht. Wenn ich jedoch ddin meiner Shell laufe , /bin/ddwird ausgeführt, weil /opt/arm/bin/ddnicht 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 zum Ausführen, rm ~/filejedoch 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.

Dmitry Grigoryev
quelle