我需要检索所有用户的$ XDG_CONFIG_HOME,$ XDG_RUNTIME_DIR和$ XDG_DATA_HOME。 我尝试:如何使用sudo获取XDG变量?
sudo -Eiu user printenv | grep XDG_CONFIG_HOME
但我什么也没得到。
如果我登录与用户帐户,简单的命令:
printenv | grep XDG_CONFIG_HOME
工作正常。
我该怎么办?
我需要检索所有用户的$ XDG_CONFIG_HOME,$ XDG_RUNTIME_DIR和$ XDG_DATA_HOME。 我尝试:如何使用sudo获取XDG变量?
sudo -Eiu user printenv | grep XDG_CONFIG_HOME
但我什么也没得到。
如果我登录与用户帐户,简单的命令:
printenv | grep XDG_CONFIG_HOME
工作正常。
我该怎么办?
TLDR,这些变量在sudo
的情况下不可用,有些甚至在标准登录情况下甚至可能不会被设置为的所有。
在我的linux系统上(debian 8),一些XDG
变量是在用pam模块pam_systemd
初始化用户会话时定义的。定义为在该点初始化的变量记录在手册页中,但包括XDG_RUNTIME_DIR
。
该模块仅在登录情况下加载 - 即我需要ssh登录到系统,或者通过控制台/ 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合规性的一个,因为它在系统管理员指南中提到了它。
有几个部分可以隔离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
选择。
这不是太长,这很好,因为我现在明白了为什么我没有通过连接ssh,sudo或交互式方法得到相同的结果。谢谢 – Mauricio 2015-03-02 14:16:33