util-linux runuser(su) がフォークされるのはなぜですか?

util-linux runuser(su) がフォークされるのはなぜですか?

runuserutil-linux(ルートから起動したときにのみ実行される他のエントリポイント)を使用すると、次のsuプロセスツリーが表示されます。

[root] runuser -u username sometool
  \- [username] sometool

exec単に権限を放棄してターゲットにアクセスするのではなく、この親プロセスを維持する目的は何ですか?

答え1

マンページに見られるように:

--session-command=command -c と同じですが、新しいセッションを作成しません(推奨されません)。

したがって、新しいセッションには新しいPIDが必要であるため、デフォルトの呼び出しには新しいプロセスを作成する必要があります。

また、戻りコードは、プロセスを終了した終了ステータスまたはシグナルによって異なります。最後のポイントでは、子プロセスの状態を監視するプロセスも必要です。

私はこれが意図的に設計されていると思います。 IMOとは異なり、suスクリプトrunuserで使用されます(したがって、パスワードを要求せずにエラー状態をよりよく処理し、シグナル処理(新しいセッション)を呼び出し元から切り離します。

答え2

この親プロセスを維持する目的は何ですか?

create_watching_parentソースコードを注意深く読みましたsu-common.c。親は次のことができるように近くにいるようです。

  • cleanup_pam子が終了した後に親が呼び出す
  • シグナルによって子プロセスが終了すると、親プロセスはシェルのように子プロセスの処理状態を(stderrに)印刷します。
  • 親プロセスがSIGINT、SIGQUIT、またはSIGTERM信号を受信すると、親プロセスは信号をキャプチャし、SIGTERMとSIGKILLを使用して子プロセスを終了し、受信した同じ信号を使用してセルフシャットダウンします。子プロセスが別のセッションまたはpgrpに入る場合は、ユーザーが直接コマンドを終了できるようにこれを実行したいと思います。

答え3

他の答えを補うためにutil-linuxでフォークしないコマンドは次のとおりです。権限の設定:

# setpriv --reuid=django --regid=django --inh-caps=-all --reset-env --clear-groups ./run-server

関連情報