Esiste una directory equivalente a / dev / null in Linux?


84

Quando si configura un'applicazione, è spesso possibile utilizzare /dev/nullcome file di configurazione se si desidera che l'applicazione legga un file vuoto. Ma, se l'applicazione legge un elenco di file da una directory, non è possibile utilizzare questo trucco. Dovresti dargli una directory vuota da leggere.

Mi chiedevo: Linux ha una directory vuota predefinita che può essere utilizzata per tali scopi? So che OpenSSH ha usato / var / empty per un po ', e ovviamente posso creare da me una directory vuota, ma forse l'FHS ha specificato una directory standard per questo?


8
Sul mio sistema, /var/emptynon è vuoto, ma contiene una cartella chiamata sshd, quindi probabilmente non vuoi usarlo.
Knub

12
Solo un punto: l'aspetto speciale di /dev/nullnon è tanto per la lettura quanto per la scrittura. I dati scritti /dev/nullsemplicemente scompaiono. Quindi, un equivalente di directory sarebbe un posto in cui mv yourfile /dev/emptyporterebbe all'eliminazione del file.
Wildcard il

4
@Wildcard Immagino tu intenda mv yourfile /dev/empty/. In tal caso mv yourfile /dev/empty, stai cercando di sostituire la directory speciale.
Rhymoid,

6
@Jules No, non lo è. Non puoi inizializzare nulla con /dev/nulle ddperché ddotterrà un EOF prima ancora che sia scritto un singolo byte. Penso che tu stia pensando /dev/zero, che viene spesso utilizzato per riempire qualcosa o generare un numero specifico di zeri.
Micheal Johnson,

2
@MichealJohnson hai ragione, il mio errore, mi piacerebbe confuso /dev/nullcon /dev/zero.
Jules l'

Risposte:


66

L' FHS non fornisce una directory vuota "standard".

È comune per i sistemi Linux fornire una directory /var/empty, ma questa directory non è definita in FHS e potrebbe non essere effettivamente vuota. Invece, alcuni demoni creeranno le loro directory vuote qui. Ad esempio, openssh utilizza la directory vuota /var/empty/sshdper la separazione dei privilegi.

Se la necessità di una directory vuota è temporanea, è possibile creare manualmente una directory vuota, come sottodirectory di /runo /tmp. Se lo stai facendo al di fuori del programma, puoi utilizzarlo mktemp -do utilizzare la mkdtemp(3)funzione C all'interno del programma. Tuttavia, se hai sempre bisogno che sia presente la directory vuota, considera di crearne una /var/emptycome fa openssh.

Per questo caso d'uso, la creazione di una directory sotto /tmpè probabilmente la soluzione migliore, anche se in pratica non importa molto dove la metti.


5
Non consiglierei di creare sottodirectory sotto /var/empty, poiché tutti i programmi che lo usano (come OpenSSH nella sua configurazione predefinita ) potrebbero aspettarsi che sia effettivamente vuoto. (La /var/empty/sshdcosa sembra essere un RedHat-ism strano; Debian usa /var/run/sshdinvece.)
Ilmari Karonen l'

3
@IlmariKaronen Il bit di codice che hai collegato non supporta la tua affermazione che OpenSSH si aspetta /var/emptyche sia vuoto. C'è un altro posto in cui si potrebbe cercare questo?
Michael Hampton

2
@IlmariKaronen Hm, quel documento non è aggiornato. Si riferisce a /var/emptyma il codice effettivamente utilizza /var/empty/sshd. Riprova. :)
Michael Hampton

1
@IlmariKaronen Hmm. Ora penso che tu abbia ragione, dopo aver effettivamente visto la fonte che fa la chiamata chroot (). Trovo sorprendente che ci sia un difetto così ovviamente stupido in openssh, per cui Red Hat dovrebbe mantenere una correzione a valle.
Michael Hampton

2
Non vedo come sia uno "stupido difetto": avere una directory di proprietà root vuota garantita in una posizione standard, da usare come una prigione chroot, mi sembra un'idea perfettamente valida. Ovviamente, RedHat ha dovuto andare e rovinarlo per tutti, creando sottodirectory sotto di esso. Di conseguenza, la mia raccomandazione per il codice portatile sarebbe di non utilizzare /var/emptyper nulla, dal momento che non si può essere sicuri della sua semantica su un determinato sistema. Creare la tua directory vuota, ad es. Sotto /var/run, come Debian, sembra più sensato.
Ilmari Karonen,

37

È possibile utilizzare mktemp -dper creare una nuova directory temporanea vuota con autorizzazioni sicure, per impostazione predefinita in /tmp/. L'utilità genererà il percorso della nuova directory STDOUT, quindi è utile nella shell.

È comunque più portabile di un file di unità di sistema.


Sì, è possibile, ma non è pratico se tale directory deve essere specificata in un file di configurazione. Vorresti un reg permanente per quello.
roelvanmeer,


11

Per i servizi systemd offre la possibilità PrivateTmpdi creare directory private /tmpe /var/tmpnon condivise da processi esterni allo spazio dei nomi per quel servizio e che dovrebbero essere vuote (inizialmente).

[Service]
ExecStart=...
PrivateTmp=yes 

7
Il programma potrebbe creare altri file temporanei, quindi non puoi presumere /tmpche sarà vuoto semplicemente perché è stato spaziato dai nomi.
Michael Hampton
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.