如何使用 sudo 获取 XDG 变量?
How to get XDG variables with sudo?
我需要检索所有用户的 $XDG_CONFIG_HOME、$XDG_RUNTIME_DIR 和 $XDG_DATA_HOME。
我尝试:
sudo -Eiu user printenv | grep XDG_CONFIG_HOME
但我一无所获
如果我使用用户帐户登录,简单的命令:
printenv | grep XDG_CONFIG_HOME
工作正常。
我怎么办?
在 Linux 盒子上隔离所有一般用户(non-system 帐户)有几个部分。出于您的目的,最简单的方法可能是将所有用户读入一个数组,然后查看每个用户的 XDG 配置。用于此目的的快速 bash 脚本是:
#!/bin/bash
uarray=( $(awk -F':' -v "limit=$(grep "^UID_MIN" /etc/login.defs | sed -e 's/UID_MIN\s*//')" '{ if ( >= limit ) print }' /etc/passwd) )
for i in "${uarray[@]}"; do
printf "\nXDG Config for user: %s\n\n" "$i"
sudo -Eiu $i printenv | grep XDG
done
这将为每个用户打印所有 XDG 环境变量,并带有简短的 header 以确定它是谁。如果您更喜欢一行中的所有内容:
for i in $(awk -F':' -v "limit=$(grep "^UID_MIN" /etc/login.defs | sed -e 's/UID_MIN\s*//')" '{ if ( >= limit ) print }' /etc/passwd); do printf "\nXDG Config for user: %s\n\n" "$i"; sudo -Eiu $i printenv | grep XDG; done
您可以通过缩小 grep
的参数来限制或更改选择哪些 XDG 环境变量。
TLDR,这些变量在sudo
情况下是不可用的,有些甚至在标准登录情况下根本不能设置。
在我的 linux 系统 (debian 8) 上,一些 XDG
变量是在使用 pam 模块 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 合规性,因为它在系统管理指南中提到了它。
我需要检索所有用户的 $XDG_CONFIG_HOME、$XDG_RUNTIME_DIR 和 $XDG_DATA_HOME。 我尝试:
sudo -Eiu user printenv | grep XDG_CONFIG_HOME
但我一无所获
如果我使用用户帐户登录,简单的命令:
printenv | grep XDG_CONFIG_HOME
工作正常。
我怎么办?
在 Linux 盒子上隔离所有一般用户(non-system 帐户)有几个部分。出于您的目的,最简单的方法可能是将所有用户读入一个数组,然后查看每个用户的 XDG 配置。用于此目的的快速 bash 脚本是:
#!/bin/bash
uarray=( $(awk -F':' -v "limit=$(grep "^UID_MIN" /etc/login.defs | sed -e 's/UID_MIN\s*//')" '{ if ( >= limit ) print }' /etc/passwd) )
for i in "${uarray[@]}"; do
printf "\nXDG Config for user: %s\n\n" "$i"
sudo -Eiu $i printenv | grep XDG
done
这将为每个用户打印所有 XDG 环境变量,并带有简短的 header 以确定它是谁。如果您更喜欢一行中的所有内容:
for i in $(awk -F':' -v "limit=$(grep "^UID_MIN" /etc/login.defs | sed -e 's/UID_MIN\s*//')" '{ if ( >= limit ) print }' /etc/passwd); do printf "\nXDG Config for user: %s\n\n" "$i"; sudo -Eiu $i printenv | grep XDG; done
您可以通过缩小 grep
的参数来限制或更改选择哪些 XDG 环境变量。
TLDR,这些变量在sudo
情况下是不可用的,有些甚至在标准登录情况下根本不能设置。
在我的 linux 系统 (debian 8) 上,一些 XDG
变量是在使用 pam 模块 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 合规性,因为它在系统管理指南中提到了它。