为什么将目录移动到/ dev / null是危险的?
当我尝试将test_dir
目录移动到/dev/null
,我收到了消息
mv: cannot overwrite non-directory '/dev/null' with directory 'test_dir/'
然后为什么人们说“不要运行命令sudo mv ~ /dev/null
,它会将你的主目录移动到一个洞?”
链接
但/home
也是一个目录。
因为人们会假设。 在我测试之前,我就是其中之一。 很容易理解人们为什么会这样…… 看起来很危险……
…但你实际上无法将事物移动到/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
只是一个文件,它是一个“特殊字符”文件,但它仍然受到文件必须遵循的规则的约束。 话虽这么说你永远不会运行这个命令:
$ 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'的数据)插入到系统周围的系统文件中 - 这可能导致完全破碎且无法恢复的系统。
您可以将文件或其他输入流写入/dev/null
但不能写入目录。 如果您尝试将目录移动到/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
用于所有目的:
让我们在名为ask_ubuntu
的目录中创建一个test_file
和一个test_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
现在,让我们test_file
我们是否可以从/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
,您仍然可以恢复它,如上所示。 但是,有两个例外:-
在此期间运行
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
覆盖它echo "Whatever text the root script wants to send to /dev/null" > /dev/null
(或其他类似的命令)。 然后我们没有任何简单的方法来恢复我们的文件。 -
如果在运行这两个命令之间重新启动系统。
/dev/null
在启动时重新创建,因此当我们关闭计算机时,我们的文件会丢失。
-
-
但是如果你想恢复输入流,如
echo "Stream this line to /dev/null" > /dev/null
,则无法恢复,因为/dev/null
是一个特殊文件,用于处理不需要的文件和输入流,并且维基百科文章提到,它不向从中读取的进程提供任何数据。
参考: /dev/null
上的维基百科文章
发送到/dev/null
被静默丢弃。 如果您输入:
echo "Hello World"
你在屏幕上得到Hello World
。 如果您输入:
echo "Hello World" >/dev/null
你没有在屏幕上得到任何东西。
但是在move命令的情况下,命令mv
尝试用目录替换文件/ dev / null,这是不可能的。 因为一切都是Linux中的文件,所以/ dev / null是一个文件。 当然是一个特殊的(设备文件),一个允许访问硬件(如磁盘,分区,声卡,串行端口……)的特殊文件。 在/ dev / null的情况下,它不与任何硬件链接,因此发送给它的数据被静默丢弃。 这就是“他们”可能称之为黑洞的原因。