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


11

このフローチャートの解釈

ここに画像の説明を入力してください

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

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

これは、対話型ログインシェルが/etc/profile(--noprofileなしで)読み取ることを示しています

また、オプションreadを持つ非インタラクティブシェル--login/etc/profile

これは、非インタラクティブ(スクリプトを実行する、おそらくのように単純な)で(ソース)を読み取れない可能性がある一部のログインシェル(で$0始まる-)を残すようです。date/etc/profile

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

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

のようなものを呼び出す

$ 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はa -であり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 bob@example.com      # interactive login shell, `~/.profile`
$ ssh bob@example.com env  # non-interactive non-login shell, `~/.bashrc`

読み込まれたexec su - bob -c 'env'レポートのテスト/etc/profile


要するに:

それが持っていることが可能である非対話型ログイン(または-l --loginで呼び出されていない)シェルを?

そして本当なら、それは/etc/profileファイルを読んでいますか?

上記が当てはまる場合、すべてのログインシェルが[対話型(または非対話型)]で/ etc / profile(--noprofileオプションなし)を読み取ると結論付ける必要があります。

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

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

回答:


2

非対話型ログインシェルは珍しいですが、可能です。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-bash0番目の引数の代わりに設定しますが、0番目の引数が重要です。

su -lまたはを使用して非対話型ログインシェルを実行できますが、su -認証されている間は標準入力が端末にならないように調整する必要があります(パスワードを入力する必要はありません。入力)。sudo:run sudo trueを実行すると、プレゼンス資格情報を取得できます。その後、資格情報はまだ有効ですecho 'shopt -p login_shell; echo $-' | sudo -i

ログインシェルと非ログインシェルの違いも参照してください


4

私は以下を行うグラフィカルログイン環境を見てきました:

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

または同等のもの:

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

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

最初のものはすべてのシェルで動作するわけではありません。-lシェルの多くでサポートされ、すべてではない、といくつかの上に、同様にされてcsh/ tcsh、一緒に使用することはできません-c。最初の文字argv[0]であることは、-それが何だとして、かかわらず、すべてのシェルに理解されているlogin、彼らはログインシェルです殻を伝えるために使用しています。

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


最初の--loginオプションはオプションを使用しています。2番目の場合、exec -a "-bash" "bash" <<<"shopt -p login_shell; echo $0 $-"取得すると(C qoutesにエンコードされて)取得され$'/etc/profile read\nshopt -s login_shell\nbash himBH'ます。これはログインですが、インタラクティブです。ログインと非対話型が必要です。何が欠けているのですか?

@sorontar、 <<<"$-"$-理由は二重引用符の呼び出し元のシェルによって展開されます。呼び出されたシェルは、そのstdinがttyではないため、インタラクティブではありません。
ステファンChazelas

ああ、そうです、あなたは正しいです、サー。しかし、間違いを修正することで、次のことが可能になります。exec -a "-bash" "bash" <<\EOF shopt -p login_shell; echo $0 $- EOFこの確認を取得するには$'/etc/profile read stdin: is not a tty shopt -s login_shell -bash hB'、そうです。そうです、非対話型ログインシェルが可能であり、それでも読み取ります/etc/profile。すべてのログインシェルが読み取ると結論付ける必要があります/etc/profileか?

kshは、非対話型のログインシェルであることを明確にしますexec -a "-ksh" "ksh" <<\EOF echo $0; set -o EOF

1
@sorontar、ログインシェルとして呼び出されたときに、ほとんどのシェル実装がセッション初期化ファイルを読み取ることを期待できると思います。それらがどちらであるかは、シェルの実装とバージョンによって異なります。の場合bash、起動ファイルの処理はかなり混乱したIMOです。一部のシステムでは、より多くのバリエーションを追加するより妥当な動作をするようにパッチを適用していることがわかります。
ステファンChazelas

3

はい、非インタラクティブなログインシェルが可能です

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

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

$

これは、次の簡略化されたものに似ていますsu -c 'echo hello' -。これは、必要なものをテストするために、次のように記述する必要がありsu -c 'echo $0 $-; shopt -p login_shell' -ます$'/etc/profile read \n -su hBc \n shopt -s login_shell'。これにより、ログインの非対話型シェルが実行され、その過程で/ etc / profileが読み取られたことを確認できます。ありがとう。

0

非対話型ログインシェル(--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この矛盾はありませんでした。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.