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


28

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

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

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

链接

而且/home也是目录。

Answers:


39

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

...但是您实际上无法将内容移至/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将丢弃您的空设备,并用该文件替换它,而不是删除文件的内容。
psusi 2014年

2
答案有点模棱两可。将文件移至/dev/null不会导致该数据移入无内容。这将导致被好吗移动的数据,但/dev/null将被覆盖,所以你可以将它回来了:)另见askubuntu.com/questions/435887/...
马尔特Skoruppa

1
是的,因为sudo mv file /dev/null 它将成功,并且很容易导致完全无法使用的系统。请参阅我对@MalteSkoruppa的评论中链接的问题的评论。这是“ sudo只有在三次检查就知道自己在做什么的
前提下

5
您可以进行实验来创建自己的/ dev / null副本:sudo mknod -m 0666 /tmp/mynull c 1 3---,然后再玩;-)
Rmano 2014年

10
这是最好的问题来自哪里。“亲爱的Ubuntu先生,我最近将作业错误地移到了/ dev / null,这已被90%的系统配置文件吸收了。现在每次启动时我都会看到莎士比亚的文章。而且我的触控板不起作用。哈! ”
奥利(Oli)

18

/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”的数据)会插入整个系统的系统文件中,这可能会导致系统彻底崩溃且无法恢复。


13

您可以将文件或其他输入流写入目录,/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_filetest_dir内部ask_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是一个用于处理不需要的文件和输入流的特殊文件,并且正如Wikipedia文章所提到的那样,它不向读取它的进程提供任何数据。


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


4
sudo mv test_file /dev/null替换 /dev/nulltest_file。因此,在那之后,这/dev/null只是一个普通文件,您可以从其中读取任何写入该文件的内容。
要这样做

“因此,不可能恢复已移至/ dev / null的任何文件”,严格来说,这不是事实。如果要关闭系统,挂载系统并在其上运行数据恢复,那么如果文件没有被覆盖,则很可能能够恢复该文件。
pzkpfw

@FlorianDiesch:更新了答案:)
Aditya

7

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

echo "Hello World"

您进入Hello World屏幕。如果输入:

echo "Hello World" >/dev/null

屏幕上什么也没有。

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


目录不是文件。
托尔比约恩Ravn的安德森

1
@ThorbjørnRavnAndersen在Linux世界中,目录是文件!
Habeeb Perwad 2014年

@HabeebPerwad仅在内核内部。
托尔比约恩Ravn的安德森

@ThorbjørnRavnAndersen对不起,我没有进入内核,所以不知道:)
Habeeb Perwad 2014年

“因为所有内容都是Linux中的文件”-不正确。有文件,还有许多其他种类的对象。不知道你从哪里得到的。
ggPeti '16
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.