¿Cómo es posible saber si un servicio es un servicio de usuario o un servicio del sistema?

¿Cómo es posible saber si un servicio es un servicio de usuario o un servicio del sistema?

¿Es posible consultar un servicio y saber, por ejemplo, si se inició desde lib/systemd/systemo desde /.config/systemd/user/?

Estoy escribiendo un systemdservicio y actualmente lo puse en el sistema. lib/systemd/systemSe ejecuta como root, pero también quiero que funcione para cada usuario.

Tengo algunas comprobaciones en mi servicio, que necesitan saber si tiene acceso de root o no. Es por eso que estoy tratando de averiguar si puedo obtener dicha información sobre un servicio.

Estoy usando Ubuntu, pero me gustaría saber si la solución es aplicable a otras distribuciones que systemdtambién lo usan.

Respuesta1

Suponiendo que su servicio principal se ejecuta como root, puede realizar una prueba muy simple como esta:

if(getuid() == 0)
{
    ...act as root...
}
else
{
    ...act as user...
}

También te puede interesar la seteuid()función. Eso le permite cambiar entre usuarios, lo cual es realmente posible sólo si puede convertirse en root y luego cambiar a cualquier otro usuario. Puede convertirse en root si el ejecutable tiene la sopción, que para un servicio realmente no se recomienda (y de forma predeterminada, systemd evita que se produzcan tales cambios).

Finalmente, systemd le permite ejecutar un servicio multiusuario como usuario distinto del root. Eso significa que su identificador no sería 0. Si está utilizando una función de este tipo, primero debe determinar la identificación.

struct passwd * p = getpwnam("my-global-service-user-name");
if(getuid() == p->pw_uid)
...

El nombre de usuario podría ser "root"y la función devolverá la /etc/passwdentrada para el usuario raíz que se ha uidestablecido en 0.

información relacionada