AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / computer / 问题 / 1463577
Accepted
Scott Skiles
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 1 个回答
  • 1508 Views

1 个回答

  • Voted
  1. 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'
    

    我觉得它很优雅。

    • 4

相关问题

  • 需要 LDAP 身份验证 * 和 * ssh 身份验证

  • 加载密钥“ec256.pem”:尝试从私钥生成公钥时抛出无效格式

  • 如何在域和 Linux 活动目录中启用指纹传感器

  • 如何在CentOS 7 中将Ctrl+C 永久更改为Ctrl+K?

  • 为什么 chown 600 id_rsa 修复权限问题?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    Windows 照片查看器因为内存不足而无法运行?

    • 5 个回答
  • Marko Smith

    支持结束后如何激活 WindowsXP?

    • 6 个回答
  • Marko Smith

    远程桌面间歇性冻结

    • 7 个回答
  • Marko Smith

    Windows 10 服务称为 AarSvc_70f961。它是什么,我该如何禁用它?

    • 2 个回答
  • Marko Smith

    子网掩码 /32 是什么意思?

    • 6 个回答
  • Marko Smith

    鼠标指针在 Windows 中按下的箭头键上移动?

    • 1 个回答
  • Marko Smith

    VirtualBox 无法以 VERR_NEM_VM_CREATE_FAILED 启动

    • 8 个回答
  • Marko Smith

    应用程序不会出现在 MacBook 的摄像头和麦克风隐私设置中

    • 5 个回答
  • Marko Smith

    ssl.SSLCertVerificationError: [SSL: CERTIFICATE_VERIFY_FAILED] 证书验证失败:无法获取本地颁发者证书 (_ssl.c:1056)

    • 4 个回答
  • Marko Smith

    我如何知道 Windows 安装在哪个驱动器上?

    • 6 个回答
  • Martin Hope
    Albin 支持结束后如何激活 WindowsXP? 2019-11-18 03:50:17 +0800 CST
  • Martin Hope
    fixer1234 “HTTPS Everywhere”仍然相关吗? 2019-10-27 18:06:25 +0800 CST
  • Martin Hope
    Kagaratsch Windows 10 删除大量小文件的速度非常慢。有什么办法可以加快速度吗? 2019-09-23 06:05:43 +0800 CST
  • Martin Hope
    andre_ss6 远程桌面间歇性冻结 2019-09-11 12:56:40 +0800 CST
  • Martin Hope
    Riley Carney 为什么在 URL 后面加一个点会删除登录信息? 2019-08-06 10:59:24 +0800 CST
  • Martin Hope
    zdimension 鼠标指针在 Windows 中按下的箭头键上移动? 2019-08-04 06:39:57 +0800 CST
  • Martin Hope
    Inter Sys Ctrl+C 和 Ctrl+V 是如何工作的? 2019-05-15 02:51:21 +0800 CST
  • Martin Hope
    jonsca 我所有的 Firefox 附加组件突然被禁用了,我该如何重新启用它们? 2019-05-04 17:58:52 +0800 CST
  • Martin Hope
    MCK 是否可以使用文本创建二维码? 2019-04-02 06:32:14 +0800 CST
  • Martin Hope
    SoniEx2 更改 git init 默认分支名称 2019-04-01 06:16:56 +0800 CST

热门标签

windows-10 linux windows microsoft-excel networking ubuntu worksheet-function bash command-line hard-drive

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve