java - 让脚本检测 gnome session

标签 java sudo environment gnome gnome-terminal

我有一个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没有产生任何结果,而 XTermgnome-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 .

最佳答案

事实证明这是一个两步过程......

  1. /proc/$pid/environ 读取用户的 UPSTART_SESSION 环境变量
  2. 然后导出 UPSTART_SESSION 并调用 initctl --user get-env GNOME_DESKTOP_SESSION_ID

为了使其对其他变量更具可扩展性,我将其包装到 bash 辅助函数中。此函数还应该有助于获取其他用户环境变量。 请注意,如果变量的值名称中包含空格,则它将不起作用。

在下面的示例中,只需要 UPSTART_SESSIONGNOME_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/

相关文章:

docker - Boot2Docker 无法识别 "sudo"、 "tce-load"

linux - 在用户登录时从脚本调用 sudo

angular - 找不到名称 'environment'。在 Angular 7

php - mysqli_fetch_assoc()需要参数/调用成员函数bind_param()错误。如何获取并修复实际的mysql错误?

java - 查询 LocalDateTime

java - 两个 Web 服务之间的通信

c - 须藤环境变量

c# - 无法使用 Environment.GetResourceString 静态方法

java - 在处理 3.x 时同时运行 oscp5 库和 P3D 渲染器时出现问题

java - 是抛出异常还是返回 null 更 Java-thonic?