【问题标题】:How do I automatically set the $DISPLAY variable for my current session?如何为当前会话自动设置 $DISPLAY 变量?
【发布时间】:2010-11-06 15:20:57
【问题描述】:

如果我在 vnc 服务器上运行,我看到 $DISPLAY 设置为 localhost:0.0,这可能不正确,有没有办法在我的登录脚本中自动设置它?

【问题讨论】:

  • 像这样的问题更多是关于操作系统而不是编程,而 serverfault.com 就是他们的去处。
  • 似乎当 vncserver 启动时,在新的 vnc 会话中自动设置了 DISPLAY 变量,至少这对我有用。
  • 你应该描述你正在登录的机器,以及 vnc 服务器在哪里运行。在 vncserver 环境中创建的任何 shell 都已经具有正确的 DISPLAY 变量。听起来您正在远程登录到远程主机并尝试在已经运行的 X 服务器上启动应用程序。您的登录脚本不知道它应该连接到哪个 vnc 服务器,而不是我们。

标签: linux shell vnc


【解决方案1】:

这是我刚刚敲过的东西。它检查最后启动的“gnome-session”进程的环境(当 VNC 启动会话/窗口管理器时,DISPLAY 设置正确)。将“gnome-session”替换为您的 VNC 服务器在启动时启动的任何进程的名称。

PID=`pgrep -n -u $USER gnome-session`
if [ -n "$PID" ]; then
    export DISPLAY=`awk 'BEGIN{FS="="; RS="\0"}  $1=="DISPLAY" {print $2; exit}' /proc/$PID/environ`
    echo "DISPLAY set to $DISPLAY"
else
    echo "Could not set DISPLAY"
fi
unset PID

你应该可以把它放到你的 .bashrc 文件中。

【讨论】:

  • 登录,切换用户并登录到另一个帐户,切换回第一个帐户,“最后启动的 gnome-session”不再是活动的。
  • @Dima 好点。我已经修改了我的答案,至少将进程限制为当前用户。
  • 我不得不将您的 awk 行更改为:export DISPLAY=$(cat /proc/$PID/environ | strings | awk 'BEGIN{FS="=";} $1=="DISPLAY" {print $2; exit}') 然后它起作用了。
  • 另外,我将 pgrep 更改为 'gnome-session|xfdesktop',以包括 xfce 桌面。完整命令现在是:PID=$(pgrep -n -u $USER 'gnome-session|xfdesktop')
  • 导出行可以简化为:export $(grep -z ^DISPLAY= /proc/$PID/environ).
【解决方案2】:

你使用 Bash 吗?转到主目录中的文件 .bashrc 并设置变量,然后将其导出。

显示=本地主机:0.0;导出显示

如果您想为所有用户执行此操作,可以使用 /etc/bashrc。

您可能还想查看 ~/.bash_profile 和 /etc/profile

编辑:

function get_xserver ()
{
    case $TERM in
       xterm )
            XSERVER=$(who am i | awk '{print $NF}' | tr -d ')''(' )    
            XSERVER=${XSERVER%%:*}
            ;;
        aterm | rxvt)           
            ;;
    esac  
}

if [ -z ${DISPLAY:=""} ]; then
    get_xserver
    if [[ -z ${XSERVER}  || ${XSERVER} == $(hostname) || \
      ${XSERVER} == "unix" ]]; then 
        DISPLAY=":0.0"          # Display on local host.
    else
        DISPLAY=${XSERVER}:0.0  # Display on remote host.
    fi
fi

export DISPLAY

【讨论】:

  • 如果我把它放在我的 bashrc 中,它不会与 vncserver 一起使用,因为它会创建其他显示,如 localhost:1.0 等,所以我需要一个更通用的解决方案。
【解决方案3】:

我在这里猜测,基于我过去解决的问题:

  • 您正在连接到机器 B 上的 vnc 服务器,并使用机器 A 上的 VNC 客户端显示它
  • 您正在机器 B 上启动一个控制台(xterm 或等效)并使用它连接到机器 C
  • 您想在机器 C 上启动一个基于 X 的应用程序,让它显示在机器 B 上的 VNC 服务器上,这样您就可以在机器 A 上看到它。

我最终得到了两个解决方案。我最初的解决方案是基于使用 rsh。从那时起,我们的大多数服务器都安装了 ssh,这让这变得更容易了。

使用 rsh,我整理了一张机器、操作系统和自定义选项的表格,这些选项将在 perl 中指导这个过程。 Bourne shell 还不够,而且我们在 Sun 或 HP 机器上没有 bash(当时 AIX 上也没有 bash - AIX 5L 还没有推出)。 Korn shell 也不是什么好选择,因为我们的大多数 Linux 机器都没有安装 pdksh。但是,如果你没有遇到这些限制,我认为你可以在 ksh 或 bash 中实现这个想法。

无论如何,我基本上会运行 'rsh $machine -l $user "$cmd"' 其中 $machine,当然,是我登录的机器,$user,同样明显(尽管当我进入作为“root”,这有一些差异,因为由于我不完全理解的原因,我们在某些机器上有多个 root),并且 $cmd 基本上是“DISPLAY=$DISPLAY xterm”,但如果我启动 konsole,例如,$ cmd 将是“konsole --display=$DISPLAY”。由于 $DISPLAY 是在本地计算的(在它设置正确的地方),而不是通过 rsh 直接传递,所以显示将始终正确设置。

我还必须确保没有人做任何愚蠢的事情,比如如果已经设置了重置 DISPLAY。

现在,我只使用 ssh,确保在服务器 (sshd_config) 上将 X11Forwarding 设置为 yes,然后我可以 ssh 到机器,让 X 命令通过加密的线路,它会一直运行回到正确的地方。

【讨论】:

    【解决方案4】:

    您的 vncserver 有一个配置文件来设置显示编号。要自动执行此操作,一种解决方案是解析此文件,提取数字并正确设置。更简单(更好)的是在配置脚本中设置此显示编号,并在您的 VNC 服务器配置和初始化脚本中使用它。

    【讨论】:

      【解决方案5】:

      您需要告诉您的 vnc 客户端在您登录后导出正确的 $DISPLAY。如何执行此操作可能取决于您的 vnc 客户端。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-03-20
        • 2021-03-07
        • 2016-10-25
        • 2013-01-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-08
        相关资源
        最近更新 更多