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

标签 shell ssh libssh2 ansi-escape

我正在为一个特殊设备制作一个 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/

相关文章:

python - 使用 Python Paramiko 通过 SCP 在两个远程 Linux 服务器之间复制文件

c - libssh2 和终端模式编码

Bash - 一个脚本的两个进程

mysql - 具有模糊重定向错误的 Shellscript

unix - ssh-copy-id 未找到身份错误

windows - svn+ssh结账慢

php - 未定义ssh2在PHP中与Debian上的apache

c++ - 尝试为 sshlib2 构建conf并收到错误

linux - 使用 ls 递归打印完整目录树的 Shell 脚本

shell - AWK:在每一行上执行 CURL 并解析结果