危险的 Linux 命令:在哪些方面一个命令是有害的,而另一个命令似乎没有效果?

危险的 Linux 命令:在哪些方面一个命令是有害的,而另一个命令似乎没有效果?

正如许多人所知,>>操作符会将命令的输出附加到您在其后面放置的任何内容。

我知道它可以用于覆盖文件或将数据添加到文件中,但我也知道它可以以恶意方式使用:如果使用驱动器或分区作为输出,则命令的输出将直接写入驱动器,这可能会损坏该驱动器或分区。

例如,根据我的理解,附加>> /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

答案1

我认为您以 UEFI 模式启动。这意味着引导过程不会查看驱动器的头端。

如果在 BIOS 模式(别名 CSM 别名传统模式)下引导,驱动器上的第一个字节应包含主引导记录 MBR。离磁头很近的地方还存放着分区表。

在块设备上使用时>>,它不会附加,而是写入驱动器的头部。请参阅以下演示,其中/dev/sdc有一个 USB 闪存盘。

$ sudo bash -c 'echo "Hello world" >> /dev/sdc'
$ sudo dd if=/dev/sdc bs=12 count=1
Hello world
1+0 poster in
1+0 poster ut
12 byte kopierade, 0,00127171 s, 9,4 kB/s

如果我的描述是正确的,如果您将较长的数据块写入头端(足够长以覆盖分区表而不仅仅是 MBR),则会损坏该过程。

在设置为 BIOS 引导的驱动器中,写入驱动器磁头将损坏引导过程,因为 MBR 已损坏。

编辑1:

以同样的方式写入FAT32文件系统的分区头端,显示文件系统已损坏:

$ lsblk -o model,name,size,fstype,label,mountpoint /dev/sdc
MODEL   NAME    SIZE FSTYPE LABEL MOUNTPOINT
Voyager sdc     7,5G              
        ├─sdc1  256M vfat         
        └─sdc2  512M vfat

$ sudo dd if=/dev/sdc1 bs=12 count=1
�X�mkfs.fat1+0 poster in
1+0 poster ut
12 byte kopierade, 0,00118622 s, 10,1 kB/s

$ sudo bash -c 'echo "Hello world" >> /dev/sdc1'

$ lsblk -o model,name,size,fstype,label,mountpoint /dev/sdc
MODEL   NAME    SIZE FSTYPE LABEL MOUNTPOINT
Voyager sdc     7,5G              
        ├─sdc1  256M              
        └─sdc2  512M vfat         

$ sudo dd if=/dev/sdc1 bs=12 count=1
Hello world
1+0 poster in
1+0 poster ut
12 byte kopierade, 0,00118594 s, 10,1 kB/s

编辑2:

分区 #2 未受影响,您可能想查看十六进制转储,而不仅仅是非 ASCII 字符的丑陋表示:

$ sudo dd if=/dev/sdc2 bs=12 count=1 | hexdump -C
1+0 poster in
1+0 poster ut
12 byte kopierade, 0,00129779 s, 9,2 kB/s
00000000  eb 58 90 6d 6b 66 73 2e  66 61 74 00              |.X.mkfs.fat.|
0000000c

相关内容