Ich kann aus / dev / null lesen; wie man es repariert?

80

Ich las den Wikipedia-Artikel über/dev/null und spielte herum, indem ich Dateien nach bewegte /dev/null.

Hierfür habe ich ein erstellt test_fileund einige Inhalte darin abgelegt:

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

Danach habe ich versucht, die Datei zu verschieben /dev/null:

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

Seitdem gab mir das einen Permission deniedFehler; Ich habe wie gewohnt sudovorgegangen, wenn ein Permission deniedFehler aufgetreten ist.

$ sudo mv test_file /dev/null

Der Befehl war erfolgreich und test_fileist im Verzeichnis nicht mehr vorhanden.

Der Wikipedia-Artikel besagt jedoch, dass es nicht möglich ist, etwas wiederherzustellen, das verschoben wurde, /dev/nullund gibt EOFjedem Prozess, der versucht, daraus zu lesen, ein. Aber ich kann lesen von /dev/null:

$ cat /dev/null
This is written by Aditya

Was habe ich falsch gemacht und wie kann ich das Problem beheben /dev/null? Und warum bin ich überhaupt auf Permission deniedFehler gestoßen ?

Aditya
quelle

Antworten:

147

/dev/nullist eine Datei. Eine spezielle Datei. Eine Gerätedatei wie / dev / sda oder / dev / tty, die mit einer Hardware auf Ihrem System kommuniziert.

Der einzige Unterschied /dev/nullbesteht darin, dass keine Hardware damit verbunden ist. Alle an sie gesendeten Daten werden stillschweigend verworfen. Wie der folgende Befehl:

echo "Hello World" > /dev/null

das druckt nichts auf deinem terminal, weil du die ausgabe von echonull, ins leere, also ein schwarzes loch schickst.

Aber als Sie das getan haben, haben mv test_file /dev/nullSie die spezielle Datei /dev/nulldurch eine normale Textdatei ersetzt, die eine Kopie des Inhalts Ihrer Datei enthält test_file. Mit anderen Worten, Sie haben Ihre verloren /dev/null.

Nun müssen Sie (um es zu rekonstruieren):

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

Sie sollten es rekonstruieren, da standardmäßig viele Skripte eine Ausgabe an senden /dev/null. Wenn /dev/nulles sich nicht mehr um ein Schwarzes Loch, sondern um eine normale Textdatei handelt, kann es wachsen, wachsen und Ihr Dateisystem füllen. Und ich bin sicher, dass Sie das vermeiden wollen.

Und viel gefährlicher ist, dass viele Skripte davon ausgehen, dass das Lesen von /dev/nullnichts liest. Wenn Sie diese Annahme nicht einhalten, kann dies dazu führen, dass zufälliger Datenmüll in Dateien rund um Ihr System geschrieben wird.

Und denken Sie daran, dass Linux Multitasking ist: Während Sie mit Linux spielen /dev/null, werden viele Prozesse ausgeführt und können selbst während einiger Sekunden "Zeitfensters" Chaos anrichten.

Wenn Sie damit spielen möchten, /dev/nullkönnen Sie eine Kopie erstellen und damit experimentieren:

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

Erstellt eine /tmp/nullDatei, die genauso funktioniert /dev/null, die Sie jedoch ohne Risiko für Ihr System manipulieren und testen können.

Benoit
quelle
16

Es gibt einen großen Unterschied zwischen dem Überschreiben einer Datei und dem Schreiben in eine Datei.

Wenn Sie etwas schreiben /dev/null , zB

$ echo Hello > /dev/null

... es wird stillschweigend verworfen. Hierfür benötigen Sie Schreibrechte /dev/null, die jeder hat:

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

Wenn Sie überschreiben /dev/null , wie Sie es mit dem mvBefehl getan haben , ersetzen Sie die spezielle Datei /dev/nulldurch das, was Sie dorthin verschoben haben. Mach das nicht! Der Grund, warum Sie dafür Root-Rechte benötigen, ist, dass Sie zum Überschreiben einer Datei Schreibberechtigungen für das Verzeichnis benötigen, in dem sich die Datei befindet. In diesem Fall gilt Folgendes /dev:

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

Geben Sie zum Wiederherstellen /dev/nulldie Befehle ein

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

(Siehe auch U & L StackExchange: So erstellen Sie/dev/null )

Malte Skoruppa
quelle
8

Wenn Sie den Befehl ausführen

$ sudo mv test_file /dev/null

Sie haben ersetzt die spezielle Datei /dev/nullmit Ihrer Textdatei. Nachfolgende Leseversuche /dev/nullgeben den Inhalt Ihrer Textdatei zurück, und Programme, die versuchen, /dev/nullauf die normale Weise zu verwenden, werden wahrscheinlich abgebrochen.

Das Ersetzen oder Löschen von Gerätedateien in /dev/erfordert Superuser-Berechtigungen. Aus diesem Grund ist Ihr Nicht-Sudo-Versuch mit einem Fehler fehlgeschlagen.

Weitere Informationen zum /dev/nullmanuellen Wiederherstellen finden Sie in der Antwort von Benoit. Da der größte Teil (wenn nicht der gesamte) des Inhalts von /dev/jedoch dynamisch von udev verwaltet wird, wird dies wahrscheinlich auch durch einen einfachen Neustart behoben.


quelle
6

Um Ihre Frage zu beantworten, was Sie hätten tun sollen, und eine Datei zu entfernen, gehen Sie wie folgt vor:

rm test_file

Wie andere angegeben haben, ist / dev / null ein Ziel für die Ausgabe von Programmen.

mlv
quelle
2
Ich habe nicht abgelehnt, aber die Frage bezieht sich nicht auf das Entfernen von Dateien ... Ich weiß, dass wir rmDateien / Verzeichnisse entfernen ... Ich habe nur darüber gelesen /dev/nullund um mehr darüber zu verstehen, habe ich versucht, Dateien zu verschieben /dev/nullund zu sehen die Wirkung .. Diese Frage ist zu verstehen, was ich falsch gemacht habe, indem ich Dateien verschoben habe, /dev/nullwodurch ich jetzt daraus lesen kann ... Die Frage ist nicht, wie man Dateien vom System entfernt ... Ich hoffe es ist klar ... Aber Ihre Antwort ist immer noch willkommen und gut genug, um als Antwort aufbewahrt zu werden ... :-)
Aditya
7
Um fair zu sein, verlangt die Frage "Was habe ich falsch gemacht?" Eine Erklärung dessen, was stattdessen hätte getan werden sollen. Es ist wahrscheinlich für die meisten Benutzer trivial, aber keine der anderen Antworten erwähnte es auch nur.
Kapex