如何基于ssh主机名自动更改终端背景?


9

如何根据ssh所使用的主机名来编程地更改终端窗口的背景颜色?

例如,当我投入生产硬件中的实时嵌入式系统时,我希望终端背景变为红色-以“保持对我所使用服务器的了解”。仅在PS1中拥有主机名并不总是足够的。

我正在使用gnome-terminal,但是可以接受Linux下任何可行的解决方案。

Answers:


7

您可以使用ssh LocalCommand发出ANSI转义序列来更改背景颜色,并且每个主机都有一个部分(或主机模式)以选择要与远程主机对应的适当颜色。

如果您的生产服务器遵循“以产品开始”这样的命名约定,则可以在〜/ .ssh / config文件中尝试以下代码段: Host prod* PermitLocalCommand yes LocalCommand printf "\x1b[41m\x1b[2JPRODUCTION SYSTEM [%n]\n\n"

如果没有方便的命名约定来使用通配符模式,则只需列出主机名并用空格分隔即可。您还可以为其他各种非生产服务器创建具有不同颜色值和字符串的其他主机块。

连接到与模式匹配的主机后,将在本地执行相应的printf,将背景色更改为红色([41m选择红色作为背景色,[2J部分用更新的背景色重新绘制整个屏幕。请参见https://en.wikipedia.org/wiki/ANSI_escape_code提供更多选择)

这种方法最大的麻烦在于,背景颜色在ssh会话退出时仍然存在。没有与LocalCommand相对的对象可以在断开连接上运行(我知道)。ssh的别名或外壳包装脚本可以printf "\x1b[0m"作为重置调用。另一方面,通过LocalCommand设置背景颜色意味着即使未通过包装脚本或别名运行ssh,也将获得颜色设置。


优秀答案!我看到的唯一一个问题(但是很重要的一个问题)是颜色变化仅保留在第一个“屏幕”上。输入命令后,屏幕就会向上滚动,从红色变回黑色。也许gnome终端颜色控制覆盖了ANSI转义序列?您知道解决方法吗?
Mtl Dev

是否可以对SSH主机上的PS1提示变量执行类似的操作?
Mtl Dev

重置可能是由于PS1提示变量中的序列引起的,也可能是由于您使用了ls别名等命令,ls --color=auto并且其中包括重置序列'<ESC> [0m'”。要坚持这一点,您可能需要设置不同的gnome-terminal配置文件,并使用包装器脚本路线,根据主机名选择配置文件名称,然后调用gnome-terminal --profile=$PROFILE_NAME -e ssh $HOST &
PKapp

完全正确:如果ls --colourPS1中有OR重置序列,则任何一个都将覆盖以前的ansi颜色设置。因此,我将着眼于实现您提出的包装脚本解决方案,这也是一个好主意!谢谢!
Mtl Dev

只是让其他人知道:将printf添加到〜/ .ssh / config似乎破坏了rsync。相关细节在这里:serverfault.com/questions/267154/...
物料间接开发
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.