Mengapa memindahkan direktori ke / dev / null berbahaya?

28

Ketika mencoba memindahkan test_dirdirektori /dev/null, saya menerima pesan itu

mv: cannot overwrite non-directory ‘/dev/null’ with directory ‘test_dir/’

Lalu mengapa orang mengatakan "Jangan jalankan perintah sudo mv ~ /dev/null, itu akan memindahkan direktori home Anda ke lubang?"

Link

Tetapi /homejuga merupakan direktori.

Avinash Raj
sumber

Jawaban:

39

Karena orang berasumsi. Saya adalah salah satu dari orang-orang itu sampai saya mengujinya . Sangat mudah untuk memahami mengapa orang menganggap ... Itu terlihat berbahaya ...

... tetapi Anda tidak dapat benar-benar memindahkan sesuatu ke /dev/null- Ini adalah file khusus yang hanya menyerap arahan ulang (dan mengirimkannya ke ketiadaan). Jika Anda mencoba untuk memindahkan direktori ke sana, sistem file akan meledak di wajah Anda dan jika Anda mencoba untuk memindahkan file ke sana, Anda mungkin akan akhirnya menggantinya.

Tautan pertama akan membahas direktori, tetapi inilah tes terpisah hanya untuk menimpanya dengan file. Seperti yang ditunjukkan Rmano dalam komentar, ini mungkin sesuatu yang tidak boleh Anda lakukan tanpa pengawasan orang dewasa. Ada risiko yang terlibat.

$ echo "this is my file" > test
$ cat test
this is my file

$ sudo mv test /dev/null
$ cat /dev/null
this is my file

# Fix this!
$ sudo rm /dev/null
$ sudo mknod -m 0666 /dev/null c 1 3
Oli
sumber
2
Tidak, memindahkan file ke / dev / null akan membuang perangkat null Anda dan menggantinya dengan file itu, tidak membuang konten file.
psusi
2
Jawabannya agak ambigu. Memindahkan file ke /dev/nulltidak akan menyebabkan data dipindahkan ke ketiadaan. Ini akan menghasilkan data yang dipindahkan baik-baik saja, tetapi /dev/nullakan ditimpa, dan sehingga Anda dapat memindahkannya kembali :) Juga lihat askubuntu.com/questions/435887/…
Malte Skoruppa
1
Yap, karena sudo mv file /dev/null akan berhasil, dan dapat dengan mudah menyebabkan sistem yang sama sekali tidak dapat digunakan. Lihat komentar saya pada pertanyaan yang ditautkan dalam komentar @Malte Skoruppa. Ini adalah contoh lain yang jelas dari " sudohanya tergantung jika Anda tiga kali memeriksa Anda tahu apa yang Anda lakukan" ;-)
Rmano
5
Anda dapat melakukan percobaan membuat salinan / dev / null Anda sendiri: sudo mknod -m 0666 /tmp/mynull c 1 3--- dan kemudian memainkannya ;-)
Rmano
10
Di sinilah pertanyaan terbaik berasal. "Dear Ask Ubuntu, saya baru-baru ini memindahkan pekerjaan rumah saya ke / dev / null secara tidak sengaja dan tersedot ke dalam 90% file konfigurasi sistem saya. Saya sekarang melihat esai Shakespeare setiap kali saya boot. Dan trackpad saya tidak berfungsi. Halp! "
Oli
18

/dev/nullhanyalah sebuah file, ini adalah file "karakter khusus" tetapi itu tidak kurang masih terikat oleh aturan bahwa file harus mengikuti. Dikatakan bahwa Anda tidak pernah dapat menjalankan perintah ini:

$ mv ~ /dev/null

The mvperintah tidak akan membiarkan ini karena Anda pindah direktori ke file, yang hanya tidak masuk akal kontekstual dan mvtahu ini.

Contoh

$ mkdir dir
$ touch afile
$ mv dir afile
mv: cannot overwrite non-directory ‘afile’ with directory ‘dir’

Anda tidak dapat menyalin ke /dev/nullsalah satu, mengingat itu file karakter, jika Anda mencoba untuk menyalin file biasa ke dalamnya.

$ cp ~/bzip2_1.0.6-4_amd64.deb /dev/null
$ ls -l |grep null
crw-rw-rw-  1 root root        1,   3 Mar 16 14:25 null

Satu-satunya hal yang dapat Anda lakukan untuk file ini adalah menyalinnya mvke file lain atau menghapusnya.

$ mv /path/to/afile /dev/null

Setelah perintah ini, /dev/nulladalah file biasa. Efek paling berbahaya dari perubahan ini adalah yang /dev/nullseharusnya tidak pernah menampilkan data apa pun, sehingga sejumlah skrip shell akan menganggap itu

`... < /dev/null` 

sama dengan mengatakan "tidak ada". Adanya asumsi yang rusak ini dapat menyebabkan data acak (well, data proses terakhir yang ditulis ke `/ dev / null ') dimasukkan dalam file sistem di sekitar sistem --- yang dapat menyebabkan sistem yang benar-benar rusak dan tidak dapat dipulihkan.

slm
sumber
13

Anda dapat menulis file atau aliran input lainnya /dev/nulltetapi tidak ke direktori. Jika Anda mencoba memindahkan direktori ke /dev/nullsana akan melaporkan kesalahan karena /dev/nullbukan direktori tetapi file.

Namun, karena Anda ingin bereksperimen /dev/null, Anda pertama-tama disarankan untuk mengetahui konsekuensi memindahkan file yang akan ditimpa /dev/nulldan cara memulihkan dari situasi itu:

Seperti yang disarankan oleh @Rmano dalam jawaban untuk pertanyaan itu, untuk bereksperimen dengan /dev/nullkita sebaiknya membuat salinannya dan kemudian melakukan eksperimen kita. Jadi, mari buat /tmp/nulldan gunakan untuk tujuan eksperimen kami:

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

Sekarang dan seterusnya, /tmp/nulladalah milik kita /dev/nulluntuk semua tujuan:

Mari kita buat test_filedan test_dirdi dalam direktori bernama ask_ubuntu.

$ mkdir ask_ubuntu
$ cd ask_ubuntu
$ touch test_file
$ mkdir test_dir
$ echo "Let us test if we can recover our test_file." > test_file

Berikut ini menunjukkan isi ask_ubuntudirektori:

$ ls -la
total 12
drwxr-xr-x 3 aditya aditya 4096 Mar 18 17:10 .
drwxr-xr-x 4 aditya aditya 4096 Mar 18 17:10 ..
drwxr-xr-x 2 aditya aditya 4096 Mar 18 17:10 test_dir
-rw-r--r-- 1 aditya aditya    0 Mar 18 17:10 test_file

Sekarang cobalah untuk pindah test_fileke /tmp/nulldan melihat isi ask_ubuntu:

$ sudo mv test_file /tmp/null   # This succeeds
$ ls -la
total 12
drwxr-xr-x 3 aditya aditya 4096 Mar 18 17:12 .
drwxr-xr-x 4 aditya aditya 4096 Mar 18 17:10 ..
drwxr-xr-x 2 aditya aditya 4096 Mar 18 17:10 test_dir

Perintah berhasil dan test_filetidak lagi tersedia. Sekarang cobalah untuk pindah test_dirke /tmp/nullyang tidak berhasil:

$ sudo mv test_dir/ /tmp/null 
mv: cannot overwrite non-directory ‘/tmp/null’ with directory ‘test_dir/’

test_dirmasih ada di dalam ask_ubuntu:

$ ls -la
total 12
drwxr-xr-x 3 aditya aditya 4096 Mar 18 17:12 .
drwxr-xr-x 4 aditya aditya 4096 Mar 18 17:10 ..
drwxr-xr-x 2 aditya aditya 4096 Mar 18 17:10 test_dir

Sekarang, mari kita bayangkan jika kita dapat memulihkan test_filedari /tmp/null:

$ cat /tmp/null
Let us test if we can recover our test_file.

Jadi, itu masih ada dan /tmp/nullyang merupakan file khusus telah ditimpa dan telah menjadi seperti file normal lainnya. Kami dapat memulihkan file kami dengan menyalin /tmp/nullseperti file lainnya:

$ cp /tmp/null our_test_file
$ cat our_test_file
Let us test if we can recover our test_file.

File pulih.

catatan:

Jika Anda tidak membuat /tmp/nulldan mencoba perintah-perintah itu secara langsung menggunakan /dev/null; pastikan Anda memulihkan file (jika perlu) dengan menjalankan cp /dev/null our_test_file; dan pulihkan /dev/nulluntuk keperluan yang ada pada sistem kami dengan menjalankan perintah berikut sebagaimana diberikan dalam pertanyaan terkait secepatnya:

$ sudo rm /dev/null
$ sudo mknod /dev/null c 1 3
$ sudo chmod 666 /dev/null

Kesimpulan:

  • Jadi, tidak mungkin untuk memindahkan direktori ke /dev/nulldan karenanya tidak ada pertanyaan untuk memulihkan direktori dari sana.

  • Sejauh menyangkut file, jika Anda langsung memindahkan file ke /dev/null, Anda masih dapat memulihkannya seperti yang ditunjukkan di atas. Namun, ada dua pengecualian:

    1. Selama periode Anda menjalankan sudo mv test_file /dev/nulldan cp /dev/null our_test_file, jika ada script root dalam sistem menimpanya dengan menjalankan echo "Whatever text the root script wants to send to /dev/null" > /dev/null(atau perintah serupa lainnya). Maka kita tidak memiliki cara mudah untuk memulihkan file kita.

    2. Jika Anda me-reboot sistem antara menjalankan kedua perintah itu. /dev/nullakan dibuat ulang saat boot, sehingga file kami hilang saat kami mematikan komputer.

  • Tetapi jika Anda ingin memulihkan aliran input seperti echo "Stream this line to /dev/null" > /dev/null, Anda tidak dapat memulihkan bahwa karena /dev/nullmerupakan file khusus untuk membuang file yang tidak diinginkan dan input stream dan seperti yang disebutkan dalam artikel Wikipedia, artikel ini tidak menyediakan data apa pun untuk proses yang membaca dari itu.


Referensi: Artikel Wikipedia pada/dev/null

Aditya
sumber
4
sudo mv test_file /dev/nullmenggantikan /dev/nulldengan test_file. Jadi setelah itu /dev/nullhanya file normal dan Anda dapat membaca apa pun yang Anda tulis di dalamnya. JANGAN MELAKUKANNYA
Florian Diesch
"Jadi, tidak mungkin untuk memulihkan file apa pun yang telah Anda pindahkan ke / dev / null" sebenarnya tidak benar. Jika Anda mematikan sistem, memasang dan menjalankan pemulihan data di dalamnya, Anda mungkin dapat memulihkan file jika belum ditimpa.
pzkpfw
@FlorianDiesch: Memperbarui jawabannya :)
Aditya
7

Semua yang dikirim ke /dev/nulldibuang secara diam-diam. Jika Anda mengetik:

echo "Hello World"

Anda mendapatkan Hello Worlddi layar. Jika Anda mengetik:

echo "Hello World" >/dev/null

Anda tidak mendapatkan apa pun di layar.

Tetapi dalam kasus perintah pindah, perintah mvmencoba mengganti file / dev / null dengan direktori, apa yang tidak mungkin. Karena semuanya adalah file di Linux, / dev / null adalah file. Yang khusus tentu saja (file perangkat), file khusus yang memungkinkan mengakses perangkat keras (seperti disk, partisi, kartu suara, port serial, ...). Dalam kasus / dev / null, ini tidak terkait dengan perangkat keras apa pun sehingga data yang dikirim ke perangkat tersebut akan dibuang secara diam-diam. Inilah sebabnya mengapa "mereka" mungkin menyebutnya lubang hitam.

Benoit
sumber
direktori bukan file.
Thorbjørn Ravn Andersen
1
@ ThorbjørnRavnAndersen Di dunia Linux, direktori adalah file!
Habeeb Perwad
@HabeebPerwad hanya di dalam kernel.
Thorbjørn Ravn Andersen
@ ThorbjørnRavnAndersen Maaf, saya tidak masuk ke kernel, jadi tidak tahu :)
Habeeb Perwad
"Karena semuanya adalah file di Linux" - Salah. Ada file dan juga banyak jenis objek lainnya. Tidak yakin dari mana Anda mendapat ini.
ggPeti