Frage Gibt es unter Linux ein Verzeichnisäquivalent von / dev / null?


Beim Konfigurieren einer Anwendung können Sie häufig verwenden /dev/null als Konfigurationsdatei, wenn die Anwendung eine leere Datei lesen soll. Wenn die Anwendung jedoch eine Liste von Dateien aus einem Verzeichnis liest, können Sie diesen Trick nicht verwenden. Sie müssten ihm ein leeres Verzeichnis zum Lesen geben.

Ich frage mich: Hat Linux ein leeres Standardverzeichnis, das für solche Zwecke verwendet werden kann? Ich weiß, dass OpenSSH eine Weile lang / var / empty verwendet hat, und ich kann natürlich selbst ein leeres Verzeichnis erstellen, aber vielleicht hat FHS dafür ein Standardverzeichnis angegeben?


72
2017-12-07 09:04


Ursprung


Auf meinem System /var/empty ist nicht leer, sondern enthält einen Ordner namens sshd, also willst du das wahrscheinlich nicht benutzen. - knub
Nur ein Punkt: Der besondere Aspekt von /dev/null ist nicht so sehr für lesen wie für Schreiben.  Daten geschrieben an /dev/null verschwindet einfach. Ein Verzeichnisäquivalent wäre also ein Ort, an dem mv yourfile /dev/empty würde dazu führen, dass Sie Ihre Datei löschen. - Wildcard
@Wildcard Ich vermute, du meinst mv yourfile /dev/empty/. Wenn Sie tun mv yourfile /dev/empty, Sie versuchen, das spezielle Verzeichnis zu ersetzen. - Rhymoid
@Jules Nein, ist es nicht. Sie können nichts mit initialisieren /dev/null und dd da dd wird ein EOF bekommen, bevor es ein einziges Byte geschrieben hat. Ich denke, du denkst daran /dev/zero, die häufig verwendet wird, um etwas mit einer bestimmten Anzahl von Nullen zu füllen oder zu erzeugen. - Micheal Johnson
@MichealJohnson du hast Recht, mein Fehler, ich hätte verwirrt /dev/nullmit /dev/zero. - Jules


Antworten:


Das FHS stellt kein "normales" leeres Verzeichnis zur Verfügung.

Linux-Systeme stellen häufig ein Verzeichnis bereit /var/empty, aber dieses Verzeichnis ist nicht in FHS definiert und möglicherweise nicht leer. Stattdessen werden bestimmte Daemons hier ihre eigenen leeren Verzeichnisse erstellen. Zum Beispiel verwendet openssh das leere Verzeichnis /var/empty/sshd für die Privilegientrennung.

Wenn Sie ein leeres Verzeichnis benötigen, können Sie ein leeres Verzeichnis als Unterverzeichnis erstellen /run oder /tmp. Wenn Sie dies außerhalb des Programms tun, können Sie verwenden mktemp -d dafür, oder benutze die mkdtemp(3) C-Funktion in Ihrem Programm. Obwohl wenn du immer Benötigen Sie das leere Verzeichnis, um zu prüfen, ob Sie ein unter erstellen möchten /var/empty wie openssh tut.

Für diesen Anwendungsfall erstellen Sie ein Verzeichnis unter /tmp ist wahrscheinlich die beste Lösung, obwohl es in der Praxis nicht sehr wichtig ist, wo Sie es hinstellen.


62
2017-12-07 09:11



Ich würde nicht empfehlen, Unterverzeichnisse unter zu erstellen /var/empty, da alle Programme, die es verwenden (wie OpenSSH in seiner Standardkonfiguration) kann erwarten, dass es tatsächlich leer ist. (Das /var/empty/sshd etwas scheint ein seltsamer RedHat-ism zu sein; Debian verwendet /var/run/sshd stattdessen.) - Ilmari Karonen
@IlmariKaronen Das Bit des Codes, das Sie verknüpft haben, unterstützt Ihre Behauptung nicht, dass OpenSSH erwartet /var/empty leer sein. Gibt es woanders, wo man danach suchen könnte? - Michael Hampton♦
@IlmariKaronen Hm, dieses Dokument ist veraltet. Es bezieht sich auf /var/empty aber der Code verwendet tatsächlich /var/empty/sshd. Versuchen Sie es nochmal. :) - Michael Hampton♦
@IlmariKaronen Hmm. Jetzt denke ich, dass du recht hast, nachdem du tatsächlich die Quelle gesehen hast, die den chroot () -Aufruf macht. Ich finde es erstaunlich, dass es in openssh einen so offensichtlich dummen Fehler geben würde, dass Red Hat dafür eine Downstream-Korrektur beibehalten müsste. - Michael Hampton♦
Ich sehe nicht, dass es ein "dummer Fehler" ist - ein garantiert leeres Root-Verzeichnis an einem Standardstandort zu haben, um es als Chroot-Gefängnis zu benutzen, scheint mir eine vollkommen gute Idee zu sein. Natürlich musste RedHat es für jeden ruinieren, indem er Unterverzeichnisse erstellte. Daher würde meine Empfehlung für portablen Code nicht zu verwenden sein /var/empty für irgendetwas, da Sie nicht sicher sein können, seine Semantik auf einem bestimmten System. Erstellen Sie Ihr eigenes leeres Verzeichnis z.B. unter /var/runWie Debian scheint das vernünftiger. - Ilmari Karonen


Sie können verwenden mktemp -d um ein neues leeres temporäres Verzeichnis mit sicheren Berechtigungen zu erstellen, standardmäßig in /tmp/. Das Dienstprogramm gibt den Pfad des neuen Verzeichnisses an STDOUT, also ist es nützlich in der Shell.

Es ist sowieso portabler als eine Systemdatei.


37
2017-12-07 11:04



Ja, könnten Sie, aber das ist unpraktisch, wenn dieses Verzeichnis in einer Konfigurationsdatei angegeben werden muss. Sie würden dafür ein permanentes Verzeichnis benötigen. - roelvanmeer


Diese Unix-Frage hat einige Vorschläge zum Erstellen eines "blackhole" - Verzeichnisses, einschließlich a NULL FUSE-Dateisystem.


19
2017-12-07 21:37



Ich weiß nicht, warum die Antwort von mktemp / mkdtemp so stark erhöht wird, wenn dies die perfekte Antwort ist. nullfs ist das Äquivalent von / dev / null. - chx


Für Dienste bietet Systemd die Option PrivateTmp Privat schaffen /tmp und /var/tmp Verzeichnisse, die nicht von Prozessen außerhalb des Namespaces für diesen Service gemeinsam genutzt werden und die zu Beginn leer sein sollten.

[Service]
ExecStart=...
PrivateTmp=yes 

11
2017-12-07 10:20



Das Programm erstellt möglicherweise andere temporäre Dateien, so dass Sie nicht davon ausgehen können /tmp wird nur deshalb leer sein, weil es Namespaced wurde. - Michael Hampton♦