2015-03-02 74 views
3

我需要检索所有用户的$ XDG_CONFIG_HOME,$ XDG_RUNTIME_DIR和$ XDG_DATA_HOME。 我尝试:如何使用sudo获取XDG变量?

sudo -Eiu user printenv | grep XDG_CONFIG_HOME 

但我什么也没得到。

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

printenv | grep XDG_CONFIG_HOME 

工作正常。

我该怎么办?

回答

3

TLDR,这些变量在sudo的情况下不可用,有些甚至在标准登录情况下甚至可能不会被设置为的所有

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

该模块仅在登录情况下加载 - 即我需要ssh登录到系统,或者通过控制台/ gui登录,以便通过pam_systemd模块初始化用户会话。

该模块未加载到susudo的情况。

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

其他XDG变量只有在用户实际登录GUI时才适用。我没有在我使用的GUI上获取这些变量集,但the docs for XDG variables指定了它们应该默认设置的内容,如果它们没有设置。 XDG_CONFIG_HOME的默认值是$HOME/.config,而XDG_DATA_HOME的默认值是$HOME/.local/share

因此,您应该只希望在交互式登录的情况下设置这些变量,而不是通过非交互式的情况 - sudo将被有效地指定为非交互式的情况,即使您可以使用它进行交互式操作。

这些值非常模板化 - 例如,我的系统上的XDG_RUNTIME_DIR/var/run/UID,而且根据手册页,在我上次登出后不能存活;所以它不是放置永久文件的地方。

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

+0

这不是太长,这很好,因为我现在明白了为什么我没有通过连接ssh,sudo或交互式方法得到相同的结果。谢谢 – Mauricio 2015-03-02 14:16:33

0

有几个部分可以隔离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 

可以限制或改变其XDG环境变量被缩小论据grep选择。

+0

他遇到的问题是**没有**的XDG变量设置在sudo的情况下。 – Petesh 2015-03-02 12:46:18

+0

无论是他或他正在使用'user'而不是每个单独的用户名。另一种可能性是XDG配置在桌面启动时加载,然后如您所说,对于某些未登录的用户不可用。 – 2015-03-02 12:49:13

+0

在一行中检索用户列表是完美的。采纳。谢谢。 – Mauricio 2015-03-02 14:20:48