正如许多人所知,>>
操作符会将命令的输出附加到您在其后面放置的任何内容。
我知道它可以用于覆盖文件或将数据添加到文件中,但我也知道它可以以恶意方式使用:如果使用驱动器或分区作为输出,则命令的输出将直接写入驱动器,这可能会损坏该驱动器或分区。
例如,根据我的理解,附加>> /dev/sda
到命令会将命令的输出直接附加到/dev/sda
.
出于好奇,我设置了一个 Ubuntu VM,并尝试了这个乐趣。该计算机的虚拟驱动器为/dev/vda
,/dev/vda1
其引导分区为 ,/dev/vda2
根分区为 ,并且没有单独的分区/home
。
现在有趣的部分来了:
echo "Hello world" >> /dev/vda
(以 root 身份)在虚拟机中运行然后重新启动它时,似乎没有任何东西被损坏。重新启动后它启动得很好,之后一切似乎都正常。echo "Hello world" >> /dev/vda1
在同一个虚拟机中运行(也以 root 身份)然后重新启动它时,它无法启动。所以我已经知道为什么写入输出vda1
很糟糕(它损坏了启动分区)。我的问题是:为什么附加输出似乎/dev/vda
没有做任何事情,但附加输出却会/dev/vda1
损害它?是否因为/dev/vda2
位于“之后” /dev/vda1
,因此传递vda
结果会导致命令输出被写入vda2
?
我认为您以 UEFI 模式启动。这意味着引导过程不会查看驱动器的头端。
\n如果在 BIOS 模式(别名 CSM 别名传统模式)下引导,驱动器上的第一个字节应包含主引导记录 MBR。离磁头很近的地方还存放着分区表。
\n在块设备上使用时>>
,它不会附加,而是写入驱动器的头部。请参阅以下演示,其中/dev/sdc
有一个 USB 闪存盘。
$ sudo bash -c 'echo "Hello world" >> /dev/sdc'\n$ sudo dd if=/dev/sdc bs=12 count=1\nHello world\n1+0 poster in\n1+0 poster ut\n12 byte kopierade, 0,00127171 s, 9,4 kB/s\n
Run Code Online (Sandbox Code Playgroud)\n如果我的描述是正确的,如果您将较长的数据块写入头端(足够长以覆盖分区表而不仅仅是 MBR),则会损坏该过程。
\n在设置为 BIOS 引导的驱动器中,写入驱动器磁头将损坏引导过程,因为 MBR 已损坏。
\n编辑1:
\n以同样的方式写入FAT32文件系统的分区头端,显示文件系统已损坏:
\n$ lsblk -o model,name,size,fstype,label,mountpoint /dev/sdc\nMODEL NAME SIZE FSTYPE LABEL MOUNTPOINT\nVoyager sdc 7,5G \n \xe2\x94\x9c\xe2\x94\x80sdc1 256M vfat \n \xe2\x94\x94\xe2\x94\x80sdc2 512M vfat\n\n$ sudo dd if=/dev/sdc1 bs=12 count=1\n\xef\xbf\xbdX\xef\xbf\xbdmkfs.fat1+0 poster in\n1+0 poster ut\n12 byte kopierade, 0,00118622 s, 10,1 kB/s\n\n$ sudo bash -c 'echo "Hello world" >> /dev/sdc1'\n\n$ lsblk -o model,name,size,fstype,label,mountpoint /dev/sdc\nMODEL NAME SIZE FSTYPE LABEL MOUNTPOINT\nVoyager sdc 7,5G \n \xe2\x94\x9c\xe2\x94\x80sdc1 256M \n \xe2\x94\x94\xe2\x94\x80sdc2 512M vfat \n\n$ sudo dd if=/dev/sdc1 bs=12 count=1\nHello world\n1+0 poster in\n1+0 poster ut\n12 byte kopierade, 0,00118594 s, 10,1 kB/s\n
Run Code Online (Sandbox Code Playgroud)\n编辑2:
\n分区 #2 未受影响,您可能想查看十六进制转储,而不仅仅是非 ASCII 字符的丑陋表示:
\n$ sudo dd if=/dev/sdc2 bs=12 count=1 | hexdump -C\n1+0 poster in\n1+0 poster ut\n12 byte kopierade, 0,00129779 s, 9,2 kB/s\n00000000 eb 58 90 6d 6b 66 73 2e 66 61 74 00 |.X.mkfs.fat.|\n0000000c\n
Run Code Online (Sandbox Code Playgroud)\n