1

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

我知道Enter密钥的行为方式,它从这里给出 ^M

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

但是关于alt

此外,我发现:

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

我可以将这些命令command如下写到 libssh:

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

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

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

4

1 回答 1

2

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

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

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

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

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

于 2013-07-04T17:58:56.413 回答