Saya dapat membaca dari / dev / null; bagaimana memperbaikinya?

80

Saya membaca artikel Wikipedia/dev/null dan bermain-main dengan memindahkan file ke /dev/null.

Untuk ini saya membuat test_filedan menaruh beberapa konten di dalamnya:

$ touch test_file
$ echo "This is written by Aditya" > test_file
$ cat test_file
This is written by Aditya

Setelah itu saya mencoba memindahkan file ke /dev/null:

$ mv test_file /dev/null
mv: inter-device move failed: ‘test_file’ to ‘/dev/null’; unable to remove target: Permission denied

Karena, ini memberi saya Permission deniedKesalahan; Saya pergi ke depan dan menggunakan sudoseperti biasa ketika saya menemukan Permission deniedkesalahan.

$ sudo mv test_file /dev/null

Perintah berhasil dan test_filetidak lagi ada di direktori.

Namun, artikel Wikipedia mengatakan bahwa tidak mungkin untuk memulihkan apa pun yang dipindahkan ke /dev/nulldan memberikan EOFproses apa pun yang mencoba untuk membacanya. Tapi, saya bisa membaca dari /dev/null:

$ cat /dev/null
This is written by Aditya

Apa yang saya lakukan salah dan bagaimana cara memperbaikinya /dev/nullkembali normal? Dan mengapa saya menemukan Permission deniedkesalahan sejak awal?

Aditya
sumber

Jawaban:

147

/dev/nulladalah file. File khusus. File perangkat seperti / dev / sda atau / dev / tty yang berbicara ke perangkat keras pada sistem Anda.

Satu-satunya perbedaan /dev/nulladalah tidak ada perangkat keras yang terhubung dengannya. Data apa pun yang Anda kirim akan dibuang secara diam-diam. Seperti perintah berikut:

echo "Hello World" > /dev/null

yang tidak akan mencetak apa pun di terminal Anda karena Anda mengirim output echoke null, ke void, black hole demikian.

Tetapi ketika Anda melakukannya, mv test_file /dev/nullAnda telah mengganti file khusus dengan file /dev/nullteks biasa, memegang salinan konten Anda test_file. Dengan kata lain, Anda kehilangan /dev/null.

Sekarang, yang harus Anda lakukan adalah (merekonstruksi itu):

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

Anda harus merekonstruksinya karena banyak skrip secara default mengirim output ke /dev/null. Jika /dev/nulltidak ada lagi lubang hitam tapi file teks biasa, itu bisa tumbuh, tumbuh dan mengisi sistem file Anda. Dan saya yakin Anda ingin menghindari ini.

Dan jauh lebih berbahaya, banyak naskah menganggap bahwa membaca dari tidak /dev/nullakan membaca apa pun; melanggar asumsi ini dapat menyebabkan sampah acak yang ditulis dalam file di sekitar sistem Anda ... praktis mustahil untuk diperbaiki.

Dan ingat bahwa Linux multi-tasking: saat Anda bermain /dev/null, banyak proses sedang berjalan dan dapat mendatangkan malapetaka bahkan selama beberapa detik "jendela peluang".

Jika Anda ingin bermain, /dev/nullAnda dapat membuat salinan dan bereksperimen dengannya:

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

Akan membuat /tmp/nullfile yang bekerja dengan cara yang persis sama /dev/nulltetapi Anda dapat memanipulasi dan menguji tanpa risiko untuk sistem Anda.

Benoit
sumber
16

Ada perbedaan besar antara menimpa file dan menulis ke file.

Ketika Anda menulis sesuatu /dev/null , misalnya,

$ echo Hello > /dev/null

... itu akan dibuang secara diam-diam. Untuk ini, Anda perlu menulis izin /dev/null, yang dimiliki setiap orang:

$ ls -l /dev/null 
crw-rw-rw- 1 root root 1, 3 Mar 18 13:17 /dev/null

Ketika Anda menimpa /dev/null , seperti yang Anda lakukan dengan mvperintah, Anda mengganti file khusus /dev/nulldengan apa pun yang Anda pindah ke sana. Jangan lakukan ini! Alasan Anda memerlukan hak akses root untuk melakukan itu adalah karena untuk menimpa file, Anda perlu menulis izin ke direktori yang berisi file , dalam hal ini /dev:

$ ls -ld /dev
drwxr-xr-x 16 root root 4640 Mar 18 13:17 /dev

Untuk memulihkan /dev/null, jalankan perintah

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

(Juga lihat U&L StackExchange: Cara membuat/dev/null )

Malte Skoruppa
sumber
8

Saat Anda menjalankan perintah

$ sudo mv test_file /dev/null

Anda telah mengganti file khusus /dev/nulldengan file teks Anda. Upaya selanjutnya untuk membaca dari /dev/nullmengembalikan konten file teks Anda, dan program yang mencoba menggunakan /dev/nulldengan cara normal mungkin akan rusak.

Mengganti atau menghapus file perangkat di /dev/membutuhkan hak pengguna super, itulah sebabnya upaya non-sudo Anda gagal dengan kesalahan.

Lihat jawaban Benoit untuk informasi tentang cara mengembalikan /dev/nullsecara manual, tetapi karena sebagian besar (jika tidak semua) konten /dev/dikelola secara dinamis oleh udev, saya menduga reboot sederhana mungkin akan memperbaikinya juga.


sumber
6

Untuk menjawab pertanyaan Anda tentang apa yang harus Anda lakukan, untuk menghapus file, Anda lakukan:

rm test_file

Seperti yang telah dinyatakan orang lain, / dev / null adalah tujuan untuk keluaran program.

mlv
sumber
2
Saya tidak downvote, tetapi pertanyaannya bukan tentang menghapus file ... Saya tahu kita gunakan rmuntuk menghapus file / direktori ... Saya baru saja membaca /dev/nulldan untuk memahami lebih lanjut tentang hal itu, saya mencoba untuk memindahkan file ke /dev/nulldan melihat efeknya .. Pertanyaan ini adalah tentang memahami apa yang saya lakukan salah dengan memindahkan file /dev/nullsehingga saya dapat membacanya sekarang ... Pertanyaannya bukan tentang cara menghapus file dari sistem ... Saya harap ini adalah jelas ... Tetapi jawaban Anda masih diterima dan cukup baik untuk dijaga sebagai jawaban ... :-)
Aditya
7
Agar adil, menanyakan "Apa yang saya lakukan salah" semacam panggilan untuk penjelasan tentang apa yang seharusnya dilakukan. Mungkin sepele bagi sebagian besar pengguna tetapi tidak ada jawaban lain yang menyebutkannya.
kapex