# su - oliver --command bash
を実行するとシェルが表示されますが、警告bash: no job control in this Shell
も出力されます。実際、Ctrl + Zとfg
/bg
はそのシェルでは機能しません。
# su - oliver --session-command bash
を実行すると、警告を出力せずにシェルが表示され、ジョブ制御は実際に機能します。
--session-command
を使用するという提案は、 suを使用してスクリプトからシェルを開始すると「このシェルにジョブ制御がない」という結果になります 「[suのセキュリティ修正]が-cオプションの動作を変更し、呼び出されたシェル内のジョブ制御を無効にします。
しかし、私はまだこれを完全には理解していません。 いつ--command
を使用し、いつ--session-command
を使用する必要がありますか?--command
(別名-c
)はより安全ですか?または、常に--session-command
を使用する必要があり、下位互換性のために--command
はそのままにしておきますか?
FWIW、私はRHEL6.4を使用しています。
通常、--command
よりも--session-command
(-c)を優先する必要があります。インタラクティブシェルで-cを使用するべきではありません(おそらく--Shell /bin/bash
が必要ですか?)が、バックグラウンドプロセスで使用する必要があります。
--session-commandは、setsid()を呼び出して新しいセッションを割り当てません(これは、ご存知のように、制御ttyの継続使用を許可する効果があるため、bashはプロセス制御をインタラクティブシェルにします)。これは、その子を親セッションの任意のプロセスグループ、おそらくセッションのフォアグラウンドpgに割り当てることができるか、またはプロセスグループIDに基づくkillpg()またはその他の分類を回避できることを意味します。また、セッション内の任意のプロセスにSIGCONTを送信する機能も保持されますが、それがどれほど悪用されるかはわかりません。
また、-cを使用してもttyが作成されないこともわかりました。
# su nobody -s /bin/bash -c "echo hi >/dev/tty"
bash: /dev/tty: No such device or address
#
# su nobody -s /bin/bash --session-command="echo hi >/dev/tty"
hi
#
--session-command
が私が聞いた主要なディストリビューションのマニュアルページにないことを考えると、それはおそらくカスタムRHELのものです(Googleも役に立ちませんでした)。
-c
は、指定されたユーザーに対して/etc/passwd
で定義されているシェルを使用して、指定されたコマンドをsu
に実行させます。これはSudo
によく似ていますが、選択してパスワードを知っているユーザーと同じです。 -c
はnotインタラクティブなシェルを提供するため、ttyを必要とするものはすべて機能しません。