我有一个makeself
我希望以 root 身份运行的脚本;这是一个桌面安装程序。
在脚本末尾,最近安装到文件系统的软件尝试在用户空间中启动。
使用 sudo -u $(logname) /path/to/application
效果很好(或者 sudo -u $SUDO_USER ...
in Ubuntu 16.04 )但是缺少用户的关键环境变量:
GNOME_DESKTOP_SESSION_ID
我需要GNOME_DESKTOP_SESSION_ID
因为子进程属于Java,Java使用这个环境变量来检测GtkLookAndFeel .
但是尝试使用 sudo -i
失败了。
根据一些基本测试,GNOME_DESKTOP_SESSION_ID
当该用户登录时,似乎不是自然环境变量。例如,如果我 CTRL+ALT+F1
到终端,env |grep GNOME
没有产生任何结果,而 XTerm
和gnome-terminal
两者产量GNOME_DESKTOP_SESSION_ID
.
我怎样才能得到这个GNOME_DESKTOP_SESSION_ID
来自安装程序脚本内的变量,无需用户传递诸如 -E
之类的内容参数 sudo
命令?
请注意,虽然 GtkLookAndFeel
是 Linux 的主要外观和感觉,我不喜欢硬编码 export JAVA_OPTS
或者,出于支持、生命周期和可扩展性的原因,我更愿意继续使用 Oracle 的检测技术。
更新:在 Ubuntu 中,GNOME_DESKTOP_SESSION_ID
住在/usr/share/upstart/sessions/xsession-init.conf
initctl set-env --global GNOME_DESKTOP_SESSION_ID=this-is-deprecated
这导致使用 initctl get-env
来检索它。不幸的是,这在新的 sudo
中没有帮助。 shell,也没有任何(乐观的)尝试 dbus-launch
.
最佳答案
事实证明这是一个两步过程......
- 从
/proc/$pid/environ
读取用户的UPSTART_SESSION
环境变量 - 然后
导出 UPSTART_SESSION
并调用initctl --user get-env GNOME_DESKTOP_SESSION_ID
为了使其对其他变量更具可扩展性,我将其包装到 bash 辅助函数中。此函数还应该有助于获取其他用户环境变量。 请注意,如果变量的值名称中包含空格,则它将不起作用。
在下面的示例中,只需要 UPSTART_SESSION
和 GNOME_DESKTOP_SESSION_ID
来回答问题。
调用 sudo_env
后,下一次调用 sudo -u ...
必须更改为 sudo -E -u ...
。 -E
将导入新导出的变量以供子进程使用。
# Provide user environmental variables to the sudo environment
function sudo_env() {
userid="$(logname 2>/dev/null || echo $SUDO_USER)"
pid=$(ps aux |grep "^$userid" |grep "dbus-daemon" | grep "unix:" |awk '{print $2}')
# Replace null delimiters with newline for grep
envt=$(cat "/proc/$pid/environ" |tr '\0' '\n')
# List of environmental variables to use; adjust as needed
# UPSTART_SESSION must come before GNOME_DESKTOP_SESSION_ID
exports=( "UPSTART_SESSION" "DISPLAY" "DBUS_SESSION_BUS_ADDRESS" "XDG_CURRENT_DESKTOP" "GNOME_DESKTOP_SESSION_ID" )
for i in "${exports[@]}"; do
# Re-set the variable within this session by name
# Careful, this technique won't yet work with spaces
if echo "$envt" | grep "^$i=" > /dev/null 2>&1; then
eval "$(echo "$envt" | grep "^$i=")" > /dev/null 2>&1
export $i > /dev/null 2>&1
elif initctl --user get-env $i > /dev/null 2>&1; then
eval "$i=$(initctl --user get-env $i)" > /dev/null 2>&1
export $i > /dev/null 2>&1
fi
echo "$i=${!i}"
done
}
关于java - 让脚本检测 gnome session ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40603418/