将 PS1 环境变量传递到 Ubuntu 进行 SSH 会话的替代方法

将 PS1 环境变量传递到 Ubuntu 进行 SSH 会话的替代方法

我知道有两万个答案,但没有一个能达到预期的效果,我比你更惊讶,所以请考虑先阅读这个故事。

我正在尝试实现看似基本的事情:PS1当我从 Mac 通过 SSH 进入 Ubuntu 14.04.1 时,将局部变量发送到 Ubuntu 14.04.1。我知道有两种方法可以做到这一点:

  1. 使用 /etc/ssh_config 中的 SendEnv 指令,
  2. 使用 SSH 命令,类似于ssh host -t "PS1='"$PS1"'; exec bash"

这两种方法在其他 SE 答案中都有很好的描述,在 Google 上也有很多结果。但似乎没有一种对我有用。

第一个选项不起作用,我在 Ubuntu 中的 /etc/ssh/sshd_config 中设置了AcceptEnv PS1和。如果我尝试传递任何其他变量,它会按预期工作。我研究了和,它似乎有很多赋值。它在那里被重新定义了吗?如果是,如何防止这种情况发生?PermitUserEnvironment yes~/.bashrc~/.profilePS1

第二个选项也不起作用,但同样,它可以与任何其他变量名一起使用。如果我export ABC=123; exec bash在 SSH 登录时执行此操作,我可以ABC在定义的变量中看到,如果我对 执行相同操作PS1,它始终默认为\[\e]0;\u@\h: \w\a\]${debian_chroot:+($debian_chroot)}\u@\h:\w\$。第二个解决方案的另一个问题是,当我运行 时,某些环境变量未加载exec bash,我尝试使用--login--interactive选项,尝试源. ~/.profile. ~/.bashrc,但当我登录时,我没有在登录时获得相同的输出(Ubuntu 横幅和统计数据),变量仍然未定义(我假设别名和其他有用的东西?)。

我想知道如何将本地定义的提示样式设置PS1到最近的 Ubuntu SSH 连接上。在 Ubuntu 上更改 PS1 相关配置不是一种选择,我明确地希望从我的客户端传递配置,所以我不会做二十次同样的事情。

答案1

我查看了它~/.bashrc~/.profile发现它似乎有很多PS1任务。它在那里被重新定义了吗?如果是,如何防止这种情况发生?

bash是的,它被重新定义了。您的两种方法最初都设置了变量,但一旦获取重新定义的任何文件,它就无关紧要了PS1

为了防止这种情况发生

  • 或者让远程bash检测您是否已连接ssh并且在这种情况下不进行更改PS1;这可能需要对这些源文件进行大量更改,而您不想这样做;
  • 或者让遥控器以任何当前的方式bash设置,但覆盖它PS1最后;这似乎是一种更好的方法。

.bashrc在远程机器的末尾添加以下行:

[ -n "$PS1_ovrrde" ] && PS1="$PS1_ovrrde"

现在您要做的就是PS1_ovrrde通过 SSH 登录时在远程端进行设置。您已经知道两种方法。注意:

  1. SendEnv我认为你需要在PS1_ovrrde你的本地环境中。export PS1_ovrrde="$PS1"在本地的末尾添加.bashrc
  2. exec bash需要导出PS1_ovrrde到远程环境:ssh host -t "export PS1_ovrrde=..."。远程环境中已有的变量不需要再次导出,但在这里您要创建一个全新的变量。

相关内容