当前位置: 首页>>技术教程>>正文


为什么将目录移动到/dev/null会有危险?

,

问题描述

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

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

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

Link

但是/home也是一个目录。

最佳答案

因为人们假设。我是until I tested it之一。很容易理解人们为什么会假设…看起来很危险…

…但是您实际上无法将其移动到/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只是一个文件,它是”special character”文件,但仍然受到文件必须遵循的规则的约束。话虽如此,您永远无法运行此命令:

$ mv ~ /dev/null

由于您要将目录移动到文件,因此mv命令不允许这样做,这在上下文上是没有意义的,mv知道这一点。

例子

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

如果您尝试将常规文件复制到/dev/null,则由于它是字符文件,因此也不能复制到/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` 

相当于说”nothing”。打破这个假设可能导致随机数据(好吧,最后一个进程写入到“ /dev /null”的数据)插入整个系统的系统文件中,这可能会导致完全损坏且无法恢复的系统。

第三种答案

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

但是,由于要尝试使用/dev/null,因此建议您首先了解移动文件以覆盖/dev/null的后果以及如何从这种情况中恢复:

正如该问题的this answer中的@Rmano所建议的那样,为了尝试使用/dev/null,我们宁愿创建它的副本然后进行实验。因此,让我们创建/tmp/null并将其用于我们的实验目的:

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

从现在起,/tmp/null是我们的/dev/null,可用于所有用途:

让我们在名为ask_ubuntu的目录中创建test_filetest_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

现在,让我们看一下是否可以从/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(或其他类似命令)将其覆盖。然后,我们没有任何简单的方法来恢复文件。

    2. 如果在运行这两个命令之间重新引导系统。 /dev/null会在启动时获取re-created,因此,当我们关闭计算机时,我们的文件会丢失。

  • 但是,如果要恢复echo "Stream this line to /dev/null" > /dev/null之类的输入流,则无法恢复,因为/dev/null是处理不需要的文件和输入流的特殊文件,并且如Wikipedia文章所述,它不向从其读取的进程提供任何数据。 。


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

第四种答案

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

echo "Hello World"

您会在屏幕上看到Hello World。如果输入:

echo "Hello World" >/dev/null

屏幕上什么也没有。

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

参考资料

本文由Ubuntu问答整理, 博文地址: https://ubuntuqa.com/article/9486.html,未经允许,请勿转载。