如何运行 dd 有效地输入我的外壳?

5 bash

尝试运行:

dd if=/dev/urandom count=1000
Run Code Online (Sandbox Code Playgroud)

然后一旦完成,按回车键。我正在运行 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$
Run Code Online (Sandbox Code Playgroud)

这似乎非常不恰当!dd 写入其标准输出如何可能导致该文本最终出现在 Bash 的输入缓冲区中?我对这种情况如何发生以及从安全角度如何将其视为可接受的行为深感困惑。

小智 3

不建议将随机数据发送到您的终端。

随机数据可以包含转义序列,这会导致终端执行除打印可见字符之外的某些操作。

ECMA-48(又名“ANSI”又名“vt100”)终端定义的简单示例包括ESC [ 1 m进入粗体模式、ESC [ 2 J清除屏幕和ESC c重置终端。

某些转义序列不仅会更改终端的状态 - 它们还会请求信息。这些在不同的终端和模拟器之间有所不同。xterm 是一个具有大量受支持的转义序列和良好文档的终端示例。它的ctlseqs.ms文档是一个很好的一般参考,因为许多后来的终端仿真器都旨在与其兼容。这是它的网络版本:http ://invisible-island.net/xterm/ctlseqs/ctlseqs.html

将您的注意力集中到此命令:

CSI Ps c  Send Device Attributes (Primary DA)
Run Code Online (Sandbox Code Playgroud)

了解条目的快速指南:CSI表示ESC [或一个0x9b字节(设置了高位的ESC )。Ps是一个数字参数,在此命令(以及大多数其他命令)中它是可选的。要通过输出随机字节来触发此操作,只需在流中的某处有一个0x9b字节后跟一个0x63( 'c'),这在 1000 个 512 字节的块中不太可能发生。

该命令的作用是向终端询问一个问题:“你是什么?” 终端通过发回转义序列进行回复。您可以在 ctlseqs 文档中阅读几种可能的响应,但我发现有趣的是 和 都6c出现62在列表中。

这些请求/回复转义序列旨在由写入请求然后立即读取回复的程序使用。相反,如果请求是由一个只是喷出垃圾并且没有从终端读取任何内容的程序发送的,则回复可以保留在输入缓冲区中。

请记住,终端通过串行线(真实的或模拟的)连接到计算机。它在每个方向上承载单个字节流。作为对设备属性查询的答复而到达的ESC [6 c与因按下按键而到达的ESC [6 c之间没有可检测到的差异Esc [ 6 c,除了计时之外。

那么,如果您运行不使用终端输入的命令,并在运行时输入一些内容,通常会发生什么?您输入的内容将保留在 tty 缓冲区中,直到该程序完成,然后您的 shell 会读取它。

(在尚未打印的提示符下键入要阅读的命令称为“提前输入”,这是一项节省时间的功能。您不必礼貌地坐在手上等待计算机完成正在执行的操作,如果您知道下一步要做什么,您就可以开始输入!)