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


我可以从/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错误;无论何时遇到Permission denied错误,我都会像往常一样使用sudo

$ 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错误?

最佳解决办法

/dev/null是一个文件。一个特殊的文件。像/dev /sda或/dev /tty这样的设备文件可以与系统中的一块硬件进行通信。

/dev/null的唯一区别是没有硬件与其链接。您发送给它的任何数据都将被丢弃。像下面的命令一样:

echo "Hello World" > /dev/null

这将不会在您的终端上打印任何内容,因为您将echo的输出发送到空白处,因此发生黑洞。

但是当你做mv test_file /dev/null时,你已经用普通的文本文件替换了特殊文件/dev/null,并保存了test_file的内容副本。换句话说,你已经失去了你的/dev/null

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

sudo rm /dev/null
sudo mknod /dev/null c 1 3
sudo chmod 666 /dev/null

chmod需要修复his answerhope中记录的权限。

你应该重建它,因为很多脚本通过默认输出发送到/dev/null。如果/dev/null不再是一个黑洞,而是一个普通的文本文件,它可能会增长,增长并填充您的file-system。我相信你想避免这种情况。

而且更危险的是,很多脚本都假定从/dev/null读取的内容什么都不会读取;打破这个假设可能导致随机垃圾写入您系统周围的文件中……实际上不可能修复。

请记住,Linux是multi-tasking:当你与/dev/null玩,有很多的进程正在运行,甚至在几秒钟的“机会之窗”可以肆虐。

如果你想玩/dev/null,你可以创建一个副本并进行实验:

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

将创建一个与/dev/null完全相同的/tmp/null文件,但您可以在没有任何系统风险的情况下进行操作和测试。

次佳解决办法

@Benoithis answer中几乎正确。您还需要修复权限。

$ sudo rm /dev/null
$ sudo mknod /dev/null c 1 3
$ ls -l /dev/null
crw-r--r-- 1 root root 1, 3 Mar 18 08:38 /dev/null
$ sudo chmod 666 /dev/null
$ ls -l /dev/null
crw-rw-rw- 1 root root 1, 3 Mar 18 08:38 /dev/null

这会恢复权限。否则,作为non-root用户,您将无法使用echo foo > /dev/null

第三种解决办法

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

当您向/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)

第四种办法

当你运行命令

$ sudo mv test_file /dev/null

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

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

有关如何手动恢复/dev/null的信息,请参阅Benoit的答案,但由于大多数(如果不是全部)/dev/的内容由udev动态管理,我怀疑简单的重启也可能会修复它。

第五种办法

要回答你应该做什么的问题,要删除一个文件,你需要:

rm test_file

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

参考资料

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