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

Я прочитал статью Wikipedia о /dev/null и играл вокруг движущимися файлами к /dev/null.

Для этого я создал a 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

С тех пор это дало мне a Permission denied Ошибка; я шел вперед и использовал sudo поскольку я обычно делаю каждый раз, когда я встречаюсь с a Permission denied ошибка.

$ sudo mv test_file /dev/null

За командой следуют и test_file больше не присутствует в каталоге.

Однако в статье Wikipedia говорится, что не возможно восстановить что-либо перемещенное в /dev/null и это дает EOF к любому процессу, который пытается читать из него. Но, я могу читать из /dev/null:

$ cat /dev/null
This is written by Aditya

Что я делал неправильно и как я фиксирую /dev/null назад к нормальному? И почему я встречался Permission denied ошибка во-первых?

81
задан 21 March 2014 в 17:36

4 ответа

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

148
ответ дан 16 November 2019 в 09:51

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

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

17
ответ дан 16 November 2019 в 09:51

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

$ sudo mv test_file /dev/null

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

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

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

8
ответ дан 16 November 2019 в 09:51

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

rm test_file

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

6
ответ дан 16 November 2019 в 09:51

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

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