如何自动设置当前会话的 $DISPLAY 变量?

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

1
这样的问题更多关于操作系统而不是编程,可以在ServerFault.com提问。 - SpliFF
1
当vncserver启动时,DISPLAY变量似乎会自动设置在新的vnc会话中,至少这对我有效。 - Sam Liao
你应该描述一下你要登录的机器以及vnc服务器运行的位置。在vncserver环境中创建的任何shell都已经具有正确的DISPLAY变量。 听起来你正在远程登录到一个远程主机,并尝试在已经运行的X服务器上启动应用程序。你的登录脚本不知道应该连接到哪个vnc服务器,我们也不知道。 - codeDr
5个回答

11

这是我刚刚草拟的代码。它检查了最后启动的“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
@Dima 好的观点。我已经修改了我的答案,至少将进程限制在当前用户。 - Nick
我不得不更改您的awk命令行为:export DISPLAY=$(cat /proc/$PID/environ | strings | awk 'BEGIN{FS="=";} $1=="DISPLAY" {print $2; exit}') 然后它才能正常工作。 - isaaclw
另外,我将 pgrep 更改为 'gnome-session|xfdesktop',以包括 xfce 桌面。完整命令现在是:PID=$(pgrep -n -u $USER 'gnome-session|xfdesktop') - isaaclw
2
导出行可以简化为:export $(grep -z ^DISPLAY= /proc/$PID/environ) - scai

8

你是否使用Bash?前往您的主目录中的文件.bashrc并设置变量,然后导出它。

DISPLAY=localhost:0.0 ; export DISPLAY

如果要为所有用户执行此操作,可以使用/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等,所以我需要一个更通用的解决方案。 - user130334

1

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


1

根据我过去遇到并解决的问题,我猜测:

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

我最终得出了两个解决方案。我的原始解决方案是基于使用rsh。此后,我们的大多数服务器都安装了ssh,这使得这一过程更加容易。

使用rsh,我编写了一个包含机器、操作系统和自定义选项的表格,以指导perl中的此过程。 Bourne shell不够用,我们的Sun或HP机器上没有bash(当时AIX 5L还未发布时也没有bash)。 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,确保服务器上设置了X11Forwarding为yes(sshd_config),然后我就可以通过ssh连接到计算机,让X命令通过加密的方式跨越网络传输,它总是会回到正确的位置。

0

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接