今天,我惊讶地ssh
发现我的运行 Arch Linux 的机器/run/user/$(id -u)
并不存在。
这XDG 基目录规范说:
$XDG_RUNTIME_DIR
定义相对于用户特定的非必需运行时文件和其他文件对象(例如套接字、命名管道...)应存储的基目录。该目录必须由用户拥有,并且他必须是唯一对其具有读写访问权限的人。它的 Unix 访问模式必须是0700
.目录的生命周期必须与登录的用户绑定。它必须在用户首次登录时创建,如果用户完全注销,则必须删除该目录。如果用户登录多次,他应该被指向同一个目录,并且该目录必须从他第一次登录到最后一次注销在系统上继续存在,并且在这期间不能被删除。目录中的文件不能在重新启动或完整的注销/登录周期后继续存在。
在systemd
盒子上,是/run/user/$(id -u)
首选位置$XDG_RUNTIME_DIR
(即使需要创建?)
如果没有,创建的最佳实践是什么$XDG_RUNTIME_DIR
?
如何确保仅当我“完全”注销时才删除该目录?
(“完全”是否意味着登录 shell 创建的所有进程都已退出?如何检查?)
答案1
目录、服务和环境变量由特定于 systemd 的可插入身份验证模块和服务管理。第一次登录时,他们创建目录,创建安装在那里的文件系统,然后启动服务;在最后一次注销时,他们停止服务,卸载文件系统并删除目录。当为帐户设置systemd 选项时,此行为会发生变化。/run/user/N
user@N
XDG_RUNTIME_DIR
logind
linger
其他系统的运行方式有所不同。
进一步阅读
- 伦纳特·珀特林等人。 (2017)。
pam_systemd
。系统手册页。 Freedesktop.org。 - 为什么 sudo -i 没有为目标用户设置 XDG_RUNTIME_DIR?
- 乔纳森·德博因·波拉德 (2018)。 ”每用户系统服务”。 小吃指南。软件。
- https://unix.stackexchange.com/a/386658/5132
- https://unix.stackexchange.com/a/434647/5132
- https://unix.stackexchange.com/a/423648/5132
答案2
$XDG_RUNTIME_DIR
登录时设置/创建
$XDG_RUNTIME_DIR
如果已设置,则使用现有的。- 否则,如果存在则使用
systemd
s/run/user/$UID
- 否则,创建并使用
/tmp/$USER-runtime
检查所有权和权限$XDG_RUNTIME_DIR
/tmp/"$USER"-runtime-XXXXXX
如果权限不好就创建并使用。
if [ -z "$XDG_RUNTIME_DIR" ]; then # It's not already set
XDG_RUNTIME_DIR=/run/user/$UID # Try systemd created path
if [ ! -d "$XDG_RUNTIME_DIR" ]; then
# systemd-created directory doesn't exist
XDG_RUNTIME_DIR=/tmp/$USER-runtime
if [ ! -d "$XDG_RUNTIME_DIR" ]; then # Doesn't already exist
mkdir -m 0700 "$XDG_RUNTIME_DIR"
fi
fi
fi
# Check dir has got the correct type, ownership, and permissions
if ! [[ -d "$XDG_RUNTIME_DIR" && -O "$XDG_RUNTIME_DIR" &&
"$(stat -c '%a' "$XDG_RUNTIME_DIR")" = 700 ]]; then
echo "\$XDG_RUNTIME_DIR: permissions problem with $XDG_RUNTIME_DIR:" >&2
ls -ld "$XDG_RUNTIME_DIR" >&2
XDG_RUNTIME_DIR=$(mktemp -d /tmp/"$USER"-runtime-XXXXXX)
echo "Set \$XDG_RUNTIME_DIR=$XDG_RUNTIME_DIR" >&2
fi