Ara*_*anu 5 ssh terminal bash bashrc .bash-profile
我将我的环境设置为.profile
. 我的.profile
是幂等的,,,.bash_profile
所有的源码。这样,无论我使用哪种 bourne 兼容 shell,也无论 shell 是交互式 shell 还是登录 shell,我总是获得相同的环境。.bashrc
.kshrc
.zshrc
.profile
这也适用于非交互式ssh(1)
使用,尽管我不确定到底为什么。
iridium:aram$ ssh sunos.mgk.ro 'env|grep ^PATH'
PATH=.:/home/aram/bin:/home/aram/bin/sunos:/home/aram/bin/sunos/amd64:/home/aram/bin/sunos/386:/home/aram/go/bin:/opt/local/bin:/opt/local/sbin:/usr/gnu/bin:/usr/bin:/sbin:/usr/sbin:/usr/sfw/bin:/usr/local/bin:/usr/local/sbin:/home/aram/plan9/bin
iridium:aram$ ssh iridium 'env|grep ^PATH'
PATH=.:/Users/aram/bin:/Users/aram/bin/darwin:/Users/aram/bin/darwin/amd64:/Users/aram/bin/darwin/386:/Users/aram/go/bin:/bin:/usr/bin:/sbin:/usr/sbin:/usr/local/bin:/usr/pkg/bin:/usr/pkg/sbin:/usr/local/plan9/bin
iridium:aram$ ssh crimson 'env|grep ^PATH'
PATH=.:/home/aram/bin:/home/aram/bin/linux:/home/aram/bin/linux/amd64:/home/aram/bin/linux/386:/bin:/usr/bin:/sbin:/usr/sbin:/usr/games:/usr/local/bin:/usr/local/sbin
Run Code Online (Sandbox Code Playgroud)
然而,在少数系统上,这不起作用。
iridium:aram$ ssh ci20 'env|grep ^PATH'
PATH=/usr/bin:/bin
Run Code Online (Sandbox Code Playgroud)
我一直在努力使这项工作成功,但没有成功。我努力了:
这些没有任何效果,无论 PAM 设置如何,似乎 /etc/environment 都根本不会被读取。
请不要建议我应该强制 bash 在 ssh 调用中进行交互,或者我应该在 ssh 调用中手动获取环境,我正在尝试解决这里的根本问题。
在尝试调试这个问题时,我学到了一些关于 bash 的知识。如果标准输入是套接字,那么 bash 似乎总是会获取 bashrc,即使它是非交互式 shell。某些 OpenSSH 版本以这种方式启动 bash,但在其他版本中标准输入是管道。bash 中还有一些代码尝试检测它是否在 ssh 会话中启动,在这种情况下,无论交互状态如何,它也会源 bashrc,但在某些情况下,该代码在编译时被禁用。这些事实似乎与我的问题有关,但不清楚如何解决我的问题。
我已经完全明白问题所在了。
sshd 确实应该创建非交互式登录会话,而不是非交互式非登录会话,但事实并非如此。Bash 会非常努力地检测 ssh 的使用情况,如果它认为它是由 sshd 启动的,就会获取 bashrc,无论它是交互的还是登录的。只有 bash 可以做到这一点。因为我一直在使用 bash,所以我一直依赖这种采购行为,尽管它不适用于其他 shell。
它检测 ssh 有两种方法。它检查 stdin 是否是套接字 (1),如果失败,它会查找一些 SSH_ 变量 (2)。最近,openssh 改变了它的工作方式,所以 (1) 永远不会再工作了,因为 stdin 现在是一个管道,而不是一个套接字。(2) 在某些 Linux 发行版中启用,但在其他发行版中禁用。我一直在使用启用它的发行版。
由于 bash 所做的事情很可怕,而且无论如何它都不能可靠地工作,所以我现在在 ~/.ssh/environment 中设置 BASH_ENV,这样现在总是有效的,但不幸的是我现在必须PermitUserEnvironment yes
设置sshd_config
...
另外还不清楚为什么我不能将其设置为/etc/environment
,所以它适用于所有用户。