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