RHEL 8.5 Bash v4.4.20 和 SSH 调用 .bashrc 两次

RHEL 8.5 Bash v4.4.20 和 SSH 调用 .bashrc 两次

我最近安装了一台运行 RHEL 8.5 的新远程主机。我的其余环境是 RHEL 7.4。当我 ssh 到 RHEL 8.5 主机时,我注意到一件奇怪的事情。看来我的.bashrc被叫了两次。

这是行为:

  • 我使用以下命令从我的网关 ssh 到 RHEL8.5 主机:
    ssh -t user@rhel85host "IAM=peaves CONTROL=simulation bash -i"
    
  • 作为调试器,我将“Hello World”作为我的.bashrc.我得到以下输出
    Hello World
    
    Hello World
    
  • 我尝试删除-iBash 调用中的 ,但行为相同(Hello World两次)。

似乎首先创建了 bash shell,但我传递的两个项目导致 bash 再次被调用。

以前有人处理过这个吗?有关 ssh 登录或 bash 调用的任何提示可以使其不执行此操作并像 RHEL 7.4 一样运行吗?

答案1

通过 SSH 传递命令总是通过 shell 运行它,使用例如/bin/bash -c "the command".这就是 OpenSSH 一直以来的工作方式(我相信,从第一天起,就是为了模仿 rsh)。

可能发生变化的是 RHEL 编译 bash 的方式——出于某种原因,bash 有一个编译时选项-c通过 SSH 连接选项运行时是否加载 .bashrc 。 (是的,它专门检查它是否由 sshd 启动。)Debian 启用此模式; Arch 没有;和它听上去像RHEL 已开始启用它。

无法选择退出第一次调用(除非将用户的登录 shell 更改为 bash 以外的其他 shell),但您可以让 .bashrc 设置一个环境变量,告诉它“已经运行一次”。例如:

if [[ $_BASHRC_RUN ]]; then
    return
fi
export _BASHRC_RUN=1

然而,.bashrc 通常不是执行昂贵的“登录”任务的正确位置 - 这些任务应该放在 .profile 或 .bash_profile 中,而 .bashrc 最多应该只包含别名或环境变量之类的内容。

相关内容