非ルートユーザーとしてサービスを実行するための推奨される方法は何ですか?

非ルートユーザーとしてサービスを実行するための推奨される方法は何ですか?

プロセスを開始および停止する簡単な init.d スクリプトがあります。 init.d を root として呼び出しますが、それが制御するプロセスを特定のユーザーとして実行したいと思います。

オンラインで最も一般的な提案は、

su myuser -c "my_process args"

ただし、これにより 2 番目のプロセス スペース、新しいシェルなどが作成され、やや洗練されません。

シェルを置き換えるので を使いたいのですexec()が、これはユーザーを引数として取りません。これはsetuid()最初に を使うべきケースでしょうか? gid の設定はどうでしょうか? 何か注意すべき点はありますか?

あるいは、別のユーザーとして init.d を実行するためのディストリビューション固有のソリューションはありますか? 私の環境は Centos 6.4 です。

答え1

/etc/rc.d/init.d/functionsディストリビューションによって異なりますが、RHEL ベースのディストリビューションは、呼び出されるBash 関数を使用しますが、daemonそれ自体はコマンドのラッパーにすぎませんrunuser。ソース ファイルから判断すると、ほとんどの場合、機能的には同じですがsu、PAM を経由しないだけです (おそらく、特定のケースで鶏が先か卵が先かという問題を回避するためです)。

これはあなたの反論に答えるものではないが、サービスがそれを実現する方法だ。あなたが望むような簡潔さと全体的な論理への適合は、次のようなことの動機の一部である。systemd

答え2

の使用はsu someuser -c ...必要なことです。まず、 はsetuid()シェル コードでは使用できないシステム コールです。必要以上に難しくしないでください。

関連情報