Vraag Ik kan lezen van / dev / null; hoe herstel je het?


ik lees de Wikipedia-artikel op /dev/null en speelde rond door bestanden te verplaatsen naar /dev/null.

Hiervoor heb ik een gemaakt test_file en stop er wat inhoud in:

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

Daarna probeerde ik het bestand naar te verplaatsen /dev/null:

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

Sindsdien gaf dit mij een Permission denied Fout; Ik ging door en gebruikte sudo zoals ik normaal doe wanneer ik een a tegenkom Permission denied fout.

$ sudo mv test_file /dev/null

Het commando is geslaagd en test_file is niet langer aanwezig in de directory.

In het Wikipedia-artikel staat echter dat het niet mogelijk is om iets te herstellen waarnaar wordt verplaatst /dev/null en het geeft een EOF naar elk proces dat ernaar probeert te lezen. Maar ik kan lezen van /dev/null:

$ cat /dev/null
This is written by Aditya

Wat heb ik fout gedaan en hoe los ik het op /dev/null terug naar normaal? En waarom ben ik tegengekomen Permission denied fout in de eerste plaats?


77
2018-03-18 12:23


oorsprong




antwoorden:


/dev/null is een bestand. Een speciaal bestand. Een apparaatbestand als / dev / sda of / dev / tty dat praat met een stukje hardware op uw systeem.

Het enige verschil met /dev/null is dat er geen hardware aan is gekoppeld. Alle gegevens die u ernaar verzendt, worden stilzwijgend weggegooid. Vind het volgende commando leuk:

echo "Hello World" > /dev/null

die niets op uw terminal zal afdrukken omdat u de uitvoer verzendt van echo om nul, naar de leegte, een zwart gat aldus.

Maar toen je dat deed mv test_file /dev/null je hebt het speciale bestand vervangen /dev/null door een normaal tekstbestand, met een kopie van de inhoud van uw test_file. Met andere woorden, je bent je verloren /dev/null.

Wat je nu moet doen is (om het te reconstrueren):

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

Je zou het moeten reconstrueren omdat er veel scripts standaard naar output sturen /dev/null. Als /dev/null is niet langer een zwart gat maar een gewoon tekstbestand, het kan groeien, groeien en je bestandssysteem opvullen. En ik weet zeker dat je dit wilt vermijden.

En nog veel gevaarlijker, veel scripts veronderstellen dat lezen /dev/null zal niets lezen; het verbreken van deze veronderstelling kan leiden tot willekeurige rommel die wordt geschreven in bestanden rondom uw systeem ... praktisch onmogelijk om op te lossen.

En onthoud dat Linux multi-tasking is: terwijl je speelt /dev/null, veel processen draaien en kunnen zelfs tijdens een paar seconden "window of opportunity" grote schade aanrichten.

Als je wilt spelen /dev/null je kunt een kopie maken en ermee experimenteren:

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

Zal een maken /tmp/null bestand dat op precies dezelfde manier werkt /dev/null maar dat je kunt manipuleren en testen zonder enig risico voor je systeem.


141
2018-03-18 12:32





Er is een groot verschil tussen overschrijven een bestand en schrijven naar een bestand.

Wanneer je schrijf iets naar  /dev/nullbijvoorbeeld

$ echo Hello > /dev/null

... het wordt stil weggegooid. Hiervoor heeft u schrijfrechten nodig voor /dev/null, die iedereen heeft:

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

Wanneer je beschrijven  /dev/null, zoals je deed met de mv opdracht, vervangt u het speciale bestand /dev/null met wat je daarheen hebt verplaatst. Doe dit niet! De reden dat u root-rechten nodig had om dat te doen, is omdat u voor het overschrijven van een bestand schrijfrechten nodig hebt naar de map met het bestand, in dit geval /dev:

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

Herstellen /dev/null, geef de commando's uit

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

(Zie ook U & L StackExchange: Hoe te creëren /dev/null)


16
2018-03-18 12:35





Wanneer u de opdracht uitvoert

$ sudo mv test_file /dev/null

jij hebt vervangen het speciale bestand /dev/null met uw tekstbestand. Latere pogingen om te lezen van /dev/null retourneer de inhoud van uw tekstbestand en programma's die proberen te gebruiken /dev/null op de normale manier zal waarschijnlijk breken.

Vervangen of verwijderen van apparaatbestanden in /dev/ vereist Superuser-privileges. Daarom is uw poging om geen poging te ondernemen mislukt met een fout.

Zie Benoit's antwoord voor informatie over hoe te herstellen /dev/null handmatig, maar omdat de meeste (zo niet alle) inhoud van /dev/ wordt dynamisch beheerd door udev, ik vermoed dat een eenvoudige reboot dit waarschijnlijk ook zal repareren.


8
2018-03-18 12:30





Om uw vraag te beantwoorden wat u had moeten doen om een ​​bestand te verwijderen, doet u het volgende:

rm test_file

Zoals anderen al hebben aangegeven, is / dev / null een bestemming voor de uitvoer van programma's.


6
2018-03-18 16:22



Ik heb niet downvote, maar de vraag gaat niet over het verwijderen van bestanden ... Ik weet dat we gebruiken rm om bestanden / mappen te verwijderen ... Ik heb net gelezen over /dev/null en om er meer over te weten, probeerde ik bestanden naar te verplaatsen /dev/null en zie het effect .. Deze vraag gaat over het begrijpen van wat ik fout heb gedaan door bestanden te verplaatsen naar /dev/null waardoor ik er nu vanaf kan lezen ... De vraag gaat niet over hoe je bestanden uit het systeem kunt verwijderen ... Ik hoop dat het duidelijk is ... Maar je antwoord is nog steeds welkom en goed genoeg om als een antwoord... :-) - Aditya
Om eerlijk te zijn, vraagt ​​het vragen "Wat heb ik verkeerd gedaan" om een ​​verklaring van wat er in plaats daarvan had moeten gebeuren. Het is waarschijnlijk triviaal voor de meeste gebruikers, maar geen van de andere antwoorden noemde het zelfs. - kapex