我有一个 CentOS 虚拟机,我使用 SSH 登录。我将以下行附加到.bashrc
echo "from ~/.bashrc: (pid $$)"
和以下行.bash_profile
echo "from ~/.bash_profile"
当我登录虚拟机并运行时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
。
现在我从虚拟机注销并执行以下命令
user@laptop:~ $ ssh vmcentos 'sleep 60; echo $-'
from ~/.bashrc: (pid 1901)
hBc
user@laptop:~ $
然后我登录到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
的来源。为什么?
我使用标准 CentOS 安装和标准openssh
配置。
答案1
Bash 尝试确定它何时使用连接到网络连接的标准输入运行,例如何时由远程 shell 守护程序(通常为
rshd
)或安全 shell 守护程序执行sshd
。如果 Bash 确定它正在以这种方式运行,那么它会从 读取并执行命令~/.bashrc
(如果该文件存在并且可读)。
Bash 的启动文件很奇怪。