Я могу читать из / dev / null; как это исправить?

80

Я прочитал статью/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ошибку; Я продолжал и использовал, sudoкак обычно, когда я сталкиваюсь с Permission deniedошибкой.

$ 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ошибкой?

Адитья
источник

Ответы:

147

/dev/nullэто файл Специальный файл. Файл устройства, такой как / dev / sda или / dev / tty, который взаимодействует с частью оборудования в вашей системе.

Единственное отличие /dev/nullсостоит в том, что с ним не связано ни одно оборудование. Любые данные, которые вы отправляете ему, молча удаляются. Как следующая команда:

echo "Hello World" > /dev/null

который не будет ничего печатать на вашем терминале, потому что вы отправляете вывод echoв null, в пустоту, таким образом, в черную дыру.

Но когда вы это сделали, mv test_file /dev/nullвы заменили специальный файл /dev/nullна обычный текстовый файл, содержащий копию содержимого вашего test_file. Другими словами, вы потеряли свой /dev/null.

Теперь, что вам нужно сделать, это (чтобы восстановить):

sudo rm /dev/null
sudo mknod -m 0666 /dev/null c 1 3

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

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

И помните, что Linux многозадачен: в то время как вы играете /dev/null, многие процессы работают и могут нанести ущерб даже в течение нескольких секунд «окна возможностей».

Если вы хотите поиграть, /dev/nullвы можете создать копию и поэкспериментировать с ней:

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

Создает /tmp/nullфайл, который работает точно так же, /dev/nullно вы можете манипулировать и тестировать без какого-либо риска для вашей системы.

Benoit
источник
16

Существует большая разница между перезаписью файла и записью в файл.

Когда вы пишете что-то /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тем, что переместили туда. Не делай этого! Причина, по которой вам потребовались права суперпользователя, заключается в том, что для перезаписи файла вам необходимы права на запись в каталог, в котором находится файл , в данном случае /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 )

Malte Skoruppa
источник
8

Когда вы запускаете команду

$ sudo mv test_file /dev/null

Вы заменили специальный файл /dev/nullсвоим текстовым файлом. Последующие попытки чтения из /dev/nullвозвращают содержимое вашего текстового файла, и программы, которые пытаются использовать /dev/nullобычным способом, вероятно, потерпят неудачу.

Замена или удаление файлов устройства /dev/требует привилегий суперпользователя, поэтому ваша попытка не-sudo не удалась с ошибкой.

См. Ответ Бенуа для получения информации о том, как восстановить /dev/nullвручную, но, поскольку большая часть (если не все) содержимого /dev/динамически управляется udev, я подозреваю, что простая перезагрузка, вероятно, тоже исправит это.


источник
6

Чтобы ответить на ваш вопрос о том, что вы должны были сделать, чтобы удалить файл, вы делаете:

rm test_file

Как уже говорили другие, / dev / null - это место назначения для вывода программ.

MLV
источник
2
Я не понизил голос, но вопрос не в том, чтобы удалить файл ... Я знаю, что мы используем rmдля удаления файлов / каталогов ... Я только что прочитал /dev/nullи, чтобы понять больше, я попытался переместить файлы /dev/nullи посмотреть, эффект .. Этот вопрос о понимании того, что я сделал не так, перемещая файлы, в /dev/nullрезультате чего я могу читать из него сейчас ... Вопрос не в том, как удалить файлы из системы ... Я надеюсь, что это ясно ... Но ваш ответ по-прежнему приветствуется и достаточно хорош, чтобы его можно было сохранить как ответ ... :-)
Aditya
7
Чтобы быть справедливым, вопрос «Что я сделал неправильно» требует объяснения того, что нужно было сделать вместо этого. Это, вероятно, тривиально для большинства пользователей, но ни один из других ответов даже не упомянул об этом.
Kapex