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

Avi*_*Raj 30 filesystem command-line

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

mv: cannot overwrite non-directory ‘/dev/null’ with directory ‘test_dir/’
Run Code Online (Sandbox Code Playgroud)

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

关联

/home也是一个目录。

Oli*_*Oli 41

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

...但您实际上无法将内容移动到/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
Run Code Online (Sandbox Code Playgroud)

  • 这就是最好的问题的来源。“Dear Ask Ubuntu,我最近错误地将作业移到了 /dev/null,这被吸入了我 90% 的系统配置文件中。我现在每次启动时都会看到莎士比亚的文章。而且我的触控板不起作用。呸! ” (11认同)
  • 您可以尝试创建自己的 /dev/null 副本:`sudo mknod -m 0666 /tmp/mynull c 1 3` --- 然后玩转它;-) (6认同)
  • 不,将文件移动到 /dev/null 将丢弃您的空设备并将其替换为该文件,而不是删除文件的内容。 (2认同)
  • 答案有点模棱两可。将文件移动到 `/dev/null` 不会导致该数据被移至虚无。它会导致数据移动正常,但是`/dev/null` 将被覆盖,因此您可以将其移回:) 另请参阅 http://askubuntu.com/questions/435887/i-can-read -from-dev-null-how-to-fix-it/435892#435892 (2认同)

slm*_*slm 18

/dev/null只是一个文件,它是一个“特殊字符”文件,但它仍然受到文件必须遵循的规则的约束。话虽如此,您永远无法运行此命令:

$ mv ~ /dev/null
Run Code Online (Sandbox Code Playgroud)

mv命令不允许这样做,因为您要将目录移动到文件,这在上下文中没有意义并且mv知道这一点。

例子

$ mkdir dir
$ touch afile
$ mv dir afile
mv: cannot overwrite non-directory ‘afile’ with directory ‘dir’
Run Code Online (Sandbox Code Playgroud)

/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
Run Code Online (Sandbox Code Playgroud)

您对此文件唯一可以做的就是将mv其复制到另一个文件或将其删除。

$ mv /path/to/afile /dev/null
Run Code Online (Sandbox Code Playgroud)

在这个命令之后,/dev/null是一个普通文件。这种变化最危险的影响/dev/null是应该永远不会输出任何数据,所以一些shell脚本会假设

`... < /dev/null` 
Run Code Online (Sandbox Code Playgroud)

相当于说“没什么”。打破这个假设可能会导致随机数据(好吧,最后一个进程写入'/dev/null'的数据)插入到系统周围的系统文件中——这可能导致系统完全损坏且无法恢复。


Adi*_*tya 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
Run Code Online (Sandbox Code Playgroud)

现在开始,/tmp/null是我们/dev/null的所有目的:

让我们在名为 的目录中创建 atest_file和 a 。test_dirask_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
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

现在尝试将我们移动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
Run Code Online (Sandbox Code Playgroud)

命令成功并且test_file不再可用。现在尝试移动test_dir/tmp/null哪个不成功:

$ sudo mv test_dir/ /tmp/null 
mv: cannot overwrite non-directory ‘/tmp/null’ with directory ‘test_dir/’
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

现在,让我们看看我们是否可以test_file/tmp/null以下位置恢复我们的:

$ cat /tmp/null
Let us test if we can recover our test_file.
Run Code Online (Sandbox Code Playgroud)

因此,它仍然存在,并且/tmp/null哪个特殊文件已被覆盖,并且变得像任何其他普通文件一样。我们可以/tmp/null像复制任何其他文件一样通过复制来恢复我们的文件:

$ cp /tmp/null our_test_file
$ cat our_test_file
Let us test if we can recover our test_file.
Run Code Online (Sandbox Code Playgroud)

文件恢复。

笔记:

如果您没有/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
Run Code Online (Sandbox Code Playgroud)

结论:

  • 因此,不可能将目录移动到/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是一个特殊的文件来处理不需要的文件和输入流,正如维基百科文章提到的,它不向从中读取的进程提供任何数据。


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

  • `sudo mv test_file /dev/null` 用 `test_file` 替换了 `/dev/null`。所以在那之后`/dev/null`只是一个普通文件,你可以从中读取你写入的任何内容。***不要那样做*** (4认同)

Ben*_*oit 7

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

echo "Hello World"
Run Code Online (Sandbox Code Playgroud)

Hello World出现在屏幕上。如果您键入:

echo "Hello World" >/dev/null
Run Code Online (Sandbox Code Playgroud)

你在屏幕上看不到任何东西。

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