我可以从/ dev / null阅读;如何解决?


80

我在上阅读了Wikipedia文章,/dev/null并且正在通过将文件移至进行操作/dev/null

为此,我创建了一个,test_file并在其中添加了一些内容:

$ touch test_file
$ echo "This is written by Aditya" > test_file
$ cat test_file
This is written by Aditya

之后,我尝试将文件移至/dev/null

$ mv test_file /dev/null
mv: inter-device move failed: ‘test_file’ to ‘/dev/null’; unable to remove target: Permission denied

因为,这给了我一个Permission denied错误;sudo每当遇到Permission denied错误时,我都会像往常一样使用。

$ sudo mv test_file /dev/null

该命令已成功执行,并且test_file不再存在于目录中。

但是,维基百科的文章说,不可能恢复任何移至的内容,/dev/null并且会给EOF试图从中读取内容的任何过程提供帮助。但是,我可以从阅读/dev/null

$ cat /dev/null
This is written by Aditya

我做错了什么以及如何/dev/null恢复正常?为什么我首先遇到Permission denied错误?

Answers:


147

/dev/null是一个文件。特殊文件。与/ dev / sda或/ dev / tty之类的设备文件,可与系统上的硬件通信。

唯一的区别/dev/null是没有硬件链接到它。您发送给它的所有数据都会被静默丢弃。类似于以下命令:

echo "Hello World" > /dev/null

它不会在终端上打印任何内容,因为您将的输出发送echo到null,从而将其发送到void上的黑洞。

但是,当您将常规文件mv test_file /dev/null替换为特殊/dev/null文件时,会保留内容的副本test_file。换句话说,您已经失去了/dev/null

现在,您要做的是(重建它):

sudo rm /dev/null
sudo mknod -m 0666 /dev/null c 1 3

您应该重建它,因为默认情况下许多脚本会将输出发送到/dev/null。如果/dev/null不再是黑洞,而是普通的文本文件,它可能会增长,增长并充满您的文件系统。而且我确定您想避免这种情况。

更危险的是,许多脚本假定从中/dev/null读取将不会读取任何内容。打破这一假设可能会导致在系统中的文件中随机写入垃圾,实际上是无法修复的。

请记住,Linux是多任务的:在您玩游戏的同时/dev/null,许多进程正在运行,并且即使在几秒钟的“机会之窗”中也可能造成严重破坏。

如果您想玩游戏,/dev/null可以创建一个副本并进行试验:

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

将创建一个/tmp/null工作方式完全相同的文件,/dev/null但您可以对其进行操作和测试,而不会给系统带来任何风险。


16

覆盖文件和写入文件之间有很大的区别。

当您向写入内容时 /dev/null,例如,

$ echo Hello > /dev/null

...它被默默丢弃。为此,您需要对/dev/null拥有写入权限,每个人都具有:

$ ls -l /dev/null 
crw-rw-rw- 1 root root 1, 3 Mar 18 13:17 /dev/null

当你覆盖 /dev/null,当你用那样mv的命令,你替换特殊文件/dev/null,不管你搬到那里。不要这样!之所以需要root特权,是因为要覆盖文件,您需要对包含该文件的目录具有写权限,在这种情况下/dev

$ ls -ld /dev
drwxr-xr-x 16 root root 4640 Mar 18 13:17 /dev

要恢复/dev/null,请发出命令

$ sudo rm /dev/null
$ sudo mknod -m 0666 /dev/null c 1 3

(另请参见U&L StackExchange:如何创建/dev/null


8

运行命令时

$ sudo mv test_file /dev/null

您已/dev/null文本文件替换了特殊文件。随后的读取尝试将/dev/null返回文本文件的内容,而尝试以/dev/null常规方式使用的程序可能会中断。

替换或删除中的设备文件/dev/需要超级用户特权,这就是为什么您的非sudo尝试失败并显示错误的原因。

请参阅Benoit的答案以获取有关如何/dev/null手动还原的信息,但是由于/dev/udev的大部分(如果不是全部)内容都是由udev动态管理的,因此我怀疑一次简单的重启也可能会解决该问题。


6

要回答您应该做什么的问题,要删除文件,请执行以下操作:

rm test_file

如其他人所述,/ dev / null是程序输出的目标。


2
我没有downvote,但问题是不是删除文件...我知道我们用rm删除的文件/目录...我刚刚看了一下/dev/null,为了更多地了解它,我试着将文件移动到/dev/null和看到效果..这个问题是关于了解我将文件移动到/dev/null其中后做错了什么,现在我可以从中读取...问题不是关于如何从系统中删除文件...我希望它是清楚...但是您的回答仍然受到欢迎,并且足以作为回答... :-)
Aditya 2014年

7
公平地讲,在询问“我做错了什么”时,要求您解释应该做些什么。对于大多数用户来说,这可能是微不足道的,但其他答案都没有提到。
kapex 2014年
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.