Warum ist das Verschieben von Verzeichnissen nach / dev / null gefährlich?

28

Beim Versuch, ein test_dirVerzeichnis zu verschieben /dev/null, erhalte ich die Nachricht

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

Warum sagen die Leute dann "Führen Sie den Befehl nicht aus sudo mv ~ /dev/null, er verschiebt Ihr Home-Verzeichnis in eine Lücke?"

Verknüpfung

Ist /homeaber auch ein Verzeichnis.

Avinash Raj
quelle

Antworten:

38

Weil die Leute annehmen. Ich war einer dieser Leute, bis ich es ausprobierte . Es ist leicht zu verstehen, warum die Leute annehmen ... Es sieht gefährlich aus ...

... aber Sie können Dinge nicht wirklich verschieben /dev/null- Es ist eine spezielle Datei, die nur Weiterleitungen absorbiert (und sie ins Nichts schickt). Wenn Sie versuchen, ein Verzeichnis dorthin zu verschieben, explodiert das Dateisystem in Ihrem Gesicht und wenn Sie versuchen, eine Datei dorthin zu verschieben, werden Sie sie wahrscheinlich ersetzen.

Der erste Link befasst sich mit Verzeichnissen, aber hier ist ein separater Test, um es mit einer Datei zu überschreiben. Wie Rmano in den Kommentaren ausführt, sollten Sie dies wahrscheinlich nicht ohne Aufsicht eines Erwachsenen tun. Es besteht das Risiko.

$ 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
Oli
quelle
2
Nein, wenn Sie eine Datei nach / dev / null verschieben, wird Ihr Null-Gerät gelöscht und durch diese Datei ersetzt, ohne dass der Inhalt der Datei gelöscht wird.
Psusi
2
Die Antwort ist etwas mehrdeutig. Das Verschieben einer Datei in /dev/nullführt nicht dazu, dass diese Daten ins Nichts verschoben werden. Es wird in den Daten führen in Ordnung bewegt werden, sondern /dev/nullwird überschrieben, und so können Sie es noch zurück bewegen kann :) Siehe auch askubuntu.com/questions/435887/...
Malte Skoruppa
1
Ja, weil sudo mv file /dev/null es gelingen wird und leicht zu einem völlig unbrauchbaren System führen kann. Siehe meine Kommentare zu der Frage im Kommentar von @MalteSkoruppa. Dies ist ein weiteres klares Beispiel für " sudonur voranstellen , wenn Sie dreimal überprüft haben, dass Sie wissen, was Sie tun" ;-)
Rmano
5
Sie können experimentieren, indem Sie Ihre eigene Kopie von / dev / null erstellen: sudo mknod -m 0666 /tmp/mynull c 1 3--- und dann damit spielen
;-)
10
Hier kommen die besten Fragen her. "Lieber Ask Ubuntu, ich habe kürzlich meine Hausaufgaben versehentlich nach / dev / null verschoben und das hat 90% meiner Systemkonfigurationsdateien erfasst. Jetzt sehe ich jedes Mal, wenn ich hochfahre, Shakespeare-Essays. Und mein Trackpad funktioniert nicht. Halp! "
Oli
18

/dev/nullEs ist nur eine Datei, es ist eine "Sonderzeichendatei", aber es ist nicht weniger an die Regeln gebunden, denen Dateien folgen müssen. Davon abgesehen könnten Sie diesen Befehl niemals ausführen:

$ mv ~ /dev/null

Der mvBefehl lässt dies nicht zu, da Sie ein Verzeichnis in eine Datei verschieben, was im Kontext einfach keinen Sinn ergibt und dies mvweiß.

Beispiel

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

Sie können auch nicht darauf kopieren /dev/null, da es sich um eine Zeichendatei handelt, wenn Sie versuchen, eine reguläre Datei darauf zu kopieren.

$ 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

Mit dieser Datei können mvSie nur eine andere Datei kopieren oder löschen.

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

Nach diesem Befehl /dev/nullbefindet sich eine reguläre Datei. Die gefährlichste Auswirkung dieser Änderung ist, dass niemals Daten ausgegeben werden /dev/nullsollen. Dies wird von einer Reihe von Shell-Skripten angenommen

`... < /dev/null` 

ist gleichbedeutend mit "nichts". Wenn diese Annahme nicht eingehalten wird, kann dies zu zufälligen Daten (also den Daten, die der letzte Prozess in `/ dev / null 'geschrieben hat) führen, die in allen Systemdateien abgelegt werden - was zu einem völlig kaputten und nicht wiederherstellbaren System führen kann.

slm
quelle
13

Sie können Dateien oder andere Eingabestreams in /dev/nullVerzeichnisse schreiben, jedoch nicht in Verzeichnisse. Wenn Sie versuchen, ein Verzeichnis in /dev/nulldieses zu verschieben, wird ein Fehler gemeldet, da /dev/nulles sich nicht um ein Verzeichnis, sondern um eine Datei handelt.

Da Sie jedoch experimentieren möchten /dev/null, sollten Sie zunächst die Konsequenzen kennen, die sich aus dem Verschieben einer zu überschreibenden Datei ergeben, /dev/nullund wissen, wie Sie diese Situation beheben können:

Wie von @Rmano in dieser Antwort auf diese Frage vorgeschlagen, /dev/nullsollten wir zum Experimentieren lieber eine Kopie davon erstellen und dann experimentieren. Erstellen /tmp/nullund verwenden wir es also für unsere Experimentierzwecke:

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

Ab jetzt /tmp/nullist unser /dev/nullfür alle Zwecke:

Lassen Sie uns ein test_fileund ein test_dirin einem Verzeichnis namens erstellen ask_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

Das Folgende zeigt den Inhalt des ask_ubuntuVerzeichnisses:

$ 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

Jetzt versuchen unser bewegen test_filezu /tmp/nullund sehen den Inhalt 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

Der Befehl ist erfolgreich und test_filenicht mehr verfügbar. Versuchen Sie nun, test_dirzu /tmp/nulldem zu gelangen, der nicht erfolgreich ist:

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

test_dirist noch drinnen vorhanden 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

Lassen Sie uns nun herausfinden, ob wir uns erholen können test_filevon /tmp/null:

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

Also, es ist immer noch da und /tmp/nullwelche spezielle Datei wurde überschrieben und es ist wie jede andere normale Datei geworden. Wir können unsere Datei wiederherstellen, indem wir sie /tmp/nullwie jede andere Datei kopieren :

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

Datei wiederhergestellt.

Hinweis:

Wenn Sie /tmp/nulldiese Befehle nicht direkt mit erstellt und ausprobiert haben /dev/null; Stellen Sie sicher, dass Sie die Datei wiederherstellen (falls erforderlich), indem Sie sie ausführen cp /dev/null our_test_file. und stellen Sie es /dev/nullfür die auf unserem System vorhandenen Zwecke wieder her, indem Sie so bald wie möglich die in der verknüpften Frage angegebenen Befehle ausführen:

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

Fazit:

  • Es ist also unmöglich, ein Verzeichnis zu verschieben, /dev/nullund daher besteht keine Frage, ob das Verzeichnis von dort wiederhergestellt werden kann.

  • Wenn Sie Dateien direkt in verschieben /dev/null, können Sie sie wie oben beschrieben wiederherstellen. Es gibt jedoch zwei Ausnahmen:

    1. Während des Zeitraums, in dem Sie ausgeführt werden, sudo mv test_file /dev/nullund cp /dev/null our_test_filewenn ein Root-Skript im System es durch Ausführen echo "Whatever text the root script wants to send to /dev/null" > /dev/null(oder anderer ähnlicher Befehle) überschreibt . Dann haben wir keine einfache Möglichkeit, unsere Datei wiederherzustellen.

    2. Wenn Sie das System zwischen dem Ausführen dieser beiden Befehle neu starten. /dev/nullwird beim Booten neu erstellt, sodass unsere Datei verloren geht, wenn wir den Computer herunterfahren.

  • Wenn Sie jedoch Eingabestreams wie diesen wiederherstellen möchten echo "Stream this line to /dev/null" > /dev/null, können Sie diese /dev/nullDatei nicht wiederherstellen, da es sich um eine spezielle Datei handelt, mit der unerwünschte Dateien und Eingabestreams beseitigt werden. Wie im Wikipedia-Artikel erwähnt, werden keinem Prozess, der davon liest, Daten bereitgestellt.


Referenz: Wikipedia Artikel über/dev/null

Aditya
quelle
4
sudo mv test_file /dev/nullersetzt /dev/nulldurch test_file. Danach /dev/nullist es nur eine normale Datei und Sie können alles lesen, was Sie in sie geschrieben haben. TUN SIE DAS NICHT
Florian Diesch
"Es ist also nicht möglich, eine Datei wiederherzustellen, die Sie nach / dev / null verschoben haben", genau genommen nicht wahr. Wenn Sie das System herunterfahren, mounten und Daten wiederherstellen möchten, können Sie die Datei möglicherweise wiederherstellen, wenn sie nicht überschrieben wurde.
pzkpfw
@FlorianDiesch: Aktualisiert die Antwort :)
Aditya
7

Alles, was an gesendet wird, /dev/nullwird stillschweigend verworfen. Wenn Sie Folgendes eingeben:

echo "Hello World"

Du kommst Hello Worldauf den Bildschirm. Wenn Sie Folgendes eingeben:

echo "Hello World" >/dev/null

Du bekommst nichts auf den Bildschirm.

Aber im Fall des Befehls move versucht der Befehl mv, die Datei / dev / null durch das Verzeichnis zu ersetzen, was nicht möglich ist. Da unter Linux alles eine Datei ist, ist / dev / null eine Datei. Natürlich eine spezielle (eine Gerätedatei), eine spezielle Datei, die den Zugriff auf Hardware (wie Festplatten, Partitionen, Soundkarten, serielle Anschlüsse usw.) ermöglicht. Im Fall von / dev / null ist dies nicht mit Hardware verbunden, sodass die an sie gesendeten Daten stillschweigend verworfen werden. Das ist der Grund, warum "sie" es vielleicht ein Schwarzes Loch genannt haben.

Benoit
quelle
Verzeichnisse sind keine Dateien.
Thorbjørn Ravn Andersen
1
@ ThorbjørnRavnAndersen In der Linux-Welt sind Verzeichnisse Dateien!
Habeeb Perwad
@HabeebPerwad nur im Kernel.
Thorbjørn Ravn Andersen
@ ThorbjørnRavnAndersen Sorry, ich bin nicht in den Kernel gekommen, also keine Ahnung :)
Habeeb Perwad
"Weil unter Linux alles eine Datei ist" - Falsch. Es gibt Dateien und viele andere Arten von Objekten. Ich bin mir nicht sicher, woher du das hast.
ggPeti