非対話型ログインシェルを使用できますか?

非対話型ログインシェルを使用できますか?

通訳するこのフローチャート

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

私は man bash で以下を見つけました。

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

これは次のことを示します。対話型ログインシェルを読む/etc/profile(--noprofileを除く)

返品、非対話型オプション--loginの読み取りを含むシェル/etc/profile

これはいくつかの可能性を残したようです。ログインシェル($0で始まる-非対話型(おそらくこのような単純なスクリプトを実行するとdate)(source)を読み取ることができない可能性があります/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

の最初の文字は$0aです。これは値に-(対話式で)存在しませんが、a(-u)として報告されません。この場合、/etc/profileは読み込まれませんが、これが正しいテストであるかどうかはわかりません。i$-login_shell


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


これこの人の結論常に読み込まれます/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なしで呼び出されます)?

/etc/profiletrueの場合、ファイルを読んでいますか?

上記が本当なら、次のように結論を下さなければなりません。みんなログインシェル[対話型(または非対話型)]は/ etc / profileを読み込みます(--noprofileオプションなし)。

注:/ etc / profileを読んでいることを確認するには、ファイルの先頭に次のコマンドを追加します。

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

答え1

グラフィカルログイン環境が次のことを見てきました。

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<<一時的な汎用ファイルまたはシェル依存パイプとして実装されている)ではないため、シェルは対話型ではありません(対話型の定義は人が対話するときです)。

答え2

はい、非対話型ログインシェルを使用できます。

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

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

$

答え3

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

$ 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ログインシェルであることをシェルに伝えないので、うまくいきません。bash代わりに0番目の引数はです-bash。 Bashが起動すると、変数は0番目の引数ではなく$0に設定されます-bashが、0番目の引数は重要です。

su -l非対話型ログインシェルを使用または実行できますが、標準入力がsu -端末以外のものになるように準備しながら認証を取得できる必要があります(パスワードを入力したり、最初にパスワードを並べ替えたりしないでください)。入力)。 sudo:runを使用して資格情報をインポートし、sudo true資格情報がまだ有効な間実行するのが簡単になることがありますecho 'shopt -p login_shell; echo $-' | sudo -i

また、見ることができますログインシェルと非ログインシェルの違いは何ですか?

答え4

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

はい。

$ (exec -a '-' bash -c 'shopt -q login_shell && echo login shell')

ただし、/etc/profile引数が指定されない限り、非対話型ログインシェルには使用されません。--login

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

$ su - someuser -c somecommand

/etc/profileしかし、これは実装されていないという事実に直面しています。

この動作は変更される可能性がありますが、ソースコード内のオプションのコメントを外してコンパイル時にBashをカスタマイズする必要があります。構成-top.h:

/* 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異常現象を研究しました、私はこの違いを含むかzsh含まdashない他の殻を見つけました。

関連情報