如何使用 sudo 获取 XDG 变量?

How to get XDG variables with sudo?

我需要检索所有用户的 $XDG_CONFIG_HOME、$XDG_RUNTIME_DIR 和 $XDG_DATA_HOME。 我尝试:

sudo -Eiu user printenv | grep XDG_CONFIG_HOME

但我一无所获

如果我使用用户帐户登录,简单的命令:

printenv | grep XDG_CONFIG_HOME

工作正常。

我怎么办?

在 Linux 盒子上隔离所有一般用户(non-system 帐户)有几个部分。出于您的目的,最简单的方法可能是将所有用户读入一个数组,然后查看每个用户的 XDG 配置。用于此目的的快速 bash 脚本是:

#!/bin/bash

uarray=( $(awk -F':' -v "limit=$(grep "^UID_MIN" /etc/login.defs | sed -e 's/UID_MIN\s*//')" '{ if (  >= limit ) print }' /etc/passwd) )


for i in "${uarray[@]}"; do
    printf "\nXDG Config for user:  %s\n\n" "$i"
    sudo -Eiu $i printenv | grep XDG
done

这将为每个用户打印所有 XDG 环境变量,并带有简短的 header 以确定它是谁。如果您更喜欢一行中的所有内容:

for i in $(awk -F':' -v "limit=$(grep "^UID_MIN" /etc/login.defs | sed -e 's/UID_MIN\s*//')" '{ if (  >= limit ) print }' /etc/passwd); do printf "\nXDG Config for user:  %s\n\n" "$i"; sudo -Eiu $i printenv | grep XDG; done

您可以通过缩小 grep 的参数来限制或更改选择哪些 XDG 环境变量。

TLDR,这些变量在sudo情况下是不可用的,有些甚至在标准登录情况下根本不能设置。

在我的 linux 系统 (debian 8) 上,一些 XDG 变量是在使用 pam 模块 pam_systemd 初始化用户会话时定义的。定义为在此时初始化的变量记录在手册页中,但包括 XDG_RUNTIME_DIR.

此模块仅在登录情况下加载 - 即我需要通过 ssh 连接到系统,或通过 console/gui 登录以通过 pam_systemd 模块初始化用户会话。

此模块未在 susudo 情况下加载。

因此,当您执行 sudo 模拟用户时,未设置此变量。

其他 XDG 变量仅在用户实际登录 GUI 时适用。我没有在我使用的 GUI 上设置这些变量,但是 the docs for XDG variables 指定了它们在未设置时应该默认的值。 XDG_CONFIG_HOME 的默认值为 $HOME/.configXDG_DATA_HOME 的默认值为 $HOME/.local/share.

所以您应该只希望在交互式登录案例中设置这些变量,而不是通过非交互式案例 - sudo 将被有效地指定为非交互式案例,即使您可以用它做一些互动的事情。

这些值非常模板化 - 例如我系统上的 XDG_RUNTIME_DIR/var/run/UID,并且根据手册页,在我上次注销后无法生存;所以这里不是放置永久文件的地方。

除非您作为用户更改这些值,否则我希望 XDG 文档中指定的默认值,the KDE compliance 页面是使用的页面。可能还有其他的,但我只是选择了 KDE 合规性,因为它在系统管理指南中提到了它。