Mogę czytać z / dev / null; jak to naprawić?

80

Przeczytałem artykuł/dev/null w Wikipedii i bawiłem się, przenosząc pliki do /dev/null.

W tym celu stworzyłem a test_filei umieściłem w nim trochę treści:

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

Następnie próbowałem przenieść plik do /dev/null:

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

Ponieważ dało mi to Permission deniedbłąd; Poszedłem dalej i używałem, sudojak zwykle, za każdym razem, gdy napotkałem Permission deniedbłąd.

$ sudo mv test_file /dev/null

Polecenie powiodło się i test_filenie jest już obecne w katalogu.

Jednak artykuł w Wikipedii mówi, że nie można odzyskać niczego, co zostało przeniesione, /dev/nulli daje EOFdo zrozumienia każdemu procesowi, który próbuje z niego odczytać. Ale mogę czytać z /dev/null:

$ cat /dev/null
This is written by Aditya

Co zrobiłem źle i jak /dev/nullprzywrócić normalność? I dlaczego w ogóle napotkałem Permission deniedbłąd?

Aditya
źródło

Odpowiedzi:

147

/dev/nulljest plikiem. Specjalny plik. Plik urządzenia, taki jak / dev / sda lub / dev / tty, który komunikuje się ze sprzętem w twoim systemie.

Jedyna różnica /dev/nullpolega na tym, że żaden sprzęt nie jest z nim powiązany. Wszelkie przesłane do niego dane są po cichu odrzucane. Podobnie jak następujące polecenie:

echo "Hello World" > /dev/null

który nie wydrukuje niczego na twoim terminalu, ponieważ wysyłasz wynik echozerowy, do pustki, czarna dziura w ten sposób.

Ale kiedy to zrobiłeś mv test_file /dev/null, zastąpiłeś specjalny plik /dev/nullzwykłym plikiem tekstowym, trzymając kopię jego zawartości test_file. Innymi słowy, zgubiłeś /dev/null.

Teraz musisz (zrekonstruować):

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

Powinieneś go zrekonstruować, ponieważ wiele skryptów domyślnie wysyła dane wyjściowe do /dev/null. Jeśli /dev/nullnie jest już czarną dziurą, ale zwykłym plikiem tekstowym, może się powiększać, powiększać i wypełniać system plików. I jestem pewien, że chcesz tego uniknąć.

I o wiele bardziej niebezpieczne, wiele skryptów zakłada, że ​​czytanie z /dev/nullniczego nie przeczyta; złamanie tego założenia może prowadzić do losowego śmieci zapisywanych w plikach w całym systemie ... praktycznie niemożliwe do naprawienia.

I pamiętaj, że Linux jest wielozadaniowy: podczas zabawy /dev/nullwiele procesów jest uruchomionych i może siać spustoszenie nawet w ciągu kilku sekund „okna możliwości”.

Jeśli chcesz się bawić /dev/null, możesz utworzyć kopię i eksperymentować z nią:

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

Utworzy /tmp/nullplik, który działa dokładnie w ten sam sposób, /dev/nullale można nim manipulować i testować bez ryzyka dla systemu.

Benoit
źródło
16

Istnieje duża różnica między nadpisaniem pliku a zapisem do pliku.

Kiedy piszesz coś /dev/null , np.

$ echo Hello > /dev/null

... po cichu zostaje odrzucony. W tym celu potrzebujesz uprawnień do zapisu /dev/null, które każdy ma:

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

Podczas nadpisywania /dev/null , tak jak w przypadku mvpolecenia, zastępujesz specjalny plik tym, /dev/nullco tam przeniesiłeś. Nie rób tego! Powodem, dla którego potrzebujesz do tego uprawnień administratora, jest to, że aby nadpisać plik, musisz mieć uprawnienia do zapisu w katalogu zawierającym plik , w tym przypadku /dev:

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

Aby przywrócić /dev/null, wydaj polecenia

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

(Zobacz także U&L StackExchange: Jak utworzyć/dev/null )

Malte Skoruppa
źródło
8

Po uruchomieniu polecenia

$ sudo mv test_file /dev/null

zostały zastąpione plik specjalny /dev/nullz pliku tekstowego. Kolejne próby odczytu z /dev/nullzawartości pliku tekstowego i programy, które próbują używać /dev/nullw normalny sposób, prawdopodobnie ulegną awarii.

Zastąpienie lub usunięcie plików urządzenia /dev/wymaga uprawnień administratora, dlatego próba nie sudo zakończyła się błędem.

Zobacz odpowiedź Benoit, aby uzyskać informacje na temat /dev/nullręcznego przywracania , ale ponieważ większość (jeśli nie cała) zawartość /dev/jest zarządzana dynamicznie przez udev, podejrzewam, że proste ponowne uruchomienie prawdopodobnie również to naprawi.


źródło
6

Aby odpowiedzieć na pytanie, co powinieneś zrobić, aby usunąć plik, wykonaj następujące czynności:

rm test_file

Jak powiedzieli inni, / dev / null jest miejscem docelowym dla wyjścia programów.

mlv
źródło
2
Nie przegłosowałem, ale pytanie nie dotyczy usuwania plików ... Wiem, że używamy rmdo usuwania plików / katalogów ... Po prostu czytam o tym /dev/nulli aby zrozumieć więcej, próbowałem przenieść pliki /dev/nulli zobaczyć efekt .. To pytanie dotyczy zrozumienia, co zrobiłem źle, przenosząc pliki, /dev/nullw wyniku czego mogę teraz z niego odczytać ... Pytanie nie dotyczy tego, jak usunąć pliki z systemu ... Mam nadzieję, że tak jest jasne ... Ale twoja odpowiedź jest nadal mile widziana i wystarczająco dobra, aby zachować ją jako odpowiedź ... :-)
Aditya
7
Szczerze mówiąc, pytanie „co zrobiłem źle” wzywa do wyjaśnienia, co powinno zostać zrobione. Prawdopodobnie jest to trywialne dla większości użytkowników, ale żadna z pozostałych odpowiedzi nawet o tym nie wspomniała.
kapex