Dizinleri neden / dev / null konumuna taşımak tehlikelidir?


28

Bir test_dirdizini taşımayı denediğimde /dev/nullmesajı alıyorum.

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

Öyleyse neden insanlar "Komutu çalıştırma, sudo mv ~ /dev/nullana dizini bir deliğe taşıyacak mı?" Diyorlar.

bağlantı

Ama /homeaynı zamanda bir dizin.

Yanıtlar:


39

Çünkü insanlar varsayıyor. Test edene kadar o insanlardan biriydim . İnsanların neden varsaydıklarını anlamak kolaydır ... Tehlikeli görünüyor ...

... ama aslında şeyleri taşıyamazsınız /dev/null- Bu sadece yönlendirmeleri emen (ve hiçlik içine gönderen) özel bir dosyadır. Bir dizini bu dizine taşımaya çalışırsanız, dosya sistemi yüzünüze ayrıntılı bir şekilde patlar ve bir dosyayı taşımaya çalışırsanız, muhtemelen onu değiştirirsiniz.

İlk link dizinlerle ilgilenecektir, fakat işte sadece dosyanın üzerine yazması için ayrı bir test. Rmano yorumlarda da belirtildiği gibi, bu muhtemelen yetişkin gözetimi olmadan yapmamanız gereken bir şey. İlgili risk var.

$ 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

2
Hayır, bir dosyayı / dev / null dizinine taşımak boş aygıtınızı atar ve dosyanın içeriğinden kurtulmaz, o dosyayla değiştirir.
psusi

2
Cevap biraz belirsiz. Bir dosyayı taşımak /dev/null, verilerin bir hiçliğe taşınmasına neden olmaz. Bu, verilerin doğru şekilde taşınmasına neden olur, ancak /dev/nullüzerine yazılır ve böylece henüz geri dönebilirsiniz :) Ayrıca bkz. Askubuntu.com/questions/435887/…
Malte Skoruppa

1
Evet, çünkü başarılı sudo mv file /dev/null olacak ve kolayca tamamen kullanılamaz bir sisteme götürebilir. @MalteSkoruppa'nın yorumunda bağlantı verilen soru hakkındaki yorumlarıma bakın. Bu "prepend başka açık bir örneğidir sudoEğer üç kere sen yı yalnızca biliyorum ;-) ne yaptığını"
Rmano

5
Kendi / dev / null kopyasını oluşturma denemesini yapabilirsiniz: sudo mknod -m 0666 /tmp/mynull c 1 3--- ve sonra onunla oynayın ;-)
Rmano

10
En iyi soruların geldiği yer burasıdır. “Sevgili Ask Ubuntu'ya, yakın zamanda ödevimi / dev / null'a yanlışlıkla taşıdım ve sistem konfigürasyon dosyalarımın% 90'ına emildim. Artık her önyüklememde Shakespeare makaleleri görüyorum. "
Oli

18

/dev/nullsadece bir dosyadır, "özel karakter" bir dosyadır, fakat dosyaların uyması gereken kurallar tarafından korunma zorunluluğu yoktur. Bu komutu asla yönetemeyeceğiniz söyleniyor:

$ mv ~ /dev/null

mvBir dosyanın bir dizin taşıyoruz beri sadece bağlamsal anlam ve etmediğini komut, buna izin vermez mvbunu biliyor.

Örnek

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

Sen üzerine kopyalayamazsınız /dev/nullbunun üzerine düzenli bir dosyayı kopyalamak çalışırsanız o, bir karakter dosyasıdır verilen ya.

$ 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

Bu dosyaya yapabileceğiniz tek şey hakkında mvbaşka bir dosyanın üzerine kopyalamak veya silmek.

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

Bu komuttan sonra /dev/nullnormal bir dosyadır. Bu değişikliğin en tehlikeli etkisi, hiçbir zaman herhangi bir veri çıkmaması/dev/null gerektiği , bu nedenle bir dizi kabuk betiği,

`... < /dev/null` 

"hiçbir şey" demek eşittir. Bu varsayımın kırılması, sistemin her yerine sistem dosyalarına eklenmiş rastgele verilere (son işlemin “/ dev / null” a yazdığı veriler) yol açabilir - bu da tamamen kırılmış ve kurtarılamaz bir sisteme yol açabilir.


13

Dosyaları veya diğer girdi akışlarını /dev/nulldizinlere yazabilir ancak dizine yazamazsınız . Bir dizini taşımaya çalışırsanız , bir dizin değil bir dosya /dev/nullolduğundan bir hata rapor eder /dev/null.

Ancak, denemek istediğiniz için /dev/nullilk önce bir dosyayı üzerine yazmak için taşımanın sonuçlarını /dev/nullve bu durumdan nasıl kurtarılacağını bilmeniz önerilir :

@Rmano tarafından bu sorunun cevabında önerildiği gibi , denemeler yapmak /dev/nulliçin bir kopyasını oluşturup deneyimizi yapmalıyız. Öyleyse /tmp/nulldeneylerimiz için oluşturalım ve kullanalım:

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

Şimdi itibaren, /tmp/nullOur olan /dev/nulltüm amaçlar için:

Bir dizin içinde bir test_fileve bir tane yaratalım .test_dirask_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

Aşağıdaki ask_ubuntudizinin içeriğini gösterir :

$ 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

Şimdi bizim taşımak için denemek test_fileiçin /tmp/nullve içeriğini görmek 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

Komut başarılı ve test_fileartık mevcut değil. Şimdi taşımak deneyin test_diriçin /tmp/nullbaşarısız olan:

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

test_dirhala içinde var 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

Şimdi, bizim kurtarabilirsiniz eğer bizi anlamaya izin test_filedan /tmp/null:

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

Yani, hala orada ve /tmp/nullhangi özel bir dosyanın üzerine yazılmış ve herhangi bir diğer normal dosya gibi oldu. /tmp/nullBaşka bir dosyadaki gibi kopyalayarak dosyamızı kurtarabiliriz :

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

Dosya kurtarıldı.

Not:

/tmp/nullBu komutları doğrudan kullanarak oluşturmadıysanız ve denediyseniz /dev/null; çalıştırarak dosyayı (gerekirse) kurtardığınızdan emin olun cp /dev/null our_test_file; ve /dev/nullbağlantılı soruda verildiği gibi aşağıdaki komutları mümkün olan en kısa sürede çalıştırarak sistemimizde var olan amaçlar için geri yükleme yapın :

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

Sonuç:

  • Bu nedenle, bir dizini taşımak imkansızdır /dev/nullve bu nedenle dizini oradan kurtarma sorunu yoktur.

  • Dosyalar söz konusu olduğunda, dosyaları doğrudan doğrudan taşırsanız /dev/null, yukarıda gösterildiği gibi yine de kurtarabilirsiniz. Ancak, iki istisna vardır:

    1. Çalıştığınız süre boyunca sudo mv test_file /dev/nullve cp /dev/null our_test_fileeğer sistemdeki herhangi bir kök komut dosyası çalıştırılarak echo "Whatever text the root script wants to send to /dev/null" > /dev/null(veya benzer komutların üzerine) yazar. O zaman dosyamızı kurtarmanın kolay bir yolu yok.

    2. Bu iki komutu çalıştırmak arasında sistemi yeniden başlatırsanız. /dev/nullönyükleme sırasında yeniden oluşturulur, böylece bilgisayarı kapattığımızda dosyamız kaybolur.

  • Ancak, giriş akışlarını kurtarmak echo "Stream this line to /dev/null" > /dev/nullistiyorsanız, /dev/nullistenmeyen dosyaları ve giriş akışlarını elden çıkarmak için özel bir dosya olduğundan ve Wikipedia makalesinde de belirtildiği gibi, bu kitaptan okunan bir işlem için herhangi bir veri sağlamaz.


Referans: Wikipedia makalesi/dev/null


4
sudo mv test_file /dev/nullyerini /dev/nullile test_file. Bundan sonra /dev/nullsadece normal bir dosya ve içine yazdığınız her şeyi ondan okuyabilirsiniz. Yapmayın
Florian Diesch

“Yani, / dev / null'a taşıdığınız hiçbir dosyayı kesinlikle doğru değil” ifadesiyle kurtarmak mümkün değildir. Sistemi kapatırsanız, kurar ve üzerine veri kurtarmayı çalıştırırsanız, üzerine yazılmamışsa dosyayı kurtarabilirsiniz.
pzkpfw

@FlorianDiesch: Cevap güncellendi :)
Aditya

7

Gönderilen her şey /dev/nullsessizce atılır. Eğer yazarsanız:

echo "Hello World"

Alacağınız Hello Worldekranda. Eğer yazarsanız:

echo "Hello World" >/dev/null

Ekranda hiçbir şey bulamazsınız.

Ancak, move komutu durumunda, komut mv/ dev / null dosyasını dizine göre değiştiremez. Çünkü her şey Linux'ta bir dosya olduğundan, / dev / null bir dosyadır. Tabii ki özel bir cihaz (bir cihaz dosyası), donanıma (diskler, bölmeler, ses kartları, seri portlar, ... gibi) erişim sağlayan özel bir dosya / Dev / null durumunda, bu herhangi bir donanım parçasına bağlı değildir, bu yüzden kendisine gönderilen veriler sessizce atılır. Bu yüzden “onlar” karadelik olarak adlandırmış olabilir.


dizinler dosya değildir.
Thorbjørn Ravn Andersen

1
@ ThorbjørnRavnAndersen Linux dünyasında, dizinler dosya!
Habeeb Perwad

@HabeebPerwad sadece çekirdeğin içinde.
Thorbjørn Ravn Andersen

@ ThorbjørnRavnAndersen Üzgünüm, çekirdeğe
girmedim

"Çünkü her şey Linux'ta bir dosyadır" - Yanlış. Dosyalar ve ayrıca birçok başka türde nesne var. Bunu nereden aldığınızdan emin değilim.
ggPeti
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.