¿Es posible consultar un servicio y saber, por ejemplo, si se inició desde lib/systemd/system
o desde /.config/systemd/user/
?
Estoy escribiendo un systemd
servicio y actualmente lo puse en el sistema. lib/systemd/system
Se 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 systemd
tambié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 s
opció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/passwd
entrada para el usuario raíz que se ha uid
establecido en 0.