为什么ssh远程命令读取bashrc文件?
根据一份报告,它说: 当启动非登录shell的交互式shell时,Bash从~/.bashrc读取并执行命令(如果该文件存在) 我做了一个快速测试: 在我的服务器上为什么ssh远程命令读取bashrc文件?,bash,shell,Bash,Shell,根据一份报告,它说: 当启动非登录shell的交互式shell时,Bash从~/.bashrc读取并执行命令(如果该文件存在) 我做了一个快速测试: 在我的服务器上 [USER@MYSERVER ~]$ cat .bashrc ... echo 'I am in a bashrc file of my server' ... 在远程服务器上 # unquoted [USER@REMOTESERVER ~]$ ssh MYSERVER echo $- I am in a bashrc fil
[USER@MYSERVER ~]$ cat .bashrc
...
echo 'I am in a bashrc file of my server'
...
在远程服务器上
# unquoted
[USER@REMOTESERVER ~]$ ssh MYSERVER echo $-
I am in a bashrc file of my server
himBH
#quoted
[USER@REMOTESERVER ~]$ ssh MYSERVER 'echo $-'
I am in a bashrc file of my server
hBc
当命令不带引号时,它似乎在交互式shell中运行,而当带引号时,它似乎在非交互式shell中运行
为什么会这样
并且都读取MYSERVER的bashrc文件,该文件不符合中的规则
任何链接或评论感谢
编辑: 它似乎是一个非登录shell
[USER@REMOTESERVER ~]$ ssh MYSERVER 'shopt -q login_shell && echo 1 || echo 2'
2
远程bash确实不是作为交互式shell启动的(正如我们从
$-
的输出中看到的那样),因此必须从其他方面寻找.bashrc。当然,它是作为登录shell运行的。可能是您有一个~/.bash_配置文件或~.bash_登录名或~/.profile,它显式地来源于.bashrc?,其中说:
由远程shell守护程序调用
Bash试图确定何时在其标准输入连接到网络连接的情况下运行它,就像由远程shell守护程序(通常是rshd)或安全shell守护程序sshd执行一样。如果Bash确定它是以这种方式运行的,那么它将从~/.bashrc读取并执行命令(如果该文件存在且可读)
我错过了这部分
因此,从ssh调用应该读取.bashrc
文件
正如问题的注释所解释的,ssh远程命令是一个非交互式shell。
当命令未被引用时,它似乎在交互式shell中运行,
否,$-
未被引用。。。它在您的计算机上展开,您正在运行一个交互式shell。至于包含.bashc,您的~/.bash\u个人资料、~/.bash\u登录名和~/.profile、
是否阅读了您的.bashrc?@KamilCuk您能详细说明一下吗?ssh HOST command/ssh HOST'command'之间有什么区别?@yoon在执行命令之前,shell会展开(即替换)任何非单引号(或转义)的$
表达式。因此,当您运行ssh MYSERVER echo$-
时,shell首先将$-
扩展为“himBH”,然后运行ssh MYSERVER echo himBH
。因此,远程shell运行的是echo himBH
,而不是echo$-
。另外,按照卡米尔库克的建议检查你的.bash_档案等。@GordonDavisson:对,但我认为这不是重点。如您所见,第二个示例中的$-
显示了远程端的hBc
,从中我们可以得出结论,它不是交互式的(它缺少i
)。在这种情况下,我确实会得出结论,默认情况下,.bashrc
不应来源。这就是我所怀疑的——请参阅我的答案。是的,bash_profile来源于bashrc文件。当我运行ssh MYSERVER'shopt-q login_shell&&echo 1 | | echo 2'
时,会打印2
,因此它似乎不是登录shell。我说得对吗?