尝试运行:
dd if=/dev/urandom count=1000
然后,一旦完成,按回车键。我正在运行 Debian Sid,我得到:
user@host$ dd if=/dev/urandom count=1000
<lots of random characters, then I hit enter again>
bash: 62: command not found
bash: 9: command not found
bash: c62: command not found
bash: 9: command not found
bash: c62: command not found
bash: 9: command not found
bash: c: command not found
user@host$
这似乎太不合适了!dd 写入其标准输出怎么可能导致该文本最终进入 Bash 的输入缓冲区?我非常困惑这是怎么发生的,以及从安全角度来看这怎么能被认为是可接受的行为。
答案1
不建议向您的终端发送随机数据。
随机数据可以包含转义序列,这会导致终端采取除了打印可见字符之外的某些操作。
简单示例ECMA-48(又名“ANSI”又名“vt100”)终端定义包括电子稳定控制系统 [ 1 米进入粗体模式,电子稳定控制系统 [ 2 J清除屏幕,然后电调重置终端。
一些转义序列不仅仅改变终端的状态 - 它们还会请求信息。这些在不同的终端和仿真器之间有所不同。xterm 就是一个支持大量转义序列并有良好文档的终端示例。它的ctlseqs.ms
文档是一个很好的通用参考,因为许多后来的终端仿真器都旨在与它兼容。这是它的网络版本:http://invisible-island.net/xterm/ctlseqs/ctlseqs.html
请注意这个命令:
CSI Ps c Send Device Attributes (Primary DA)
理解条目的快速指南:CSI
意味着ESC键 [或一个0x9b
字节(ESC键(高位设置)。Ps
是一个数字参数,在此命令(以及大多数其他命令)中是可选的。要通过输出随机字节来触发此操作,您只需要在流中的某个位置有一个0x9b
字节后跟0x63
( 'c'
),这在 1000 个 512 字节块中并非不可能。
此命令的作用是向终端询问一个问题:“你是谁?”终端通过发送转义序列进行回复。您可以在 ctlseqs 文档中阅读几种可能的响应,但我发现有趣的是和都6c
出现62
在列表中。
这些请求/回复转义序列旨在供编写请求然后立即读取回复的程序使用。如果请求是由只发出垃圾信息而不从终端读取任何内容的程序发送的,则回复可以保留在输入缓冲区中。
请记住,终端通过串行线(真实或模拟)连接到计算机。它在每个方向上都传输单个字节流。电子稳定控制系统 [ 6作为对设备属性查询的回复到达,并且电子稳定控制系统 [ 6这是因为您按下了按键Esc [ 6 c,除了时间之外。
那么,如果您运行一个不使用终端输入的命令,并在运行时输入一些内容,通常会发生什么情况?您输入的内容将保留在 tty 缓冲区中,直到该程序完成,然后您的 shell 会读取它。
(在提示符下输入一个尚未打印的命令被称为提前输入并且是一项节省时间的功能。您不必礼貌地坐在那里等待计算机完成它正在做的事情,如果您知道接下来要做什么,您可以直接开始打字!)