Warum kann ich Dinge nach / dev / null verschieben, obwohl es sich um ein Pseudogerät handelt, das durch eine Datei dargestellt wird?

7

Ich habe immer an /dev/nullein Schwarzes Loch gedacht , so dass alle Daten, die ich dorthin sende, nicht zurückgesendet werden. Es gibt jedoch ein Problem mit dieser Definition. Laut Wikipedia:

/ dev / null ist eine spezielle Datei, kein Verzeichnis, daher kann man mit dem Unix-Befehl mv keine Dateien hinein verschieben.

Warum kann ich nach dieser Definition mvdort stopfen? Zum Beispiel kann ich leicht tun:

# touch oi
# mv oi /dev/null

Was ist da los?

Marcos Roriz Junior
quelle
2
[Zitat benötigt]
3
Es funktioniert nicht bei mir. Welches Betriebssystem verwenden Sie?

Antworten:

8

Wenn Sie versuchen, etwas unter einem einfachen Benutzer (nicht root) nach / dev / null zu verschieben, wird eine Permission deniedFehlermeldung angezeigt, da mv something /dev/nulltatsächlich versucht wird, etwas zu löschen /dev/nullund dann zu dem zu verschieben something, was /dev/nullwar.

Wenn Sie es unter root zu tun , werden versuchen, es wird löschen /dev/null(und dann die Datei , indem Sie in ihm Platz zur Verfügung gestellt bewegen)! Sie können es wiederherstellen, indem Sie Folgendes neu starten oder Folgendes in eine Root-Shell (unter Linux) eingeben: mknod /dev/null c 1 3; chmod a+w /dev/nulloder in BSD : mknod /dev/null c 3 2; chmod a+w /dev/null.

Whitequark
quelle
1
Die Gerätenummern variieren drastisch von Betriebssystem zu Betriebssystem: Das Paar 1,3 funktioniert unter Linux, jedoch nicht unter bsd-unixes.
Charles Stewart
entsprechend bearbeitet.
Whitequark
5

Wenn Sie dies tun:

# mv oi /dev/null

Sie machen tatsächlich das Äquivalent der folgenden

# rm /dev/null
# mv oi /dev/null
Hasturkun
quelle
1
Ich denke, das ist die Lösung, da es den Knoten überschreibt
Marcos Roriz Junior
3

Das kannst du nicht

# uname -sr
Linux 2.6.32-ARCH
# touch a
# mv a /dev/null
mv: inter-device move failed: `a' to `/dev/null'; unable to remove target: Permission denied
Otto Allmendinger
quelle
2

/dev/nullist eine spezielle Zeichendatei, was bedeutet, dass es sich um eine inhaltslose Datei handelt, die als in der Lage markiert ist, Byte-Streams zu quellieren und zu speichern. Was mit diesen Streams passiert, wird durch ihre Gerätenummern bestimmt. Auf meinem BSD-System im Moment:

crw-rw-rw- 1 Wurzelrad 3, 2. Januar 25 14:57 / dev / null

Die Gerätenummern sind 3,2 (die Hauptnummer ist 3, die Nebennummer ist 2). Ich kann andere /dev/nullähnliche Dateien erstellen mknod /dev/nil c 3 2, wobei c bedeutet, dass ich eine spezielle Zeichendatei möchte. Auf BSD-Systemen wird das Gerätenummernpaar jedoch dynamisch erstellt und ist beim nächsten Start möglicherweise nicht dasselbe.

Um zu sehen, wie diese Fakten in der Praxis zutreffen:

sh-2.05b # mknod / dev / nil c 3 2
sh-2.05b # ls -l / dev / nil
crw-r - r-- 1 Wurzelrad 3, 2. Januar 25 15:14 / dev / nil
sh-2.05b # echo abc> / dev / nil
sh-2.05b # cat </ dev / nil
sh-2.05b # 

Linux verwendet das Dur-Moll-Paar 1,3 und mknod /dev/null c 1 3erstellt dort Ihre Datei neu.

Zeichenspezialdateien sind in vielerlei Hinsicht wie die meisten anderen Dateien und können gelöscht werden, wenn Sie über die Berechtigungen verfügen. Die Verwendung mvin einer Gerätedatei ist genauso, als ob Sie eine reguläre Datei verschoben hätten. Dies bedeutet, dass Sie eine völlig neue Datei erhalten, die Sie anhand der Inodes erkennen können. Zum Beispiel (diesmal Mac OS, aber alle * nixes verhalten sich hier gleich):

helen: tmp cas $ touch abc def
helen: tmp cas $ ls -i1
3775141 abc
3775142 def
helen: tmp cas $ mv abc def
helen: tmp cas $ ls -i1
3775141 def
helen: tmp cas $ echo clobber> def
helen: tmp cas $ ls -i1
3775141 def

Sehen Sie, wie sich der mit dem Dateinamen verknüpfte Inode defnach der Verwendung geändert hat mv, wobei die alte Datei einfach gelöscht wurde. Als ich jedoch die Ausgabe echoin die genannte Datei schrieb def, blieb der Inode derselbe. Ihr mvFehler schlägt also entweder fehl, wahrscheinlich wenn Sie nicht root sind, oder Sie löschen die Datei und legen eine neue Datei unter den Pfad /dev/null, wofür dieses spezielle Zeichen nicht gedacht ist.

Charles Stewart
quelle
2
Sie können verwenden cp -R /dev/null /some/other/null. Dies ist POSIX-kompatibel ( mkssoftware.com/docs/man1/cp.1.asp ), sodass es unter praktisch jedem Unix funktioniert.
Whitequark
@whitequark: bearbeitet, und ich habe eine Erklärung für den Unterschied zwischen mv und clobbering gegeben.
Charles Stewart
0

Warum mveine Datei /dev/null(auch wenn es möglich ist), wenn Sie sie einfach löschen könnten?

Ist /dev/nulles sicherlich nützlicher und als Ziel für Ausgabedaten gedacht ?

Pavium
quelle
0

Shell Scripting ist eine häufige Verwendung:

cat somefile >/dev/null 2>&1

Manchmal möchten Sie keine Fehler sehen / anzeigen usw.

Wille
quelle
-1

/ dev / null ist wie ein Schwarzes Loch und / oder eine leere Datei. umwerfend! Sie können hier alles hineinstecken und von dort nichts bekommen.


quelle