我知道有两万个答案,但没有一个能达到预期的效果,我比你更惊讶,所以请考虑先阅读这个故事。
我正在尝试实现看似基本的事情:PS1
当我从 Mac 通过 SSH 进入 Ubuntu 14.04.1 时,将局部变量发送到 Ubuntu 14.04.1。我知道有两种方法可以做到这一点:
- 使用 /etc/ssh_config 中的 SendEnv 指令,
- 使用 SSH 命令,类似于
ssh host -t "PS1='"$PS1"'; exec bash"
。
这两种方法在其他 SE 答案中都有很好的描述,在 Google 上也有很多结果。但似乎没有一种对我有用。
第一个选项不起作用,我在 Ubuntu 中的 /etc/ssh/sshd_config 中设置了AcceptEnv PS1
和。如果我尝试传递任何其他变量,它会按预期工作。我研究了和,它似乎有很多赋值。它在那里被重新定义了吗?如果是,如何防止这种情况发生?PermitUserEnvironment yes
~/.bashrc
~/.profile
PS1
第二个选项也不起作用,但同样,它可以与任何其他变量名一起使用。如果我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 登录时在远程端进行设置。您已经知道两种方法。注意:
SendEnv
我认为你需要在PS1_ovrrde
你的本地环境中。export PS1_ovrrde="$PS1"
在本地的末尾添加.bashrc
。- 您
exec bash
需要导出PS1_ovrrde
到远程环境:ssh host -t "export PS1_ovrrde=..."
。远程环境中已有的变量不需要再次导出,但在这里您要创建一个全新的变量。