根据远程主机名更改 tmux 窗格的背景颜色

Sco*_*les 4 linux ssh tmux iterm2

如果我在单个窗格中从 tmux ssh 到远程服务器,是否可以根据服务器名称更改窗格的背景颜色?

假设我所有的产品服务器都以 开头prod_XYZ,开发服务器以 开头dev_XYZ.如果我 ssh 到这两个服务器,我可以根据我所在的服务器类型对它们进行不同的着色吗?也就是说,基于服务器前缀?

Kam*_*ski 7

如果我通过 ssh 连接到这两台服务器,我可以根据我所在的服务器类型为它们设置不同的颜色吗?

是的。

我的基本解决方案需要一个包装器ssh(这可能是一个 shell 函数或一个脚本),以及一个额外的帮助程序脚本。


包装函数应该是这样的:

ssh() {
  helper="$HOME/bin/_ssh_tmux_background"
  command ssh \
    -o PermitLocalCommand=yes \
    -o LocalCommand="'$helper' '%h'" \
    "$@"
  "$helper"
}
Run Code Online (Sandbox Code Playgroud)

这是帮助程序脚本:

#/bin/sh

[ -z "$TMUX_PANE" ] && exit
style=default
case "$1" in
    prod_* )
        style='bg=red'
        ;;
    dev_* )
        style='bg=blue'
        ;;
esac   
tmux select-pane -P "$style" -t "$TMUX_PANE"
Run Code Online (Sandbox Code Playgroud)

保存$helper函数指向的脚本($HOME/bin/_ssh_tmux_background在我的代码中),使其可执行。

现在,如果您调用,该函数将运行带有两个附加选项的ssh实际命令:和(有关详细信息,请参阅)。这样,您一登录到远程主机,就可以使用远程主机名作为唯一参数来运行帮助程序脚本。sshPermitLocalCommandLocalCommandman 5 ssh_config

如果您处于tmux,脚本将继承TMUX_PANE环境变量。如果在 之外,脚本将立即退出tmux,因此即使您在没有 的情况下使用该函数,它也不会干扰tmux

该脚本将远程主机名与您的前缀进行匹配,并为tmux. 您不限于case,您可以按照您想要的任何方式构建逻辑(包括与 匹配的正则表达式[[,但您需要bash更改 shebang)。最后应用样式。

退出后ssh,该函数将不带参数调用脚本。"$1"计算结果为一个空字符串,与我们的任何模式都不匹配,因此默认样式default被传递给tmux.


请注意,您可以在或 in 中指定PermitLocalCommandand 。不过,您无法如此轻松地摆脱包装器,因为您需要在退出后再次更改背景颜色。LocalCommand/etc/ssh/ssh_config~/.ssh/configssh

仍然可能需要无包装解决方案。想象一个脚本(用 调用LocalCommand)检索其父级(ssh的)PID,分叉到后台(如此ssh继续),监视 PID 并在退出tmux后恢复设置ssh。此类脚本可能会保存窗格的原始样式(无论它是什么),并在以后恢复它,而不是使用该default样式。

我们开始做吧。这是我的尝试:

#/bin/sh

[ -z "$TMUX_PANE" ] && exit
[ "$#" -eq 1 ] || exit 1

newstyle="$1"
oldstyle="$(tmux select-pane -g -t "$TMUX_PANE")"

tmux select-pane -P "$newstyle" -t "$TMUX_PANE"

( tail --pid="$PPID" -f /dev/null
  tmux select-pane -P "$oldstyle" -t "$TMUX_PANE" ) &
Run Code Online (Sandbox Code Playgroud)

新脚本(例如$HOME/bin/_ssh_tmux_style)也应该是可执行的。它使用的tail --pid是不可移植的;请参阅此问题以获取替代方法。

现在我们不需要旧的包装函数(因此启动一个新的 shell 或unset -f ssh)。我们所需要的只是~/.ssh/config. 记得man 5 ssh_config说:

由于使用每个参数的第一个获得的值,因此应在文件开头附近给出更多特定于主机的声明,并在末尾给出一般默认值。

考虑到这一点,将以下内容放在您的正确位置~/.ssh/config

Host prod_*
PermitLocalCommand=yes
LocalCommand="$HOME/bin/_ssh_tmux_style" 'bg=red'

Host dev_*
PermitLocalCommand=yes
LocalCommand="$HOME/bin/_ssh_tmux_style" 'bg=blue'
Run Code Online (Sandbox Code Playgroud)

双引号很重要。请注意,整个附加配置(样式)现在已嵌入到ssh. 让你的$PATH容器$HOME/bin变得更好:

LocalCommand=_ssh_tmux_style 'bg=red'
Run Code Online (Sandbox Code Playgroud)

我觉得它很优雅。