XDG_RUNTIME_DIR 的默认值是好的吗?

XDG_RUNTIME_DIR 的默认值是好的吗?

XDG 基础目录规范是针对用户目录的一个非常有趣的规范。它还提供了很好的默认值,但 除外XDG_RUNTIME_DIR

现在我正在编写一个需要创建命名管道的软件。它是一个每个用户的客户端-服务器框架(服务器有一个 FIFO,每个客户端都有一个 FIFO)。

如果XDG_RUNTIME_DIR没有定义,我目前正在使用每个用户的子目录/tmp——但它不能确保所有指定的条件(即以“目录的生存期必须与登录的用户绑定……”

/tmp/myserver-$USER好嗎?

编辑

我在其他地方看到了一些建议:

  • .是相当不令人满意的(至少因为它不是绝对路径)。
  • 我还看到了/var/run/user/$USER——还不错,但是那个目录不存在(至少在我运行 Debian 的机器上)测试

答案1

/tmp已经被许多程序以类似的方式使用。在我的系统上,我可以看到/tmp/orbit-$USER(Gnome 的 ORBit2 使用)和/tmp/.X11-unix/(Xorg 和 X11)目录中有大量管道、呃、套接字。我确信还有其他目录,所以我认为你做的事情没有错。只是要做好准备,因为它是一个全球可写的位置,恶意进程可以劫持该位置(在写入之前验证权限)。

我还可以向$TMPDIR那些使用pam_mktemp,因为该目录只有用户可访问。

答案2

SystemD 有点/run/user/$UID强制性。

http://www.freedesktop.org/software/systemd/man/file-hierarchy.html

非特权写访问

非特权进程通常缺乏对大多数层次结构的写访问权限。

普通用户的例外是/tmp、、以及主目录(通常位于下面/var/tmp)和/dev/shm$HOME/home运行时目录$XDG_RUNTIME_DIR(见下文/run/user用户的,都是可写的。

仅对非特权系统进程而言/tmp/var/tmp/dev/shm是可写的。如果非特权系统进程需要在/var或中拥有私有的可写目录/run,建议在守护进程代码中删除权限之前创建它、在启动期间通过 tmpfiles.d(5) 片段创建它或通过RuntimeDirectory= 服务单元的指令创建它(有关详细信息,请参阅 systemd.unit(5))。

https://www.freedesktop.org/software/systemd/man/pam_systemd.html

如果尚不存在,/run/user/$UID则创建用户运行时目录或将其挂载为tmpfs应用配额的新“ ”文件系统,并将其所有权更改为正在登录的用户。

答案3

创建具有唯一 ID 的目录 /tmp/service-$USER.id。例如,在 shell 中:

mktemp -d /tmp/service-"$USER".XXX

相关内容