我可以从 /dev/null 读取;如何修复它?

我可以从 /dev/null 读取;如何修复它?

我读过维基百科文章/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一开始会遇到错误?

答案1

/dev/null是一个文件。一个特殊文件。一个像 /dev/sda 或 /dev/tty 这样的设备文件,用于与系统上的某个硬件进行通信。

唯一的区别/dev/null是它没有连接任何硬件。你发送给它的任何数据都会被悄悄丢弃。就像下面的命令一样:

echo "Hello World" > /dev/null

这不会在你的终端上打印任何内容,因为你将的输出发送echo到 null,发送到虚空,从而发送到黑洞。

但当你这样做时,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但您可以操作和测试它而不会对您的系统造成任何风险。

答案2

两者之间有很大区别覆盖一个文件和写信给一份文件。

当你写一些东西 /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

答案3

运行命令时

$ sudo mv test_file /dev/null

你有被取代将特殊文件/dev/null与您的文本文件放在一起。后续尝试读取将/dev/null返回文本文件的内容,并且尝试/dev/null以正常方式使用的程序可能会中断。

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

有关如何手动恢复的信息,请参阅 Benoit 的回答/dev/null,但由于大多数(如果不是全部)内容/dev/都是由 udev 动态管理的,我认为简单的重启也可能会解决这个问题。

答案4

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

rm test_file

正如其他人所说,/dev/null 是程序输出的目的地。

相关内容