我发现 Linux 和 FreeBSD 上的 ssh 行为存在无法解释的差异,而根据手册页的简单语言,我预计 FreeBSD 的行为正是如此。因此,Linux 上发生了一些额外的事情,但我不知道是什么。
我在所有系统(包括 Linux 和 BSD)上都使用 bash 作为我的常规登录 shell。通过涉及 bash 启动文件的复杂多阶段设置,我为所有 bash 版本(无论是“登录”还是“交互式”shell,从 bash 手册页开头所说明的技术意义上讲)设置了环境变量。
现在,不同之处在于:当我使用命令ssh 进入 FreeBSD 服务器时,例如ssh freebsd-host printenv
,这些变量未设置。经过一番思考,这是我应该预料到的,因为在这种情况下 shell 既不是登录也不是交互的。但是,当我以同样的方式 ssh 进入Linux主机时,变量实际上已经设置了——这是一个明确的信号,表明.bash_profile
或.bashrc
文件已经以某种方式被理解了,尽管 shell 的状态为非。
我的问题当然是,为什么 Linux 会这样表现?是什么让 bash 启动在这种情况下运行?所有 sshd 配置都完全相同,并且接近上游默认值,包括PermitUserEnvironment=no
。如果重要的话,所有 Linux 都是 Debian 的变体。
一个额外的轶事:当我阅读一些手册页时,我偶然发现了这一点ssh -t host man man
,我发现远程 Linux 上没有什么不寻常的,但在远程 FreeBSD 上,手册页却变得非常狭窄——因为我的普遍设置MANWIDTH=100
不存在。
不同之处在于,Debian 在编译 Bash 时
SSH_SOURCE_BASHRC
启用了该功能,而FreeBSD 显然没有。启用此功能的 Bash 版本将另外获取 ~/.bashrc(和系统 bashrc),即使它们是非登录和非交互的,只要它们找到由 sshd 设置的 $SSH_CLIENT 变量(并检测到它们尚未在本应这样做的父 shell 下运行)。