Можно ли запросить службу и узнать, например, была ли она инициирована из 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.