没有理由同时拥有/ run和/ tmp
我想你是正确的。 /tmp
现在我们已经基本弃用了/run
。如果您的程序可以执行此操作(这要求将它作为特权操作安装),那么现在您将使用的子目录/run
。这是出于安全原因。
例如,CUPS打印守护程序不是以root身份运行,而是通常从OS软件包安装。该软件包将安装/usr/lib/tmpfiles.d/cups.conf
,并systemd-tmpfiles
创建一个可以访问的目录。由于该目录位于下/run
,因此非特权用户不能恶意声明该名称,/tmp
这与世界可写的名称不同。
不能/run
直接使用的“非特权程序”
真正的区别是您的程序是否由任意非特权用户使用其自己的用户ID运行。但是您通常仍然不希望使用/tmp
,因为其他无特权的用户可以访问它。您更喜欢使用$XDG_RUNTIME_DIR
。通常,此实现为/run/user/$(id -u)
-,因此它也恰好是其的子目录/run
。虽然不能保证位置。程序应始终使用环境变量。
/tmp
仅对系统上不同非特权用户之间的临时合作有用。这样的临时系统容易受到恶意用户的拒绝,这些恶意用户拒绝与所有人合作并破坏事物:)。一个示例是无特权的用户决定talk
使用unix套接字运行该守护程序的版本。
Lennart Poettering的原始信息
注意,下面的Poettering清单要求/tmp
对“小文件”有用,而/run
仅用于“通信原语”。我也不认为这种区别是正确的。的发布者/run
是udev
,而且我很确定/run/udev
包括内部数据库。一旦有了/run
目录,我认为没有人希望遵循所声明的区分并创建另一个目录,以免混乱/tmp
。因此,实际上,我们/run
现在仅使用。
将世界可写的共享名称空间(如/ tmp)用于通信目的一直是有问题的,因为建立通信需要稳定的名称,但是稳定的名称为DoS攻击打开了大门。可以通过在早期启动期间为某些服务建立受保护的按应用程序目录来部分纠正此问题(就像我们对X11所做的那样),但这只能部分解决此问题,因为只有在每次安装软件包后都重新启动时,此方法才能正常工作。
...
Fedora的另一个功能(用于Fedora 17)通过隔离各种服务的/ tmp命名空间,更改了许多系统服务的/ tmp语义,以使其更加安全。
...
因为/ tmp不再必须是共享名称空间,所以通常不适合用作通信原语的位置。
...
确保[/ run]是tmpfs,因此在启动时会自动刷新。除此之外,不会进行任何自动清理。
...
这是一个粗略的指南,我们建议您(Linux应用程序开发人员)如何选择要使用的正确目录:
- 您需要一个放置套接字(或其他通信原语)的位置,并且您的代码可以特权运行:使用/ run下的子目录。(或在/ var / run下面获得额外的兼容性。)
- 您需要放置套接字(或其他通信原语)的位置,并且代码无特权运行:请使用$ XDG_RUNTIME_DIR下的子目录。
- 您需要一个地方来进行较大的下载和下载并以无特权的方式运行:使用$ XDG_DOWNLOAD_DIR。
- 您需要一个放置缓存文件的位置,该文件应该是永久的并且可以无特权地运行:请使用$ XDG_CACHE_HOME。
- 以上内容均不适用,您需要放置一个不需要持久性的小文件:将$ TMPDIR与/ tmp一起使用。并使用mkstemp()和mkdtemp()而不进行任何自产。
- 否则,将$ TMPDIR与/ var / tmp一起使用。还可以使用mkstemp()/ mkdtemp()。
请注意,以上这些规则仅由我们建议。这些规则考虑了我们对该主题的了解,并据我们所知避免了当前和将来的发行版出现问题。请考虑更新您的项目以遵循这些规则,并在编写新代码时牢记这些规则。
我们要强调的一件事是/ tmp和/ var / tmp实际上不是您的用例的正确选择。这些目录有有效的用途,但实际上通常是另一个目录可能更好。因此,请小心,考虑其他选项,但是如果您确实选择/ tmp或/ var / tmp,则至少要确保使用mkstemp()/ mkdtemp()。
/tmp
如上所述,我们有点摆脱了X窗口系统使用的传统套接字。 我看错了tmpfiles.d/x11.conf
。看起来更像是依靠合作:)。我认为代码已经过审核,因此拒绝服务是最糟糕的情况。