서비스가 사용자 서비스인지 시스템 서비스인지 어떻게 알 수 있나요?

서비스가 사용자 서비스인지 시스템 서비스인지 어떻게 알 수 있나요?

lib/systemd/system서비스를 쿼리하고 해당 서비스가 에서 시작되었는지 또는 에서 시작되었는지 알 수 있습니까 /.config/systemd/user/?

나는 systemd현재 루트로 실행되는 서비스에 넣은 서비스를 작성 중이지만 lib/systemd/system모든 사용자에게도 작동하기를 원합니다.

내 서비스에 루트 액세스 권한이 있는지 확인해야 하는 몇 가지 검사가 있습니다. 그래서 서비스에 대한 그러한 정보를 얻을 수 있는지 알아보려고 노력하고 있습니다.

systemd저는 Ubuntu를 사용하고 있지만 이 솔루션이 다른 중고 배포판에서도 작동 하는지 알고 싶습니다 .

답변1

기본 서비스가 루트로 실행되고 있다고 가정하면 다음과 같은 매우 간단한 테스트를 수행할 수 있습니다.

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

이 기능에 관심이 있으실 수도 있습니다 seteuid(). 이를 통해 사용자 간 변경이 가능하며 이는 루트가 된 후 다른 사용자로 전환할 수 있는 경우에만 가능합니다. 실행 파일에 해당 플래그가 있으면 루트가 될 수 있지만 s실제로는 서비스에 권장되지 않습니다(systemd는 기본적으로 이러한 변경이 발생하지 않도록 방지합니다).

마지막으로 systemd를 사용하면 루트가 아닌 사용자로 다중 사용자 서비스를 실행할 수 있습니다. 이는 해당 식별자가 0이 아님을 의미합니다. 이러한 기능을 사용하려면 먼저 ID를 확인해야 합니다.

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

사용자 이름은 0 으로 설정된 루트 사용자에 대한 항목을 "root"반환합니다 ./etc/passwduid

관련 정보