我需要检索所有用户的$XDG_CONFIG_HOME、$XDG_RUNTIME_DIR和$XDG_DATA_HOME。我试着:
sudo -Eiu user printenv | grep XDG_CONFIG_HOME但我什么都没得到。
如果我使用用户帐户登录,则使用以下简单命令:
printenv | grep XDG_CONFIG_HOME效果很好。
我该怎么做?
发布于 2015-03-02 13:34:04
在sudo情况下,这些变量是不可用的,在标准登录情况下,有些变量甚至不能在所有上设置为。
在我的linux (Debian8)上,一些XDG变量是在使用pam模块pam_systemd初始化用户会话时定义的。定义在这一点上初始化的变量记录在手册页中,但包括XDG_RUNTIME_DIR。
这个模块只在登录情况下加载--也就是说,我需要ssh到系统,或者通过控制台/gui登录,让用户会话通过pam_systemd模块进行初始化。
此模块不在su或sudo情况下加载。
因此,当您执行sudo来模拟用户时,不会设置此变量。
只有当用户实际在GUI上登录时,其他XDG变量才适用。我没有在我使用的GUI上获得这些变量集,但是XDG变量的文档指定如果它们没有设置,它们应该默认设置什么。XDG_CONFIG_HOME的默认值是$HOME/.config,XDG_DATA_HOME的默认值是$HOME/.local/share。
因此,您应该只期望在交互式登录案例中设置这些变量,而不是通过非交互式案例-- sudo实际上被指定为一个非交互式案例,即使您可以使用它进行交互操作。
这些值在很大程度上是模板化的--例如,我的系统上的XDG_RUNTIME_DIR是/var/run/UID,而且根据手册页,在我上次注销后无法存活;所以它不是放置永久文件的地方。
除非您作为用户更改这些值,否则我希望XDG文档( KDE的遵守情况页面)中指定的默认值是使用的。可能还有其他的,但我只是选择了KDE遵从标准之一,因为它在系统管理指南中调用它。
发布于 2015-03-02 12:36:03
有几个部分可以隔离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环境变量。
https://stackoverflow.com/questions/28809235
复制相似问题