如何使用sudo获取XDGvariables?

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

sudo -Eiu user printenv | grep XDG_CONFIG_HOME 

但是我什么也得不到。

如果我用用户帐户login,简单的命令:

 printenv | grep XDG_CONFIG_HOME 

工作正常。

我如何?

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

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

这个模块只在登录的情况下加载 – 也就是说我需要ssh到系统,或者通过console / gui登录来获得用户会话通过pam_systemd模块的初始化。

这个模块没有装入susudo情况下。

因此,当你做一个sudo模拟一个用户这个变量没有设置。

其他XDG变量只适用于用户实际登录GUI的情况。 我没有在我使用的GUI上得到这些变量集,但是XDG变量的文档指定了如果它们没有设置,它们应该默认的东西。 XDG_CONFIG_HOME的默认值是$HOME/.configXDG_DATA_HOME的默认值是$HOME/.local/share

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

这些值是非常多的模板 – 例如我的系统上的XDG_RUNTIME_DIR/var/run/UID ,而且每个手册页在我上次注销后都不能存活。 所以这不是放置永久文件的地方。

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

有几个部分可以隔离Linux机器上的所有普通用户(非系统帐户)。 为了您的目的,最简单的方法是将所有用户读入数组,然后查看每个用户的XDG配置。 为此目的的快速bash脚本是:

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

这将为每个用户打印所有的XDG环境变量,并用一个简短的标题来标识它是谁的。 如果你喜欢这一切:

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

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