我有两台 Linux 服务器,应该配置相同,但是其中一台服务器的 ssh 命令对于需要在 ~/.bashrc 中指定的路径的命令失败。例如,我可以通过pwd
交互方式和 ssh 使用类似命令,但如果我尝试运行位于应用程序 bin 文件夹中的程序,它只能在其中一台服务器的交互式 shell 中运行。
两台服务器上的 /etc/profile 和 /etc/environment 文件完全相同,但在正常运行的服务器上,$BASH_ENV 设置为 ~/.bashrc。我想在不工作的服务器上设置 $BASH_ENV,但我希望将其设置在与工作服务器相同的位置。在非交互式登录时,Linux 将在哪些位置运行,例如来自另一台计算机的 ssh 命令?
编辑:/etc/passwd 中用户的行在两个服务器上都指定了 /bin/bash。两个服务器的 ~/.bash_profile 文件是相同的,并且包含if [ -f ~/.bashrc ]; then . ~/.bashrc; fi
。系统之间的唯一区别是,在无法正常工作的服务器上,$BASH_ENV 是一个空字符串,而我在正常工作的服务器上找不到它被设置在哪里。
编辑 2:两台服务器上的 ~/.ssh/environment 文件都有 BASH_ENV=~/.bashrc
答案1
BASH_ENV
只能通过环境或初始化期间获取的另一个脚本进行设置。对于非交互式 shell,只有当该 shell 也是登录 shell 时,它才会尝试获取其他文件。(在这种情况下,它会读取~/.bash_profile
、~/.bash_login
和~/.profile
……但如果它这样做,您就不会遇到问题)
首先要查看的是调用子 shell 的环境。
- 导出的
BASH_ENV
变量将被传递。请记住,这可能隐藏在源文件中。 - 它可以作为参数在调用脚本的同一行中输入,即
BASH_ENV=blah /path/to/somecommand.sh
。这很显眼,所以你可能已经注意到了。
如果您登录后设置了它但您无法弄清楚在哪里,则可能需要查看负责构建登录环境的内容。
登录 shell 所获取的所有常用文件。
man bash
以获取详尽列表。聚丙烯酰胺:正如 freiheit 在评论中所建议的那样,请检查
/etc/security/pam_env.conf
以及 所引用的任何其他文件pam_env.so
。其他 PAM 模块也可能是原因,但如果您的 PAM 配置看起来相同,则情况可能并非如此。sshd:它将按顺序扫描以下文件:
~/.ssh/environment
(在更改到主目录之前;仅当PermitUserEnvironment
在中启用时sshd_config
)~/.ssh/rc
(更改到主目录后;总是)/etc/ssh/sshrc
(若不~/.ssh/rc
存在)
注意:sshd
还将扫描environment=value
用户授权密钥文件中的行(如果PermitUserEnvironment
启用),但从手册页中无法清楚了解该步骤在上述序列中的位置。