【问题标题】:How is Esc,Alt,Ctrl and arrow keys encoded in ssh/shellEsc、Alt、Ctrl 和箭头键如何在 ssh/shell 中编码
【发布时间】:2013-06-30 04:32:51
【问题描述】:

我正在为一个特殊设备制作一个 SSH 客户端,它的键盘上没有全键,我的问题是 Esc、Alt、Ctrl 和箭头键是如何在发送到 shell 的字符串中编码的?只是'\033'吗?

我知道 Enter 键的行为方式,它给出了一个 ^M,来自here

但是当我按下 Ctrl+v 然后 Ctrl 什么都没有出现,当我按下 Ctrl+v 然后 Ctrl+c 在终端我得到: ^C ,所以 Ctrl 只是 ^ ?

但是 alt

我发现了更多:

左 ^[[D 右 ^[[C
上 ^[[A 向下 ^[[B

我可以把这些命令写成下面的command 到 libssh:

rc = libssh2_channel_write(self.channel, [command UTF8String], strlen([command UTF8String])))

问题是我从 ssh 得到以下响应:zsh: 在我的 mac 上的 bash 和我的 SSH 程序中替换失败:

-bash: :s^[^C: 替换失败

【问题讨论】:

  • 取决于终端。
  • Libssh2 通过 shell 连接到 linux

标签: shell ssh libssh2 ansi-escape


【解决方案1】:

键序列编码取决于终端设备。每个终端设备可以组成自己的编码。 Linux 控制台、xterm、GNU screen、gnome-terminal、konsole、vt220 等都有不同(但相似)的功能和密钥编码。

如果您需要知道特定终端设备的键序列的编码,则应在terminfo 数据库中查询您感兴趣的TERM。

终端可能会模拟类似于ECMA-48 的东西,因此它是一个起点。但是,不要将 ECMA-48 硬编码到您的应用程序中;一些用户可能会使用不同的终端,尤其是如果他们在使用您的应用程序 ssh 出之前先 ssh 进入系统。

有关更多文档,请参阅ncurses 网站。

如果您尝试创建自己的终端设备(例如,在终端上模拟用户按键),那么您可以选择所需的编码。要使其正常工作,您必须确保终端设备的密钥编码在远程系统的 terminfo 数据库中,并且 TERM 环境变量设置正确。为了尽量减少您需要做的工作,您最好模拟现有的流行终端,例如 GNU screen 或 vt220。要获取它们的密钥编码,请查看它们的 terminfo 数据库条目。

【讨论】:

    猜你喜欢
    • 2011-03-28
    • 2016-07-28
    • 2012-01-04
    • 2011-03-13
    • 1970-01-01
    • 1970-01-01
    • 2011-01-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多