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

74

Я прочитал статью в Википедии о /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 Error; Я пошел вперед и использовал 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 ?

    
задан Aditya 18.03.2014 в 13:23
источник

5 ответов

137

/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 /dev/null c 1 3
sudo chmod 666 /dev/null

chmod требуется для исправления разрешений, отмеченных надеждой в Ответ .

Вы должны восстановить его, потому что много скриптов отправляет defaut output на /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 18.03.2014 в 13:32
источник
30
8

При запуске команды

$ sudo mv test_file /dev/null

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

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

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

ответ дан user21322 18.03.2014 в 13:30
6

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

rm test_file

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

ответ дан mlv 18.03.2014 в 17:22