如何使用sudo获取XDG变量?

时间:2015-03-02 11:57:28

标签: linux sudo

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

sudo -Eiu user printenv | grep XDG_CONFIG_HOME

但我一无所获。

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

printenv | grep XDG_CONFIG_HOME

工作正常。

我该怎么做?

2 个答案:

答案 0 :(得分:3)

TLDR,这些变量在sudo案例中不可用,有些甚至在标准登录案例中甚至不能设置为

在我的linux系统(debian 8)上,当使用pam模块XDG初始化用户的会话时,会定义一些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合规性。

答案 1 :(得分: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

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