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

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

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

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

链接

/home也是一个目录。

因为人们会假设。 在我测试之前,我就是其中之一。 很容易理解人们为什么会这样…… 看起来很危险……

…但你实际上无法将事物移动到/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 

/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'的数据)插入到系统周围的系统文件中 - 这可能导致完全破碎且无法恢复的系统。

您可以将文件或其他输入流写入/dev/null但不能写入目录。 如果您尝试将目录移动到/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用于所有目的:

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

 $ 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恢复我们的test_file

 $ 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/nullcp /dev/null our_test_file ,如果系统中的任何根脚本通过运行echo "Whatever text the root script wants to send to /dev/null" > /dev/null覆盖它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上的维基百科文章

发送到/dev/null被静默丢弃。 如果您输入:

 echo "Hello World" 

你在屏幕上得到Hello World 。 如果您输入:

 echo "Hello World" >/dev/null 

你没有在屏幕上得到任何东西。

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