配置应用程序时,如果您希望应用程序读取一个空文件,通常可以使用/dev/null作为配置文件。但是,如果应用程序从目录中读取文件列表,则无法使用此技巧。您需要给它一个空目录才能读取。

我想知道:Linux是否有一个默认的空目录可用于此类目的?我知道OpenSSH使用/ var / empty已有一段时间,我当然可以自己创建一个空目录,但是也许FHS为此指定了一个标准目录?

评论

在我的系统上,/ var / empty不为空,但包含一个名为sshd的文件夹,因此您可能不想使用它。

只是一点:/ dev / null的特殊方面不是阅读而是编写。写入/ dev / null的数据将消失。因此,等效目录将是mv yourfile / dev / empty导致删除文件的地方。

@Wildcard我认为您的意思是mv yourfile / dev / empty /。如果执行mv yourfile / dev / empty,则尝试替换特殊目录。

@Jules不,不是。您无法使用/ dev / null和dd初始化任何东西,因为dd甚至会在写入单个字节之前获得EOF。我认为您正在考虑/ dev / zero,它通常用于填充某些东西或生成特定数量的零。

@MichealJohnson,您是对的,我的错,我将/ dev / null与/ dev / zero混淆了。

#1 楼

FHS没有提供“标准”空目录。

Linux系统通常提供一个目录/var/empty,但是该目录未在FHS中定义,实际上可能不是空的。相反,某些守护程序将在此处创建自己的空目录。例如,openssh使用空目录/var/empty/sshd进行权限分离。

如果您对空目录的需求是短暂的,则可以自己创建一个空目录作为/run/tmp的子目录。如果在程序外部执行此操作,则可以为此使用mktemp -d,也可以在程序内部使用mkdtemp(3) C函数。虽然如果始终需要空目录,请考虑像在opensh一样在/var/empty下创建一个目录。放在哪里都没关系。

评论


我不建议在/ var / empty下创建子目录,因为任何使用它的程序(例如其默认配置中的OpenSSH)可能期望它实际上为空。 (/ var / empty / sshd似乎是一种奇怪的RedHat主义; Debian使用/ var / run / sshd代替。)

–伊尔马里·卡洛宁(Ilmari Karonen)
16 Dec 8'在12:35



@IlmariKaronen您所链接的部分代码不支持您断言OpenSSH期望/ var / empty为空。还有其他地方可以找这个吗?

–迈克尔·汉普顿
16 Dec 8'在15:56

@IlmariKaronen嗯,该文件已过时。它引用/ var / empty,但是代码实际上使用/ var / empty / sshd。再试一次。 :)

–迈克尔·汉普顿
16 Dec 8'在17:58

我看不出它是什么“愚蠢的缺陷”,在我的标准位置上,保证在标准位置有一个空的root拥有的目录,用作chroot监狱,对我来说似乎是个好主意。当然,RedHat必须通过在其下创建子目录去破坏每个人。结果,我对可移植代码的建议是不要对任何东西使用/ var / empty,因为您不能确定其在任何给定系统上的语义。创建自己的空目录,例如在/ var / run下,就像Debian一样,似乎更明智。

–伊尔马里·卡洛宁(Ilmari Karonen)
16年9月9日在16:43

如果它是root拥有且不可写,则不是这样,例如* BSD上的/ var / empty是。

–伊尔马里·卡洛宁(Ilmari Karonen)
16 Dec 9'在16:46



#2 楼

您可以使用mktemp -d创建一个具有安全权限的新的空临时目录,默认情况下在/tmp/中。该实用程序将在STDOUT上输出新目录的路径,因此在外壳程序中很有用。

评论


是的,可以,但是如果必须在配置文件中指定该目录,则不切实际。您可能需要一个永久目录。

–roelvanmeer
16 Dec 8'在20:12

#3 楼

这个Unix问题对创建“黑洞”目录(包括nullfs FUSE文件系统)提出了一些建议。

评论


我不知道为什么当这是完美的答案时,为什么对mktemp / mkdtemp的答案如此之大。 nullfs等效于/ dev / null。

–chx
16 Dec 10'在5:49

#4 楼

对于服务,systemd提供了选项PrivateTmp来创建私有/tmp/var/tmp目录,该目录不会被该服务的名称空间之外的进程共享,并且应为空(最初)。

[Service]
ExecStart=...
PrivateTmp=yes 


评论


该程序可能会创建其他临时文件,因此您不能仅仅因为/ tmp已对其命名空间而假定它为空。

–迈克尔·汉普顿
16年7月7日在16:18