$ BASH_ENV通常在哪里设置?

我有两台应该configuration相同的Linux服务器,但是对其中一台服务器的ssh命令无法执行需要在〜/ .bashrc中指定的path的命令。 例如,我可以通过交互方式和通过ssh使用像pwd这样的命令,但是如果我尝试运行位于应用程序bin文件夹中的程序,它只能在其中一台服务器的交互式shell中运行。

两个服务器上的/ etc / profile和/ etc / environment文件是相同的,但是$ BASH_ENV在正常工作的服务器上设置为〜/ .bashrc。 我想在不工作的服务器上设置$ BASH_ENV,但是我希望将它设置在工作服务器中设置的相同位置。 Linux在非交互式login时将运行的地方是什么,例如来自另一台计算机的ssh命令?

编辑:用户在/ etc / passwd中的行在两台服务器上指定/ bin / bash。 两个服务器的〜/ .bash_profile文件是相同的,并且包含if [ -f ~/.bashrc ]; then . ~/.bashrc; fi if [ -f ~/.bashrc ]; then . ~/.bashrc; fi if [ -f ~/.bashrc ]; then . ~/.bashrc; fi 。 系统之间的唯一区别是$ BASH_ENV是服务器上的一个空string不工作,我找不到它在工作的服务器上设置的位置。

编辑2:两台服务器上的〜/ .ssh / environment文件都有BASH_ENV =〜/ .bashrc

BASH_ENV只能通过环境或在初始化期间产生的另一个脚本来设置。 对于一个非交互式的shell,如果这个shell也是一个loginshell,它只会试图获得额外的文件。 (在这种情况下,它会读取~/.bash_profile~/.bash_login~/.profile …但是如果这样做的话,你将不会遇到问题)

首先要看的是子shell被调用的环境。

  • 导出的BASH_ENVvariables将被传递。 请记住,这可能会被埋在一个源文件中。
  • 它可以在调用脚本的同一行上作为参数input,即BASH_ENV=blah /path/to/somecommand.sh 。 这就像一个拇指疼痛,所以你可能会抓住它。

如果在login后设置,但无法确定在哪里,则可能需要查看构buildlogin环境的责任。

  • 所有通常由loginshell获取的文件。 man bash的详尽列表。

  • PAM :正如freiheit在注释中提到的那样,请检查/etc/security/pam_env.conf以及pam_env.so引用的其他文件。 其他PAM模块也可能是负责任的,但是如果你的PAMconfiguration看起来相同的话,情况可能不是这样。

  • sshd :它将按顺序扫描以下文件:

    • ~/.ssh/environment (在更改到主目录之前;只有在sshd_config启用PermitUserEnvironment
    • ~/.ssh/rc (转换到主目录之后;总是)
    • /etc/ssh/sshrc (如果~/.ssh/rc不存在)

注意: sshd也将扫描用户的授权密钥文件中的environment=value行(如果启用了PermitUserEnvironment ),但是从该页面的下一个顺序的手册页不清楚。