如何在ssh / shell中编码Esc,Alt,Ctrl和箭头键

时间:2013-07-02 17:17:26

标签: shell ssh libssh2 ansi-escape

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

我知道 Enter 键的行为如何,它从here

给出^ M

但是当我按 Ctrl + v 然后 Ctrl 时,没有任何内容出现,当我按 Ctrl + < kbd> v 然后 Ctrl + c 在teminal我得到:^ C,所以 Ctrl 只是^?

alt

怎么样?

我发现了更多:

left ^ [[D. ^ [[C
up ^ [[A. down ^ [[B

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

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

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

  

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

1 个答案:

答案 0 :(得分:2)

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

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

终端可能会模仿类似ECMA-48的内容,因此它是一个起点。但是,不要将ECMA-48硬编码到您的应用程序中;某些用户可能会使用不同的终端 - 特别是如果他们在使用您的应用程序进行ssh之前进入系统。

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

如果您尝试创建自己的终端设备(例如,模拟用户在终端上按键),则由您自行选择所需的编码。要使其工作,您必须确保终端设备的密钥编码位于远程系统的terminfo数据库中,并且TERM环境变量已正确设置。为了最大限度地减少您需要做的工作,您可能最好仿效现有的流行终端,例如GNU屏幕或vt220。要获取其密钥编码,请参阅其terminfo数据库条目。