サービスがユーザーサービスかシステムサービスかどうかはどうすればわかりますか?

サービスがユーザーサービスかシステムサービスかどうかはどうすればわかりますか?

lib/systemd/systemサービスを照会し、そのサービスが で開始されたのか、 で開始されたのかを知ることはできますか/.config/systemd/user/

私はsystemd現在rootとして実行されているサービスに入れたサービスを作成していますが、lib/systemd/systemすべてのユーザーにも機能したいと思います。

私のサービスにrootアクセス権があることを確認する必要があるいくつかのチェックがあります。そのため、サービスに関するそのような情報を入手できるかどうかを調べようと努力しています。

systemd私はUbuntuを使用していますが、このソリューションが他の中古ディストリビューションでも機能するかどうかを知りたいです。

答え1

基本サービスがrootとして実行されていると仮定すると、次のような非常に簡単なテストを実行できます。

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

この機能に興味があるかもしれませんseteuid()。これにより、ユーザー間の変更が可能になります。これは、ルートになってから別のユーザーに切り替えることができる場合にのみ可能です。実行可能ファイルに対応するフラグがあるとルートになる可能性がありますが、s実際にはサービスには推奨されません(systemdはデフォルトでこれらの変更が発生しないようにします)。

最後に、systemdを使用すると、root以外のユーザーとしてマルチユーザーサービスを実行できます。これは、対応する識別子がゼロではないことを意味します。これらの機能を使用するには、まずIDを確認する必要があります。

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

ユーザー名は、0に設定されているrootユーザーのエントリを"root"返します。/etc/passwduid

関連情報