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

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

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

假设我所有的生产服务器都以 开头prod_XYZ,而开发服务器以 开头,dev_XYZ.如果我 ssh 进入这两个服务器,我可以根据我所在的服务器类型为它们设置不同的颜色吗?也就是说,根据服务器前缀?

答案1

如果我 ssh 进入这两个服务器,我可以根据我所在的服务器类型为它们设置不同的颜色吗?

是的。

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


包装函数应该是这样的:

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

这是帮助脚本:

#/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"

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

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

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

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

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


注意,您可以在 中或在 中指定PermitLocalCommand和。但是,您无法轻易摆脱包装器,因为您需要在退出后再次更改背景颜色。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" ) &

新脚本(例如$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'

双引号很重要。请注意,整个附加配置(样式)现在嵌入在配置中ssh。让您的$PATH包含$HOME/bin,然后它会变得更好:

LocalCommand=_ssh_tmux_style 'bg=red'

我发现它非常优雅。

相关内容