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


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 )


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 - это место назначения для вывода программ.


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

7
Чтобы быть справедливым, вопрос «Что я сделал неправильно» требует объяснения того, что нужно было сделать вместо этого. Это, вероятно, тривиально для большинства пользователей, но ни один из других ответов даже не упомянул об этом.
Kapex
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.