Bash
為什麼 bash 在通過 ssh 工作時以非互動模式獲取 .bashrc?
我有一個使用 SSH 登錄的 CentOS VM。我將以下行附加到
.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 ~]$
這個輸出是我所期望的,因為我登錄的 shell 是一個互動式登錄 shell,因此
.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 執行的 shell(程序 1901)是非互動式的(因為該
-c
選項,也因為該$-
變數不包含i
字元)和非登錄(因為ARGV0
不是-bash
,也沒有--login
提供選項)。因此,既不.bashrc
也不.bash_profile
應該被採購。然而,該命令的輸出清楚地表明這.bashrc
是有來源的。為什麼?我使用標準
openssh
配置的標準 CentOS 安裝。
Bash 嘗試確定它何時在其標準輸入連接到網路連接的情況下執行,例如由遠端 shell 守護程序(通常
rshd
)或安全 shell 守護程序執行時sshd
。如果 Bash 確定它正在以這種方式執行,它會讀取並執行來自 的命令~/.bashrc
,如果該文件存在並且是可讀的。Bash 的啟動文件很奇怪。