Bash

為什麼 bash 在通過 ssh 工作時以非互動模式獲取 .bashrc?

  • May 17, 2020

我有一個使用 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 的啟動文件很奇怪。

引用自:https://unix.stackexchange.com/questions/587207