web-dev-qa-db-ja.com

sshを介して作業しているときに、bashが.bashrcを非インタラクティブモードで調達するのはなぜですか?

CentOS VMにSSHを使用してログインしています。.bashrcに次の行を追加しました

echo "from ~/.bashrc: (pid $$)"

.bash_profileへの次の行

echo "from ~/.bash_profile"

VM=にログインしてpsを実行すると、次の出力が表示されます

user@laptop:~ $ ssh vmcentos
Last login: Sun May 17 04:48:24 2020 from 192.168.122.1
from ~/.bashrc: (pid 1821)
from ~/.bash_profile
[admin@localhost ~]$ ps -H -o pid,command
  PID COMMAND
 1821 -bash
 1844   ps -H -o pid,command
[admin@localhost ~]$

私がログインするシェルは対話型ログインシェルであり、.bash_profileファイルが提供され、.bashrcファイルが提供されるため、この出力は期待どおりです。

VMからログアウトし、次のコマンドを実行します

user@laptop:~ $ ssh vmcentos 'sleep 60; echo $-'
from ~/.bashrc: (pid 1901)
hBc
user@laptop:~ $

次に、VM=で別のSSHセッションにログインし、プロセステーブルを検査します

[admin@localhost ~]$ ps -eH -o pid,command
  PID COMMAND
(... more output here...)
 1900       sshd: admin@notty
 1901         bash -c sleep 60; echo $-
 1914           sleep 60
(... more output here...)

私が理解している限り、sshが実行するシェル(プロセス1901)は非対話型です(-cオプションのため、また$-変数にi文字が含まれていないため) -login(ARGV0-bashではなく、--loginオプションが提供されていないため)したがって、.bashrc.bash_profileも供給されるべきではありません。しかし、コマンドの出力は、.bashrcがソースであることを明確に示しています。どうして?

標準のopenssh構成の標準のCentOSインストールを使用しました。

2
eciii

マニュアルによると、それを行うことが想定されています

Bashは、リモート接続デーモン(通常はrshd)またはセキュアシェルデーモンsshdによって実行される場合と同様に、標準入力がネットワーク接続に接続された状態で実行されているかどうかを判断しようとします。この方法で実行されているとBashが判断した場合、そのファイルが存在し、読み取り可能であれば、~/.bashrcからコマンドを読み取って実行します。

Bashのスタートアップファイルは奇妙です。

2
ilkkachu