/ dev / null'dan okuyabilirim; nasıl düzeltilir?

77

Wikipedia makalesinde /dev/null okudum ve dosyaları /dev/null dosyasına taşıyarak oynatıyorum .

Bunun için test_file oluşturdum ve içeriğine biraz içerik koydum:

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

Daha sonra dosyayı /dev/null :

dosyasına taşımayı denedim:

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

Çünkü bu bana Permission denied Hata verdi; Devam ettim ve sudo hatayla karşılaştığımda normalde yaptığım gibi Permission denied kullanıyorum.

$ sudo mv test_file /dev/null

Komut başarılı oldu ve test_file dizinde artık mevcut değil.

Ancak, Wikipedia makalesinde, /dev/null 'ye taşınan herhangi bir şeyin kurtarılamayacağını ve bundan okumaya çalışan herhangi bir işleme EOF değeri verilebileceğini söylüyor. Ancak, /dev/null adresinden okuyabiliyorum:

$ cat /dev/null
This is written by Aditya

Ne yaptım ve /dev/null 'i normale döndürmeyi nasıl yaparım? Ve neden ilk etapta Permission denied hatasıyla karşılaştım?

    
sordu Aditya 18.03.2014 13:23

4 cevap

141

/dev/null bir dosyadır. Özel bir dosya. Sisteminizde bir donanım parçasıyla ilgili / dev / sda veya / dev / tty gibi bir aygıt dosyası.

/dev/null ile olan tek fark, ona bağlı bir donanım olmamasıdır. Ona gönderdiğiniz tüm veriler sessizce atılır. Aşağıdaki komut gibi:

echo "Hello World" > /dev/null

Terminalinizde herhangi bir şey yazdırmayacaksınız, çünkü echo 'nin çıktısını boşluğa, yani kara deliğe gönderirsiniz.

Ancak, mv test_file /dev/null dosyasını, /dev/null özel dosyanızın yerini normal bir metin dosyasıyla değiştirdiğinizde, test_file 'lerinizin bir kopyasını tutarak. Diğer bir deyişle, /dev/null ’nizi kaybettiniz.

Şimdi, yapmanız gereken şey (yeniden inşa etmek):

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

Yeniden yapılandırmanız gerekir, çünkü varsayılan olarak birçok betik çıktıyı /dev/null 'ye gönderir. % Co_de% artık bir kara delik değil, normal bir metin dosyasıysa, dosya sisteminizi büyüyebilir, büyüyebilir ve doldurabilir. Ve eminim bundan kaçınmak istiyorsun.

Ve çok daha tehlikeli, birçok kod, /dev/null 'den okunmanın hiçbir şey okumayacağını varsayar; Bu varsayımı bozmak, sisteminizin etrafındaki tüm dosyalarda rastgele çöplere yol açabilir ... düzeltmek neredeyse imkansız.

Ve Linux'un çok görevli olduğunu unutmayın: /dev/null ile oynarken, birçok işlem çalışıyor ve birkaç saniye "fırsat penceresi" sırasında bile hasara yol açabilir.

/dev/null ile oynamak istiyorsanız, bir kopya oluşturabilir ve onunla deney yapabilirsiniz:

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

/dev/null olarak tam olarak aynı şekilde çalışan, ancak sisteminiz için herhangi bir risk olmadan işlem yapabileceğiniz ve test edebileceğiniz /tmp/null dosyası oluşturur.

    
verilen cevap Benoit 18.03.2014 13:32
16

Üzerine yazma bir dosya ile bir dosyaya yazmak arasında büyük bir fark var.

Bir şeyler yazdığınızda /dev/null , ör.

$ echo Hello > /dev/null

... sessizce atılır. Bunun için herkesin sahip olduğu /dev/null yazma izni gerekir:

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

/dev/null komutunda yaptığınız gibi, mv 'yi üzerine yazdığınızda, /dev/null özel dosyasını oraya taşındıklarınızla değiştirirsiniz. Bunu yapma! Bunu yapmak için root ayrıcalıklarına sahip olmanızın nedeni, bir dosyanın üzerine yazılması için dosyasında yazma izinlerinin olması gerekir. /dev durumu:

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

/dev/null dosyasını geri yüklemek için komutları verin

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

(Ayrıca bkz. U & L StackExchange: /dev/null nasıl oluşturulur? )

    
verilen cevap Malte Skoruppa 18.03.2014 13:35
8

Komutu çalıştırdığınızda

$ sudo mv test_file /dev/null

Metin dosyanızla değiştirdiğiniz özel /dev/null dosyanız var. Sonraki /dev/null 'den okuma denemesi, metin dosyanızın içeriğini döndürür ve /dev/null ' yi normal şekilde kullanmaya çalışan programlar muhtemelen bozulur.

/dev/ içindeki cihaz dosyalarını değiştirmek veya silmek süper kullanıcı ayrıcalıkları gerektirir; bu nedenle sudo olmayan girişimleriniz bir hatayla başarısız oldu.

/dev/null değerini manuel olarak nasıl geri yükleyeceğiniz hakkında bilgi almak için Benoit'in yanıtına bakın, ancak /dev/ içeriğinin çoğunun (tümü olmasa bile) dinamik olarak udev tarafından yönetildiğinden, basit bir yeniden başlatma işleminin büyük olasılıkla da düzeltileceğinden şüpheleniyorum.

    
verilen cevap user21322 18.03.2014 13:30
6

Yapman gerekeni sormak için, bir dosyayı kaldırmak için şunu yaparsın:

rm test_file

Başkalarının belirttiği gibi, / dev / null, programların çıktısı için bir hedeftir.

    
verilen cevap mlv 18.03.2014 17:22

Etiketlerdeki diğer soruları oku