我需要检索所有用户的$ XDG_CONFIG_HOME,$ XDG_RUNTIME_DIR和$ XDG_DATA_HOME。 我试着用:
sudo -Eiu user printenv | grep XDG_CONFIG_HOME
但我一无所获。
如果我使用用户帐户登录,则使用简单命令:
printenv | grep XDG_CONFIG_HOME
工作正常。
我该怎么做?
答案 0 :(得分:3)
TLDR,这些变量在sudo
案例中不可用,有些甚至在标准登录案例中甚至不能设置为 。
在我的linux系统(debian 8)上,当使用pam模块XDG
初始化用户的会话时,会定义一些pam_systemd
变量。定义为在该点初始化的变量记录在手册页中,但包括XDG_RUNTIME_DIR
。
此模块仅在登录案例中加载 - 即我需要ssh到系统,或通过console / gui登录以通过pam_systemd
模块初始化用户会话。
此模块未加载到su
或sudo
个案例中。
因此,当您执行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合规性。
答案 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环境变量。