web-dev-qa-db-ja.com

「su--command」と「su--session-command」の違いは何ですか?

# 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を使用しています。

3
oliver

通常、--commandよりも--session-command(-c)を優先する必要があります。インタラクティブシェルで-cを使用するべきではありません(おそらく--Shell /bin/bashが必要ですか?)が、バックグラウンドプロセスで使用する必要があります。

--session-commandは、setsid()を呼び出して新しいセッションを割り当てません(これは、ご存知のように、制御ttyの継続使用を許可する効果があるため、bashはプロセス制御をインタラクティブシェルにします)。これは、その子を親セッションの任意のプロセスグループ、おそらくセッションのフォアグラウンドpgに割り当てることができるか、またはプロセスグループIDに基づくkillpg()またはその他の分類を回避できることを意味します。また、セッション内の任意のプロセスにSIGCONTを送信する機能も保持されますが、それがどれほど悪用されるかはわかりません。

1
Andrew Domaszek

また、-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
#
0
andy

--session-commandが私が聞いた主要なディストリビューションのマニュアルページにないことを考えると、それはおそらくカスタムRHELのものです(Googleも役に立ちませんでした)。

-cは、指定されたユーザーに対して/etc/passwdで定義されているシェルを使用して、指定されたコマンドをsuに実行させます。これはSudoによく似ていますが、選択してパスワードを知っているユーザーと同じです。 -cnotインタラクティブなシェルを提供するため、ttyを必要とするものはすべて機能しません。

0
Nathan C