我在 vagrant 上运行 CentOS 6.4,然后通过 vagrant SSH 进入盒子。我一直在尝试让退格键正常工作一段时间(如下所述:Centos 终端正确配置 Backspace 和 Ctrl-h)
作为其中的一部分,我试图弄清楚退格键发送的扫描代码是什么,它们与 Ctrl-H 发送的扫描代码是否不同。为此,我尝试按指定使用 showkey -s这里。但这似乎不起作用。这是我以 root 身份执行时在控制台上看到的内容。
[vagrant@localhost ~]$ sudo showkey -s
kb mode was UNICODE
[ if you are trying this under X, it might not work
since the X server is also reading /dev/console ]
press any key (program terminates 10s after last keypress)...
sadfdsdfs[vagrant@localhost ~]$ sadfdsdfs
正如您所看到的,showkey 似乎只是回显我输入的内容,而不是给我扫描代码。有什么想法出了什么问题吗?
答案1
它不起作用,因为showkey
只是打开它测试的第一个特殊设备(来自硬编码列表),而该设备恰好是终端。这是它使用的列表(引用自1.15版本):
static char *conspath[] = {
"/proc/self/fd/0",
"/dev/tty",
"/dev/tty0",
"/dev/vc/0",
"/dev/systty",
"/dev/console",
NULL
};
当您通过 ssh 连接时,前两个是伪终端,不要通过尝试确定它们是否真正是虚拟控制台的后续测试。但第一个是与您的 shell 关联的终端。通过打开不同的终端,您会得到意想不到的回声等。
当您运行时showkey -s
,它会使用通过打开设备获得的文件描述符来修改终端 I/O 模式(顺便说一下,3,与标准输入不同0)。它的作用相当于那的终端
stty -icanon -echo -isig
showkey
修改终端(3)您(可能)没有输入并在您的终端上显示结果。原来的标准输入showkey
仍然使用原来的输入方式;更新后的输入模式应用于另一个终端。
该行为不是 中的错误showkey
,因为它只能从虚拟控制台获取扫描代码。如果您不打算输入tty0
,您将不会得到您期望的结果。它可以表现得更好,更清楚地告诉你你不会得到有用的结果。
答案2
尝试指示 Vagrant 强制分配 TTY。
$ vagrant ssh -- -ttt ...
我发现这是对标题为 ServerFault Q&A 的评论:使用 vagrant ssh 进行交互命令。退格键不会删除字符。