Vraag Is er een directory equivalent van / dev / null in Linux?


Bij het configureren van een toepassing kunt u vaak gebruiken /dev/null als configuratiebestand als u wilt dat de toepassing een leeg bestand leest. Maar als de toepassing een lijst met bestanden uit een map leest, kunt u deze truc niet gebruiken. Je zou het een lege map moeten geven om te lezen.

Ik vroeg me af: heeft Linux een standaard lege map die voor dergelijke doeleinden kan worden gebruikt? Ik weet dat OpenSSH een tijdje gebruikt / var / leeg is en ik kan natuurlijk zelf een lege map maken, maar misschien heeft de FHS hiervoor een standaarddirectory gespecificeerd?


72
2017-12-07 09:04


oorsprong


Op mijn systeem /var/empty is niet leeg, maar bevat een map met de naam sshd, dus je wilt dat waarschijnlijk niet gebruiken. - knub
Gewoon een punt: het speciale aspect van /dev/null is niet zo veel voor lezing als voor schrijven.  Gegevens geschreven naar /dev/null verdwijnt gewoon Dus een directory-equivalent zou een plaats zijn waar mv yourfile /dev/empty zou resulteren in het verwijderen van uw bestand. - Wildcard
@Wildcard Ik neem aan dat je bedoelt mv yourfile /dev/empty/. Als je dat doet mv yourfile /dev/empty, je probeert de speciale map te vervangen. - Rhymoid
@Jules Nee, dat is het niet. U kunt niets initialiseren met /dev/null en dd omdat dd krijgt een EOF voordat er zelfs maar een enkele byte is geschreven. Ik denk dat je denkt /dev/zero, dat vaak wordt gebruikt om iets mee te vullen of om een ​​specifiek aantal nullen te genereren. - Micheal Johnson
@MichealJohnson je hebt gelijk, mijn fout, ik was in de war /dev/nullmet /dev/zero. - Jules


antwoorden:


De FHS biedt geen "standaard" lege map.

Het is gebruikelijk dat Linux-systemen een map bieden /var/empty, maar deze map is niet gedefinieerd in FHS en is mogelijk niet leeg. In plaats daarvan zullen bepaalde daemons hun eigen lege mappen hier aanmaken. Opensh gebruikt bijvoorbeeld de lege map /var/empty/sshd voor scheiding van privileges.

Als uw behoefte aan een lege map tijdelijk is, kunt u zelf een lege map maken, als submap van /run of /tmp. Als u dit buiten het programma doet, kunt u gebruiken mktemp -d hiervoor, of gebruik de mkdtemp(3) C-functie in uw programma. Hoewel als jij altijd heb de lege map nodig om aanwezig te zijn, overweeg er een aan te maken /var/empty zoals openssh dat doet.

Gebruik hiervoor een map onder /tmp is waarschijnlijk de beste pasvorm, maar in de praktijk doet het er niet zoveel toe waar je het neerzet.


62
2017-12-07 09:11



Ik zou niet aanraden subdirectories te maken onder /var/empty, sinds alle programma's die het gebruiken (zoals OpenSSH in zijn standaard config) mag verwachten dat het echt leeg is. (De /var/empty/sshd ding lijkt een raar RedHat-isme te zijn; Debian gebruikt /var/run/sshd in plaats daarvan.) - Ilmari Karonen
@IlmariKaronen Het stukje code dat u hebt gekoppeld, ondersteunt uw bewering niet die OpenSSH verwacht /var/empty om leeg te zijn. Is er ergens anders waar je dit zou kunnen zoeken? - Michael Hampton♦
@IlmariKaronen Hm, dat document is verouderd. Het verwijst naar /var/empty maar de code gebruikt eigenlijk /var/empty/sshd. Probeer het opnieuw. :) - Michael Hampton♦
@IlmariKaronen Hmm. Nu denk ik dat je gelijk hebt, nadat je daadwerkelijk naar de bron hebt gekeken die de chroot () callt. Ik vind het verbazingwekkend dat er een duidelijk domme fout in openssh zou zijn, dat Red Hat een downstream-correctie zou moeten handhaven. - Michael Hampton♦
Ik zie niet hoe het een "stomme fout" is - het hebben van een gegarandeerde lege root-owned directory op een standaardlocatie, voor gebruik als een chroot-gevangenis, lijkt mij een perfect idee. Natuurlijk moest RedHat het voor iedereen ruïneren door subdirectories eronder te maken. Als gevolg hiervan zou mijn aanbeveling voor draagbare code niet zijn om te gebruiken /var/empty voor alles, want je kunt niet zeker zijn van de semantiek ervan op een bepaald systeem. Uw eigen lege map maken, bijvoorbeeld onder /var/run, zoals Debian dat doet, lijkt verstandiger. - Ilmari Karonen


Je kunt gebruiken mktemp -d om een ​​nieuwe lege tijdelijke map te maken met beveiligde rechten, standaard in /tmp/. Het hulpprogramma geeft het pad van de nieuwe map weer STDOUT, dus het is handig in de schaal.

Het is hoe dan ook draagbaarder dan een systemd eenheidsdossier.


37
2017-12-07 11:04



Ja, dat zou kunnen, maar dat is onpraktisch als die map moet worden opgegeven in een configuratiebestand. Daar zou je een permanent visitekaartje voor willen hebben. - roelvanmeer


Deze Unix-vraag heeft enkele suggesties voor het maken van een "blackhole" -directory, inclusief een nullfs FUSE bestandssysteem.


19
2017-12-07 21:37



Ik weet niet waarom het antwoord van mktemp / mkdtemp zo zwaar wordt geacteerd als dit het perfecte antwoord is. nullfs is het equivalent van / dev / null. - chx


Voor services systemd biedt de optie PrivateTmp om privé te maken /tmp en /var/tmp mappen die niet worden gedeeld door processen buiten de naamruimte voor die service en die in eerste instantie leeg moeten zijn.

[Service]
ExecStart=...
PrivateTmp=yes 

11
2017-12-07 10:20



Het programma kan andere tijdelijke bestanden maken, dus u kunt er niet vanuit gaan /tmp zal leeg zijn, alleen omdat het een naam heeft gekregen. - Michael Hampton♦