Wie lässt sich erkennen, ob es sich bei einem Dienst um einen Benutzerdienst oder einen Systemdienst handelt?

Wie lässt sich erkennen, ob es sich bei einem Dienst um einen Benutzerdienst oder einen Systemdienst handelt?

Ist es möglich, einen Dienst abzufragen und beispielsweise zu erfahren, ob er vom lib/systemd/systemoder von initiiert wurde /.config/systemd/user/?

Ich bin gerade dabei, einen systemdDienst zu schreiben, und derzeit habe ich ihn so eingerichtet, dass lib/systemd/systemer 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 systemdauch 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 sFlag 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/passwdEintrag für den Root-Benutzer zurück, der uidauf 0 gesetzt ist.

verwandte Informationen