我需要检索所有用户的$ 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
模块的初始化。
这个模块没有装入su
或sudo
情况下。
因此,当你做一个sudo
模拟一个用户这个变量没有设置。
其他XDG
变量只适用于用户实际登录GUI的情况。 我没有在我使用的GUI上得到这些变量集,但是XDG变量的文档指定了如果它们没有设置,它们应该默认的东西。 XDG_CONFIG_HOME
的默认值是$HOME/.config
, XDG_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环境变量。