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

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

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

저는 서비스를 작성하는 중이며 systemd현재 루트로 실행되도록 설정했지만 lib/systemd/system각 사용자에게도 작동하도록 만들고 싶습니다.

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

저는 Ubuntu를 사용하고 있지만 이 솔루션이 Ubuntu를 사용하는 다른 배포판에도 적용 가능한지 알고 싶습니다 systemd.

답변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)
...

사용자 이름은 다음과 같을 수 "root"있으며 함수는 0으로 설정된 /etc/passwd루트 사용자에 대한 항목을 반환합니다.uid

관련 정보