web-dev-qa-db-ja.com

インタラクティブでないログインシェルが存在する可能性はありますか?

通訳で このフローチャート

enter image description here

私はそれを男のバッシュで見つけました:

Bashが対話型ログインシェルとして、または--loginオプションを使用して非対話型シェルとして呼び出されると、ファイル/ etc/profileが存在する場合、そのファイルからコマンドを読み取り、実行します。

これは、インタラクティブログインシェルが/etc/profile(-noprofileなし)を読み取ることを示しています

また、non-interactiveshells with a option --login read /etc/profile

loginシェル($0-で始まるシェル)を残しているようです非インタラクティブ(スクリプトを実行します。多分dateのように単純です)は、(ソース)/etc/profileを読み取れない場合があります。

このアイデアを確認または拒否するには:

最初にsu -l -を使用しようとしました。これは、最初の文字として-を使用してログインシェルを開始しますが、非対話型にすることはできません(そして、テストを提示してプローブすることができます)。

のようなものを呼び出す

$ bash -c 'date' -bash

ログインシェルであると報告しません(最初の文字が-であっても)。

詳細を明らかにするためにこれを試してください:

   $ bash -c 'echo "$0 $- ||$(shopt -p login_Shell)||";date' -bash
      -bash hBc ||shopt -u login_Shell||
      Fri Aug 19 06:32:31 EDT 2016

$0の最初の文字は-であり、$-の値にi(インタラクティブ)はありませんが、login_Shell(-u)としては報告されません。この場合、/ etc/profileは読み取られませんでしたが、これが正しいテストであるかどうかはわかりません。


「まれな非対話型ログインシェル」についての言及もあります この回答では この質問に十分具体的ではありません。


この男の結論 は、/etc/profileが常に読み取られるということです。

要約表を読む:対話型と非対話型の両方のログインシェルが/etc/profileを読み取る


そして、もし このページの例 が正しい場合:

Some examples

$ su bob                   # interactive non-login Shell
$ su - bob                 # interactive login Shell
$ exec su - bob            # interactive login Shell
$ exec su - bob -c 'env'   # non-interactive login Shell
$ ssh [email protected]      # interactive login Shell, `~/.profile`
$ ssh [email protected] env  # non-interactive non-login Shell, `~/.bashrc`

exec su - bob -c 'env'のテストは、/etc/profileが読み取られたことを報告します。


要するに:

非対話型ログインシェル(--loginまたは-lで呼び出されない)を持つことは可能ですか?

そして、trueの場合、それは/etc/profileファイルを読み取っていますか?

上記が当てはまる場合、[〜#〜] all [〜#〜]ログインシェル[対話型(または非対話型)]読み取り/ etc/profile(--noprofileオプションなし)。

注:/ etc/profileが読み取られていることを検出するには、ファイルの先頭に次のコマンドを追加するだけです。

echo "'/etc/profile' is being read"
11
user184899

非インタラクティブログインシェルは珍しいですが、可能です。 0番目の引数(通常は実行可能ファイルの名前)を-で始まる文字列に設定してシェルを起動すると、対話型かどうかに関係なく、ログインシェルになります。

$ ln -s /bin/bash ./-bash
$ echo 'shopt -p login_Shell; echo $-' | HOME=/none PATH=.:$PATH -bash
shopt -s login_Shell
hB

シェルがログインシェルであることを通知しないため、bash -c date -bashは失敗しました。0番目の引数はbashであり、-bashではありません。 bashが開始されると、変数$0が0番目の引数ではなく-bashに設定されますが、重要なのは0番目の引数です。

su -lまたはsu -を使用して非対話型ログインシェルを実行できますが、認証されている間は標準入力が端末にならないようにする必要があります(パスワードを入力したり、パスワードを入力の最初に置くため)。 Sudoを使用すると簡単な場合があります。Sudo trueを実行してプレゼンス資格情報を取得してから、資格情報がまだ有効な間にecho 'shopt -p login_Shell; echo $-' | Sudo -iを実行します。

参照 ログインシェルと非ログインシェルの違いは?

次のようなグラフィカルログイン環境を見てきました。

exec "$Shell" -l -c 'exec start-window-or-session-manager'

または同等のもの:

exec -a "-$Shell" "$Shell" <<EOF
exec start-window-or-session-manager
EOF

そのため、セッション初期化ファイル(Bourneのようなシェルの~/.profileなど(一部の場合は/etcの対応するもの)など)を読み取って適用します。

最初のものはすべてのシェルで動作するわけではありません。 -lは多数のシェルでサポートされていますが、すべてではありません。また、csh/tcshなど、-cでは使用できないシェルもあります。 argv[0]の最初の文字が-であることは、すべてのシェルで認識されます。これは、loginがシェルにログインシェルであることを伝えるために使用されるためです。

2番目のケースでは、そのシェルのstdinはttyデバイス以外のものです(<<は一時的な通常のファイル、またはシェルに応じてパイプによって実装されます)。したがって、シェルはそうではありません。インタラクティブ(人間が対話するときのインタラクティブな存在の定義)。

4

はい、非対話型のログインシェルが可能です

$ head -1 /etc/profile
echo PROFILE BEING READ

$ echo echo hello | su -
PROFILE BEING READ
stdin: is not a tty
hello

$
3
Stephen Harris

非対話型ログインシェル(--loginまたは-lで呼び出されない)を持つことは可能ですか?

はい

$ (exec -a '-' bash -c 'shopt -q login_Shell && echo login Shell')

ただし、/etc/profile引数を指定しない限り、--loginは非対話型ログインシェルには使用されないことに注意してください。

非対話型ログインシェルを呼び出す一般的なイディオムは次のとおりです。

$ su - someuser -c somecommand

しかし、これには/etc/profileが実行されないという事実があります。

この動作を変更することは可能ですが、 config-top.h にあるオプションのコメントを解除することにより、コンパイル時にBashソースコードをカスタマイズする必要があります。

/* Define this to make non-interactive shells begun with argv[0][0] == '-'
run the startup files when not in posix mode. */
/* #define NON_INTERACTIVE_LOGIN_SHELLS */

このsu異常を調査した のとき、zshdashを含む他のシェルにはこの不一致がないことがわかりました。

0
starfry