如果我从单个窗格中的 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
运行实际命令:和(有关详细信息,请参阅)。这样,只要您登录到远程主机,就可以使用远程主机名作为唯一参数运行辅助脚本。ssh
PermitLocalCommand
LocalCommand
man 5 ssh_config
如果您在 中tmux
,脚本将继承TMUX_PANE
环境变量。如果在 之外,脚本将立即退出tmux
,因此即使您在没有 的情况下使用该函数也不会受到干扰tmux
。
该脚本将远程主机名与您的前缀进行匹配,并为 挑选所需的样式tmux
。您不限于case
,您可以以任何您想要的方式构建逻辑(包括使用 进行正则表达式匹配[[
,但您需要bash
更改 shebang)。最后应用样式。
退出后ssh
,函数将调用不带参数的脚本。"$1"
计算结果为空字符串,与任何模式都不匹配,因此将的默认样式default
传递给tmux
。
注意,您可以在 中或在 中指定PermitLocalCommand
和。但是,您无法轻易摆脱包装器,因为您需要在退出后再次更改背景颜色。LocalCommand
/etc/ssh/ssh_config
~/.ssh/config
ssh
仍然可能需要一个无包装的解决方案。想象一个脚本(用 调用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'
我发现它非常优雅。