Почему перемещение каталогов в / dev / null опасно?

28

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

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

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

Ссылка

Но /homeэто также каталог.

Авинаш Радж
источник

Ответы:

39

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

... но вы не можете на самом деле переместить вещи в /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
Оли
источник
2
Нет, перемещение файла в / dev / null приведет к удалению вашего нулевого устройства и замене его этим файлом, а не избавлению от содержимого файла.
psusi
2
Ответ немного двусмысленный. Перемещение файла в /dev/nullне приведет к перемещению этих данных в ничто. Это приведет к тому, что данные будут перемещены нормально, но /dev/nullбудут перезаписаны, и поэтому вы можете переместить их назад :) Также см. Askubuntu.com/questions/435887/…
Malte Skoruppa
1
Да, потому что sudo mv file /dev/null это удастся, и может легко привести к совершенно непригодной системе. Смотрите мои комментарии по вопросу, связанному в комментарии @MalteSkoruppa. Это еще один яркий пример «готовьтесь, sudoтолько если вы трижды проверили, что знаете, что делаете» ;-)
Rmano
5
Вы можете поэкспериментировать, создав собственную копию / dev / null: sudo mknod -m 0666 /tmp/mynull c 1 3---, а затем поиграть с ней ;-)
Rmano
10
Вот откуда берутся лучшие вопросы. «Уважаемый Ask Ubuntu, я недавно по ошибке переместил свою домашнюю работу в / dev / null, и она была засосана в 90% файлов конфигурации моей системы. Теперь я вижу эссе Шекспира каждый раз, когда я загружаюсь. И мой трекпад не работает. "
Оли
18

/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 '), вставленным в системные файлы по всей системе, что может привести к совершенно сломанной и невосстановимой системе.

ОДС
источник
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

Теперь вперед, /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 "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

Адитья
источник
4
sudo mv test_file /dev/nullзаменяется /dev/nullна test_file. После этого /dev/nullэто просто обычный файл, и вы можете читать из него все, что вы в него записали. НЕ ДЕЛАЙТЕ
ЭТОГО
«Таким образом, невозможно восстановить любой файл, который вы переместили в / dev / null», строго говоря, это не так. Если бы вам пришлось выключить систему, смонтировать ее и запустить восстановление данных, вы вполне могли бы восстановить файл, если он не был перезаписан.
pzkpfw
@FlorianDiesch: обновил ответ :)
Aditya
7

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

echo "Hello World"

Вы попадаете Hello Worldна экран. Если вы введете:

echo "Hello World" >/dev/null

вы ничего не видите на экране.

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

Benoit
источник
каталоги не файлы.
Турбьерн Равн Андерсен
1
@ ThorbjørnRavnAndersen В мире Linux каталоги - это файлы!
Habeeb Perwad
@HabeebPerwad только внутри ядра.
Турбьёрн Равн Андерсен
@ ThorbjørnRavnAndersen Извините, я не попал в ядро, так что понятия не имею :)
Habeeb Perwad
«Потому что все это файл в Linux» - неверно. Есть файлы, а также много других видов объектов. Не уверен, откуда ты это взял.
ggPeti