Перемещение файла или каталога в / dev / null [дубликат]

При попытке переместить каталог test_dir в / dev / null , я получаю сообщение

mv: cannot overwrite non-directory ‘/dev/null’ with directory ‘test_dir/’

Тогда почему люди говорят: «Не запускайте команду sudo mv ~ / dev / null , она переместит ваш домашний каталог в дыру?»

Ссылка

Но / home также является каталогом.

30
задан 5 May 2014 в 18:17

4 ответа

Потому что люди предполагают. Я был одним из тех людей , пока не проверил его .Легко понять, почему люди считают ... Это выглядит опасным ...

... но на самом деле вы не можете перемещать вещи в / dev / null - это специальный файл, который просто поглощает редиректы (и отправляет их в небытие). Если вы попытаетесь переместить в него каталог, файловая система громко взорвется вам в лицо, и если вы попытаетесь переместить в него файл, вы, вероятно, в конечном итоге замените его.

Первая ссылка будет иметь дело с каталогами, но вот отдельный тест просто на перезапись его файлом. Как отмечает Рмано в комментариях, это, вероятно, то, что вам не следует делать без присмотра взрослых. Это связано с риском.

$ 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
42
ответ дан 5 January 2021 в 23:11

Все, что отправлено в / dev / null , автоматически отбрасывается. Если вы наберете:

echo "Hello World"

, вы получите Hello World на экране. Если вы наберете:

echo "Hello World" >/dev/null

, на экране ничего не появится.

Но в случае команды перемещения, команда mv попытается заменить файл / dev / null на каталог , что невозможно. Поскольку в Linux все является файлом, / dev / null - это файл. Разумеется, специальный (файл устройства), специальный файл, позволяющий получить доступ к аппаратному обеспечению (например, дискам, разделам, звуковым картам, последовательным портам и т. Д.). В случае / dev / null он не связан с каким-либо оборудованием, поэтому отправленные на него данные автоматически отбрасываются. Вот почему «они», возможно, назвали это черной дырой.

7
ответ дан 5 January 2021 в 23:11

Вы можете записывать файлы или другие входные потоки в / 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 для всех целей:

Давайте создадим test_file и test_dir внутри каталога с именем ask_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

Ниже показано содержимое ] каталог 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 :

$ 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 , вы все равно можете восстановить его, как показано выше. Однако есть два исключения:

    1. Во время выполнения sudo mv test_file / dev / null и cp / dev / null our_test_file , если какой-либо корневой сценарий в системе перезаписывает это можно сделать, запустив echo «Любой текст, который корневой скрипт хочет отправить в / dev / null»> / dev / null (или другие подобные команды). Тогда у нас не будет простого способа восстановить наш файл.

    2. Если вы перезагрузите систему между выполнением этих двух команд. / dev / null создается повторно при загрузке, поэтому наш файл теряется при выключении компьютера.

  • Но если вы хотите восстановить входные потоки, такие как echo "Передайте эту строку в / dev / null "> / dev / null , вы не можете восстановить это, поскольку / dev / null - это специальный файл для удаления ненужных файлов и входных потоков, и, как упоминается в статье Википедии, это не так. не предоставляют никаких данных процессу, который читает из него.


Ссылка: Статья в Википедии на / dev / null

13
ответ дан 5 January 2021 в 23:11

/ 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 должен никогда не выводить какие-либо данные, поэтому некоторые сценарии оболочки будут считать, что

`... < /dev/null` 

эквивалентно слову " ничего". Несоблюдение этого предположения может привести к тому, что случайные данные (ну, данные, которые последний процесс записал в `/ dev / null ') будут вставлены в системные файлы по всей системе, что может привести к поломке и невозможности восстановления системы.

18
ответ дан 5 January 2021 в 23:11

Другие вопросы по тегам:

Похожие вопросы: