Ist es möglich, einen Dienst abzufragen und beispielsweise zu erfahren, ob er vom lib/systemd/system
oder von initiiert wurde /.config/systemd/user/
?
Ich bin gerade dabei, einen systemd
Dienst zu schreiben, und derzeit habe ich ihn so eingerichtet, dass lib/systemd/system
er als Root ausgeführt wird, aber ich möchte auch, dass er für jeden Benutzer funktioniert.
Ich habe einige Prüfungen in meinem Dienst, die wissen müssen, ob er Root-Zugriff hat oder nicht. Deshalb versuche ich herauszufinden, ob ich solche Informationen zu einem Dienst erhalten kann.
Ich verwende Ubuntu, möchte aber wissen, ob die Lösung systemd
auch auf andere Distributionen anwendbar ist, die Ubuntu verwenden.
Antwort1
Vorausgesetzt, Ihr Hauptdienst wird als Root ausgeführt, können Sie einen sehr einfachen Test wie folgt durchführen:
if(getuid() == 0)
{
...act as root...
}
else
{
...act as user...
}
Die Funktion könnte Sie auch interessieren seteuid()
. Sie ermöglicht Ihnen den Wechsel zwischen Benutzern, was eigentlich nur möglich ist, wenn Sie Root werden und dann zu einem beliebigen anderen Benutzer wechseln können. Sie können Root werden, wenn die ausführbare Datei das s
Flag hat, was für einen Dienst wirklich nicht empfohlen wird (und standardmäßig verhindert systemd solche Änderungen).
Schließlich können Sie mit systemd einen Mehrbenutzerdienst als anderer Benutzer als root ausführen. Das bedeutet, dass seine Kennung nicht 0 ist. Wenn Sie eine solche Funktion verwenden, müssen Sie zuerst die ID ermitteln.
struct passwd * p = getpwnam("my-global-service-user-name");
if(getuid() == p->pw_uid)
...
Der Benutzername könnte sein "root"
und die Funktion gibt den /etc/passwd
Eintrag für den Root-Benutzer zurück, der uid
auf 0 gesetzt ist.