为什么从“/dev/random”读取时将“1;2c”字符放在光标后面?

为什么从“/dev/random”读取时将“1;2c”字符放在光标后面?

当我运行命令时,我得到一些随机垃圾二进制数据,但在收到它们后,进程终止后dd if=/dev/random count=1 bs=32仍然有一些字符(正如我总是看到的那样)。1;2cdd

[amirreza@localhost ~]$ dd if=/dev/random count=1 bs=32
¾¿܄ÌYLÔAëEÔr/f&-È<>ýø1+0 records in
1+0 records out
32 bytes copied, 3.5878e-05 s, 892 kB/s
^[[?1;2c[amirreza@localhost ~]$ 1;2c

这个字符是什么以及为什么在 终止后抛出它dd

答案1

这种情况揭示了 Linux/Unix GUI 终端窗口实际上并不是一个集成的东西,而是或多或少一起工作的三个东西:

  • 终端仿真器(实际的 GUI 终端应用程序,或 Linux 文本控制台的内置终端仿真器)
  • 操作系统的 TTY 或 PTY(伪 TTY)设备驱动程序
  • shell,或者当时正在处理 TTY 输入的任何程序。

随机垃圾恰好包含以下字节序列之一:( ) 或0x1b 0x63( ) 。ESC c0x1b 0x30 0x63ESC0 c

这些序列对于与经典 VT100 终端兼容的任何终端或终端仿真器具有特殊含义:它请求终端(/仿真器)以描述终端主要属性的代码进行响应。

终端以字符串 进行响应ESC[?1:2c,该字符串过去表示“该终端是具有高级视频选项的 VT100”。 (这是响应xterm,许多其他与其兼容的终端仿真器通常会发送响应。)

该字符串的发送方式就像您键入它一样,但该dd命令不需要任何键盘,因此 PTY 驱动程序最初只是回显它,就像^[[?1;2c您在提示符开头看到的那样。 (^[是表示ESC控制字符的常用方法。)

然后dd命令结束,shell 显示提示符,看到一些输入在 PTY 驱动程序的输入缓冲区中等待,读取它并尝试解释它:

  • ESC[被解释为 Meta-[ ,这不是bash的默认元击键之一,因此它不执行任何操作。
  • ?由于某种原因,我目前无法弄清楚,它也被过滤掉(如果您知道,请随意评论或编辑此答案)
  • 其余部分在提示符后由 shell 重新显示,以防万一它是您在上一个命令完全完成之前开始键入的命令的开头。

还有一些其他控制序列也可能影响您的终端仿真器。 Xterm 和兼容终端仿真器可以理解的控制序列列表位于:https://www.xfree86.org/current/ctlseqs.html

如果您不小心将一些随机垃圾放入终端窗口,并且它使终端显示变得更糟(例如,随机数据恰好包含“更改字符集”代码,使字符无法识别),您可能想了解如何将混乱的终端窗口重置回正常状态。有几种策略:

  • 如果您使用的是 GUI 终端窗口,它可能包含“重置终端”菜单选项
  • “返回默认字符集”的控制代码是一个简单的Control+ o(字母 O,而不是数字),因此您可以尝试键入该代码并按 Enter 键,看看下一个提示是否看起来更好。
  • 如果您看起来像是在命令提示符下,但字符无法识别,您可以假设这只是显示问题,只需盲目键入命令reset并按 Enter 键即可。
  • 对于任何基于文本的全屏程序(=任何使用 的程序(n)curses),您可以按Control+L请求完全刷新显示,以防出现任何混乱。

相关内容