我经常使用 dd 。我一直担心有一天会犯错误,例如在 sda(计算机磁盘)而不是 sdb(USB 磁盘)上写入,然后擦除计算机上的所有内容。
我知道 dd 应该是一个高级用户工具,但对我来说,按错键基本上可以搞砸整个计算机,这对我来说没有意义。
为什么没有一种安全措施来阻止 dd 写入它从中获取命令的磁盘?不知道怎么会有人故意这样做。
请注意,我自己没有尝试过,我只是读到过它,所以我可能是错的。
答案1
我知道 dd 应该是一个高级用户工具,但对我来说,按错键基本上可以搞砸整个计算机,这对我来说没有意义。
考虑一下土木建筑中使用的电动工具的种类,以及如果做错一件小事可能会搞砸什么。这些事情可以变得更容易预防吗?可能吧,但平衡点是在多大程度上使事故更容易预防,从而使该工具变得不那么有用和/或更尴尬。
驾驶汽车是一个类似的类比,可能会带来更可怕的后果,但人类一直在设法做到这一点(事实上,太多了)。当然,如果他们做得慢一些会更安全,但我们共同决定哪些风险值得冒。同样,如果计算机dd
不存在的话,它会更安全,但由于它的实用性被认为大于它的风险,所以它确实存在。
为什么没有一种安全措施来阻止 dd 写入它从中获取命令的磁盘?
事实上是有的,因为默认情况下设备文件(例如/dev/sda1
)需要超级用户权限才能写入。因此,除非您正在使用 asroot
或 via sudo
,否则您实际上无法使用 .NET 一键搞砸整个计算机dd
。
这让我们想到为什么有关于使用超级用户权限运行命令的所有警告。 这些警告非常普遍,我认为在没有看到它们的情况下很难最终操作 *nix 系统,有点像进入建筑区而不注意到安全帽区迹象。
如果您没有理由进入建筑区,请离开。如果这样做,请采取适当的安全预防措施。世界可能是一个危险的地方,有些地方比其他地方更危险。不要不假思索地行动。确保不会发生任何坏事的一定程度的安全性——因此您不必费心思考——意味着您也无能为力。有时这是可取的,有时却不是。
答案2
有理由问为什么 dd 命令不首先检查其目标是否包含已安装的文件系统,然后提示确认或需要特殊标志。一个简单的答案是,它会破坏任何希望能够以这种方式使用 dd 的脚本,并且这些脚本不是为处理交互式输入而设计的。例如,在安装原始设备的分区时修改该设备的分区表可能是合理的;您只需要小心,只修改第一个扇区。
市面上有大量的 Linux 系统,我们不可能知道人们想出了什么样的疯狂设置。因此 dd 的维护者不太可能做出向后不兼容的更改,从而导致未知数量的环境出现问题。
答案3
要“添加一个小步骤,例如选项或确认消息”,您可以执行 artm 在问题评论中建议的操作:使用包装脚本。
换句话说,与其直接处理有点令人畏惧的 dd 命令行参数,不如在 bash(或 Python 等)中创建一个脚本,使用您感兴趣的选项语法来获取您感兴趣的 dd 参数。更舒服。该脚本检查参数是否合理,并打印出参数(可能还有最终的 dd 命令行),以便您可以验证一切是否都应如此。然后脚本会询问您“确定继续吗?[y/N]”,因此y
如果您希望脚本实际运行为您构建的 dd 命令行,则必须输入。
因此,如果您不想让脚本写入 /dev/sda 或其分区,您可以使其无法执行此操作。为了帮助您验证是否确实选择了所需的输入和输出设备,该脚本可以使用 blkid 命令来获取这些设备的 UUID 和磁盘标签。 ETC。