Scott Skiles Asked: 2019-07-25 07:54:19 +0800 CST2019-07-25 07:54:19 +0800 CST 2019-07-25 07:54:19 +0800 CST 根据远程主机名更改 tmux 窗格的背景颜色 772 如果我在单个窗格中从 tmux ssh 进入远程服务器,是否可以根据服务器名称更改窗格的背景颜色? 假设我所有的生产服务器都以开头,prod_XYZ而开发服务器以开头dev_XYZ.如果我通过 ssh 进入这两个服务器,我可以根据我所在的服务器类型为它们涂上不同的颜色吗?也就是说,基于服务器前缀? ssh linux 1 个回答 Voted Best Answer Kamil Maciorowski 2019-08-10T19:10:41+08:002019-08-10T19:10:41+08:00 如果我通过 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. 请注意,您可以指定PermitLocalCommandand LocalCommandin/etc/ssh/ssh_config或 in ~/.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' 我觉得它很优雅。
是的。
基本解决方案需要一个包装器
ssh
(这可能是一个 shell 函数或一个脚本),以及额外的帮助脚本。包装函数应该是这样的:
这是帮助脚本:
将脚本保存
$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
andLocalCommand
in/etc/ssh/ssh_config
或 in~/.ssh/config
。但是,您不能轻易摆脱包装器,因为您需要在ssh
退出后再次更改背景颜色。仍然可能需要无包装解决方案。想象一个脚本(用 调用
LocalCommand
)检索其父级的 (ssh
的) PID,分叉到后台(如此ssh
继续),监控 PID 并在退出tmux
后恢复设置。ssh
这样的脚本可能会保存窗格的原始样式,无论它是什么,并在以后恢复它,而不是使用default
样式。我们开始做吧。这是我的尝试:
新脚本(比如
$HOME/bin/_ssh_tmux_style
)也应该是可执行的。它使用tail --pid
的是不可移植的;请参阅此问题以了解替代方法。现在我们不需要旧的包装函数(所以启动一个新的 shell 或
unset -f ssh
)。我们需要的是~/.ssh/config
。记得man 5 ssh_config
说:考虑到这一点,请将以下内容放在您的正确位置
~/.ssh/config
:双引号很重要。请注意,整个附加配置(样式)现在已嵌入到
ssh
. 让你的$PATH
容器$HOME/bin
变得更好:我觉得它很优雅。