Как можно узнать, является ли служба пользовательской или системной?

Как можно узнать, является ли служба пользовательской или системной?

Можно ли запросить службу и узнать, например, была ли она инициирована из lib/systemd/systemили из /.config/systemd/user/?

Я сейчас пишу systemdслужбу, и в данный момент я разместил ее в системе, где lib/systemd/systemона работает от имени пользователя root, но я также хочу, чтобы она работала и для каждого пользователя.

У меня есть несколько проверок в моей службе, которым нужно знать, есть ли у нее root-доступ или нет. Вот почему я пытаюсь выяснить, могу ли я получить такую ​​информацию относительно службы.

Я использую Ubuntu, но мне бы хотелось узнать, применимо ли это решение к другим дистрибутивам, использующим эту ОС systemd.

решение1

Предполагая, что ваша основная служба работает от имени пользователя root, вы можете провести очень простой тест, например:

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

Вас также может заинтересовать функция seteuid(). Она позволяет вам переключаться между пользователями, что действительно возможно, только если вы можете стать root, а затем переключиться на любого другого пользователя. Вы можете стать root, если исполняемый файл имеет флаг s, что для службы действительно не рекомендуется (и по умолчанию systemd предотвращает такие изменения).

Наконец, systemd позволяет вам запускать многопользовательскую службу как пользователь, отличный от root. Это означает, что ее идентификатор не будет равен 0. Если вы используете такую ​​функцию, то вам нужно сначала определить идентификатор.

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

Имя пользователя может быть , "root"и функция вернет /etc/passwdзапись для пользователя root, которая uidустановлена ​​на 0.

Связанный контент