我正在为一个特殊设备制作一个 SSH 客户端,它的键盘上没有全键,我的问题是 Esc、Alt、Ctrl 和箭头键是如何在发送到 shell 的字符串中编码的?它只是'\033'吗?
我知道 Enter 键的行为,它给出了一个 ^M,来自 here
但是当我按 Ctrl+v 然后 Ctrl 什么都没有出现时,当我在终端按 Ctrl+v 然后 Ctrl+c 我得到: ^C ,那么 Ctrl 只是 ^ 吗?
但是alt呢
此外,我发现:
左^[[D
对^[[C
向上^[[一个
下^[[B
我可以把这些命令写成 command
下面,到 libssh:
rc = libssh2_channel_write(self.channel, [command UTF8String], strlen([command UTF8String])))
问题是我从 ssh 得到以下响应: zsh: 在我的 mac 上的 bash 和我的 SSH 程序中替换失败:
-bash: :s^[^C: substitution failed
最佳答案
key 序列编码取决于终端设备。每个终端设备可以组成自己的编码。 Linux 控制台、xterm、GNU screen、gnome-terminal、konsole、vt220 等都具有不同(但相似)的功能和 key 编码。
如果您需要知道特定终端设备的键序列的编码,那么您应该查询 terminfo TERM
的数据库你对。。。感兴趣。
终端可能会模拟类似于 ECMA-48 的东西。 ,所以它是一个起点。但是,不要将 ECMA-48 硬编码到您的应用程序中;有些用户可能会使用不同的终端——尤其是如果他们在使用您的应用程序 ssh 出之前先 ssh 入系统。
见ncurses网站获取更多文档。
如果您尝试创建自己的终端设备(例如,在终端上模拟用户按键),那么您可以选择所需的编码。要使其正常工作,您必须确保终端设备的 key 编码在远程系统的 terminfo 数据库中,并且 TERM
环境变量设置正确。为了最大限度地减少您需要做的工作,您最好模拟现有的流行终端,例如 GNU screen 或 vt220。要获取他们的 key 编码,请查看他们的 terminfo 数据库条目。
关于shell - Esc、Alt、Ctrl 和箭头键如何在 ssh/shell 中编码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17431836/