为什么将目录移动到 /dev/null 是危险的?

为什么将目录移动到 /dev/null 是危险的?

当尝试将test_dir目录移动到时/dev/null,我收到消息

mv: cannot overwrite non-directory ‘/dev/null’ with directory ‘test_dir/’

那么为什么人们会说“不要运行该命令sudo mv ~ /dev/null,它会将你的主目录移动到一个洞里?”

关联

/home也是一个目录。

答案1

因为人们会假设。我就是其中之一直到我测试了它。很容易理解为什么人们认为……看起来危险的...

... 但您实际上无法将内容移动到/dev/null— 这是一个特殊的文件,它只是吸收重定向(并将它们发送到虚无中)。如果您尝试将目录移动到它,文件系统将在您面前爆炸式增长,如果您尝试将文件移动到它,您可能最终会替换它。

第一个链接将处理目录,但这里有一个单独的测试,仅用于用文件覆盖它。正如 Rmano 在评论中指出的那样,如果没有成人监督,您可能不应该这样做。这其中存在风险。

$ echo "this is my file" > test
$ cat test
this is my file

$ sudo mv test /dev/null
$ cat /dev/null
this is my file

# Fix this!
$ sudo rm /dev/null
$ sudo mknod -m 0666 /dev/null c 1 3

答案2

/dev/null只是一个文件,它是一个“特殊字符”文件,但它仍然受文件必须遵循的规则的约束。话虽如此,你永远不能运行这个命令:

$ mv ~ /dev/null

由于您正在将目录移动到文件,因此该mv命令不允许这样做,这在上下文中没有任何意义,并且mv知道这一点。

例子

$ mkdir dir
$ touch afile
$ mv dir afile
mv: cannot overwrite non-directory ‘afile’ with directory ‘dir’

/dev/null如果您尝试将常规文件复制到该文件上,则无法复制到其中任何一个,因为它是一个字符文件。

$ cp ~/bzip2_1.0.6-4_amd64.deb /dev/null
$ ls -l |grep null
crw-rw-rw-  1 root root        1,   3 Mar 16 14:25 null

您可以对此文件执行的唯一操作是将mv其复制到另一个文件或将其删除。

$ mv /path/to/afile /dev/null

此命令之后,/dev/null是一个常规文件。此更改最危险的影响/dev/null绝不输出任何数据,因此许多 shell 脚本会假设

`... < /dev/null` 

相当于说“什么都没有”。打破这一假设会导致随机数据(最后一个进程写入“/dev/null”的数据)插入到整个系统的系统文件中 --- 这可能会导致系统彻底崩溃且无法恢复。

答案3

您可以将文件或其他输入流写入目录,/dev/null但不能写入目录。如果您尝试将目录移动到目录,/dev/null则会报告错误,因为/dev/null它不是目录而是文件。

但是,既然您想尝试/dev/null,我们首先建议您了解移动文件进行覆盖的后果/dev/null以及如何从这种情况中恢复:

根据建议@Rmano这个答案对于这个问题,为了进行实验,/dev/null我们应该创建它的副本,然后进行实验。所以,让我们创建/tmp/null它并用于我们的实验目的:

sudo mknod -m 0666 /tmp/null c 1 3

从现在开始,我们的所有目的/tmp/null都是:/dev/null

让我们在名为 的目录中创建一个test_file和。test_dirask_ubuntu

$ mkdir ask_ubuntu
$ cd ask_ubuntu
$ touch test_file
$ mkdir test_dir
$ echo "Let us test if we can recover our test_file." > test_file

以下显示ask_ubuntu目录的内容:

$ ls -la
total 12
drwxr-xr-x 3 aditya aditya 4096 Mar 18 17:10 .
drwxr-xr-x 4 aditya aditya 4096 Mar 18 17:10 ..
drwxr-xr-x 2 aditya aditya 4096 Mar 18 17:10 test_dir
-rw-r--r-- 1 aditya aditya    0 Mar 18 17:10 test_file

现在尝试将我们的移至test_file/tmp/null查看的内容ask_ubuntu

$ sudo mv test_file /tmp/null   # This succeeds
$ ls -la
total 12
drwxr-xr-x 3 aditya aditya 4096 Mar 18 17:12 .
drwxr-xr-x 4 aditya aditya 4096 Mar 18 17:10 ..
drwxr-xr-x 2 aditya aditya 4096 Mar 18 17:10 test_dir

命令成功,但test_file不再可用。现在尝试移动test_dir/tmp/null不成功的位置:

$ sudo mv test_dir/ /tmp/null 
mv: cannot overwrite non-directory ‘/tmp/null’ with directory ‘test_dir/’

test_dir仍然存在于里面ask_ubuntu

$ ls -la
total 12
drwxr-xr-x 3 aditya aditya 4096 Mar 18 17:12 .
drwxr-xr-x 4 aditya aditya 4096 Mar 18 17:10 ..
drwxr-xr-x 2 aditya aditya 4096 Mar 18 17:10 test_dir

现在,让我们看看我们是否可以test_file从中恢复/tmp/null

$ cat /tmp/null
Let us test if we can recover our test_file.

所以,它仍然存在,并且/tmp/null这个特殊文件已被覆盖,变得像任何其他普通文件一样。我们可以/tmp/null像任何其他文件一样通过复制来恢复我们的文件:

$ cp /tmp/null our_test_file
$ cat our_test_file
Let us test if we can recover our test_file.

文件已恢复。

笔记:

如果您没有创建/tmp/null并直接使用尝试这些命令/dev/null;请确保通过运行恢复文件(如果需要)cp /dev/null our_test_file;并/dev/null通过尽快运行链接问题中给出的以下命令将其恢复到我们系统中:

$ sudo rm /dev/null
$ sudo mknod /dev/null c 1 3
$ sudo chmod 666 /dev/null

结论:

  • 因此,不可能移动目录,/dev/null因此也不可能从那里恢复目录。

  • 至于文件,如果你直接将文件移动到/dev/null,你仍然可以恢复它,如上所示。但是,有两个例外:

    1. sudo mv test_file /dev/null在你运行和的期间cp /dev/null our_test_file,如果系统中的任何根脚本通过运行echo "Whatever text the root script wants to send to /dev/null" > /dev/null(或其他类似命令)覆盖了它。那么我们就没有任何简单的方法来恢复我们的文件。

    2. 如果在运行这两个命令之间重新启动系统,/dev/null则会在启动时重新创建,因此当我们关闭计算机时我们的文件就会丢失。

  • 但是如果您想恢复像这样的输入流echo "Stream this line to /dev/null" > /dev/null,您就无法恢复它,因为它/dev/null是一个用于处理不需要的文件和输入流的特殊文件,并且正如维基百科文章所提到的,它不会向从中读取的进程提供任何数据。


参考:维基百科文章/dev/null

答案4

发送到的所有内容/dev/null都会被默默丢弃。如果您输入:

echo "Hello World"

你就会Hello World看到屏幕。如果你输入:

echo "Hello World" >/dev/null

屏幕上什么也看不到。

但在 move 命令的情况下,该命令mv尝试用目录替换文件 /dev/null,这是不可能的。因为在 Linux 中一切都是文件,所以 /dev/null 是一个文件。当然是一个特殊的文件(设备文件),一个允许访问硬件(如磁盘、分区、声卡、串行端口等)的特殊文件。在 /dev/null 的情况下,它不与任何硬件相关联,因此发送给它的数据会被默默丢弃。这就是为什么“他们”可能称它为黑洞。

相关内容