Irgendwo auf der Linie wird ein Prozess oder andere eine effektive UID von 0 (Root) benötigen, weil nur ein solcher Prozess die effektive UID auf eine beliebige andere UID setzen kann.
Bei der Shell ist der Befehl su
ein SUID-Root-Programm; es ist entsprechend privilegiert (POSIX-Jargon) und kann die echte und effektive UID setzen. In ähnlicher Weise kann der Befehl sudo
den gleichen Job ausführen. Mit sudo
können Sie auch konfigurieren, welche Befehle und UID zulässig sind. Der entscheidende Unterschied ist, dass su
das Passwort des Zielbenutzers benötigt, um Sie einzulassen; sudo
erfordert das Passwort des Benutzers, der es ausführt.
Es gibt natürlich die Frage, ob ein Benutzer die Kennwörter anderer Benutzer kennen sollte. Im Allgemeinen sollte kein Benutzer das Passwort eines anderen Benutzers kennen.
Scripting UID Änderungen ist schwer.Sie tun können:
su altuser -c "commands to execute as altuser"
sudo -u altuser commands to execute as altuser
jedoch su
ein Passwort von dem Steuerterminal verlangen (und wird scheitern, wenn es kein Steueranschluss ist). Wenn Sie sudo
verwenden, werden die Anmeldeinformationen zwischengespeichert (oder können dafür konfiguriert werden), so dass Sie nur einmal nach einem Kennwort gefragt werden - aber es wird beim ersten Mal wie bei su
angezeigt.
Arbeiten um die Aufforderung ist schwer. Sie können Werkzeuge parallel zu expect
verwenden, die Pseudo-ttys für Sie behandeln. Sie werden dann jedoch damit konfrontiert, Kennwörter in Skripten zu speichern (keine gute Idee) oder sie irgendwie außer Sichtweite zu halten.
Das Werkzeug, das ich für den Job verwenden ist ich schrieb, genannt asroot
. Dadurch kann ich genau die UID- und GID-Attribute steuern, die der untergeordnete Prozess haben sollte. Aber es ist so konzipiert, dass ich es nur benutzen darf - das heißt, zur Kompilierzeit wird der berechtigte Benutzername angegeben (natürlich kann das geändert werden). Allerdings kann ich Dinge wie:
asroot -u someone -g theirgrp -C -A othergrp -m 022 -- somecmd arg1 ...
Dadurch wird die reale und effektive UID zu ‚jemand‘ setzt, setzt die primäre Gruppe ‚theirgrp‘, entfernt alle Hilfsgruppen und fügt hinzu ‚othergrp‘ (so den Prozess gehört zu nur zwei Gruppen) und setzt die Umask auf 0222; Es führt dann 'somecmd' mit den angegebenen Argumenten aus.
Für einen bestimmten Benutzer, der eingeschränkten (oder nicht so begrenzten) Zugriff auf andere Benutzerkonten benötigt, funktioniert das gut. Als allgemeine Lösung ist es nicht so heiß; sudo
ist in den meisten Punkten besser, erfordert aber immer noch ein Passwort (was asroot
nicht tut).
David Cournapeau und Michiel Buddingh hatten beide gute Seiten. Ich werde die Funktion os.seteuid() zusammen mit einem privilegierten Benutzer (nicht root) verwenden, um das Skript auszuführen. – Caedis