通过 SSH 会话检测 iTerm2 终端?

问题描述 投票:0回答:1

如果我的会话通过 SSH 运行,我想向 iTerm2 发送一些专有转义(以覆盖当前颜色配置文件中的背景颜色)。

为了在使用其他终端时不搞砸终端或打印垃圾,我想检测终端是否真的是iTerm2。 根据网上找到的信息[1],可以检查

ITERM_SESSION_ID
环境变量。然而,这个变量是为本地会话设置的,而不是在 SSH 连接到另一台机器时设置的。

我的想法是在我的 .zshrc 中放入如下内容(我在所有机器上使用相同的 .zshrc):

if [ -n "$SSH_CLIENT" ] || [ -n "$SSH_TTY" ]; then

    # we are running over SSH...

    if [ -n "$ITERM_SESSION_ID" ]; then
        # change terminal bg color:
        # (can do more advanced stuff to better identify the remote machine)

        echo -e '\e]1337;SetColors=bg=525\a'
    fi
fi

但是,鉴于变量

ITERM_SESSION_ID
在 SSHing 时被重置,它不会工作。

我需要分别在 ssh 客户端/服务器上设置

SendEnv
/
AcceptEnv
,但这似乎是个坏主意。

任何其他方式来实现类似的结果(仅在支持时使用专有转义?)?

或者我不应该关心那些是否不受支持?

1:https://groups.google.com/g/iterm2-discuss/c/MpOWDIn6QTs?pli=1

shell ssh iterm2
1个回答
0
投票

VT100 类终端可以设置为在接收到 ENQ 字符(Ctrl-E,ASCII 005)时发送识别字符串。这几乎包括您可能使用的任何现代终端——PuTTY、XTerm、iTerm2 等等。此功能有时称为“应答”。

在 iTerm2 的情况下,回复功能在here中被简要记录。您可以在“终端”选项卡上配置应答字符串:

iTerm2 的默认回复是一个空字符串,所以你必须在你的配置文件中更改它。这样做的好处是您可以在配置文件中放置任何您喜欢的内容,并且可以针对不同的目的使用不同的回复。

https://unix.stackexchange.com/ 上的这篇文章 更详细地讨论了该功能,包括您可能希望从其他终端获得什么以及如何在脚本中可靠地读取字符串。简而言之,建议之一是运行此命令:

stty raw min 0 time 5; echo -ne '\005' && read -s; stty cooked; echo -n "${REPLY}"

将发送 ENQ 字符并等待一小段时间让客户端响应。客户端可能不发送任何内容,或者其响应可能不会以换行符终止。

© www.soinside.com 2019 - 2024. All rights reserved.