
Ich habe ein einfaches init.d-Skript, das einen Prozess startet und stoppt. Ich rufe init.d als Root auf, möchte aber, dass der von ihm gesteuerte Prozess als bestimmter Benutzer ausgeführt wird.
Der häufigste Vorschlag im Internet scheint zu sein,
su myuser -c "my_process args"
Dies erzeugt allerdings einen zweiten Prozessraum, eine neue Shell etc. und ist etwas unelegant.
Ich würde lieber verwenden exec()
, da es die Shell ersetzt, aber es nimmt keinen Benutzer als Argument an. Ist das ein Fall, in dem ich setuid()
zuerst verwenden sollte? Was ist mit dem Einstellen der GID? Gibt es irgendwelche Fallstricke, die man beachten muss?
Gibt es alternativ distributionsspezifische Lösungen, um init.d als anderer Benutzer auszuführen? Meine Umgebung ist Centos 6.4.
Antwort1
Hängt von der Distribution ab, aber RHEL-basierte Distributionen verwenden eine Bash-Funktion, aus /etc/rc.d/init.d/functions
der sie stammen und die aufgerufen wird daemon
und selbst nur ein Wrapper um den runuser
Befehl ist. Soweit ich es in den Quelldateien erkennen kann, ist es su
in den meisten Fällen funktional identisch, es läuft nur nicht über PAM (wahrscheinlich, um in bestimmten Fällen Henne-Ei-Probleme zu vermeiden).
Das wird Ihre Einwände nicht wirklich beantworten, aber so machen es die Dienste. Die Sauberkeit und allgemeine Konformität mit der Logik, die Sie sich wünschen, ist Teil der Motivation für Dinge wiesystemd
Antwort2
Die Verwendung von su someuser -c ...
ist erforderlich. Zunächst einmal setuid()
ist ein Systemaufruf für Shellcode nicht verfügbar. Machen Sie es nicht unnötig kompliziert.