Ich schreibe ein kleines Hilfsprogramm. Ich möchte, dass es versucht, sudo
bei Bedarf etwas auszuführen.
Das heißt: Wenn der aktuelle Benutzer mit Dateiberechtigungen nicht in der Lage ist, eine bestimmte Datei sudo
zu sudo
bearbeiten (und die Regeln dies zulassen würden), möchte ich, dass mein Dienstprogramm als Eigentümer der Datei etwas ausführt.
Ich hoffe, diese Fähigkeit im Voraus überprüfen zu können, da ich es vorziehen würde, dass sich die Systemprotokolle nicht mit Rauschen aus fehlgeschlagenen sudo
Versuchen füllen . Wie sudo
selbst berichtet über Fehler: "Dieser Vorfall wird gemeldet".
Also, ich bin der Hoffnung , programmatisch zu überprüfen: kann user <x>
laufen command <y>
über sudo
?.
Hier ist das Problem: Während es /etc/sudoers
diese Zuordnung enthält, befindet es sich im Root-Besitz und ist für normale Benutzer nicht lesbar.
Ich habe darüber nachgedacht, einen auszuführenden Unterprozess zu sudo -l
erzeugen (der Befehle ausgibt, die der aktuelle Benutzer sudo ausführen kann). Ich würde dann die Ausgabe davon analysieren. Dies scheint jedoch ein wenig fragil. Die Ausgabe enthält die gewünschten Informationen, aber es scheint, dass sie für Menschen zum Lesen gedacht sind (nicht für den programmatischen Verbrauch). Ich weiß nicht, ob es eine Garantie dafür gibt, dass die Ausgabe in Zukunft dem gleichen Format oder auf verschiedenen Plattformen folgt.
Wird das programmatische Parsen der sudo -l
Ausgabe als sicher angesehen? Wenn nicht, gibt es bessere Möglichkeiten, um im Voraus festzustellen, ob ein sudo-Befehl erfolgreich sein würde?
(Hintergrundinformationen zu X / Y: Dieses Dienstprogramm wird von einem Rollenkonto mit eingeschränktem Zugriff verwendet. Ich erwarte, dass sich einige andere Benutzer effektiv dafür entscheiden, dass das Konto mit eingeschränktem Zugriff ihre Dateien über Sudo-Regeln bearbeiten kann. Ich habe jedoch gewonnen Ich weiß nicht im Voraus, für welche dieser anderen Benutzer die entsprechende Sudo-Regel gilt.)
Antworten:
Laut der Sudo-Manpage:
Das wird also auf etwas hinauslaufen
Wie von Muru Verwendung entweder
-U $USER
oder-U $USERTOTEST
oder nichts, je nach Bedarf.quelle
$USER
den aktuellen Benutzer meinen wollten , können Sie einfach daraufsudo -l <command>
verzichten-U $USER
.(targetUser) ALL, !/usr/bin/foo
.. in diesem Fallsudo -l -u targetUser /usr/bin/foo
scheint die Ausgabe/usr/bin/foo
und das Beenden immer noch zu erfolgen mit Status 0. Trotzdem reicht es im Grunde für meine einfache Überprüfung und schlägt das Parsen der ausführlicherensudo -l
Ausgabe.