我看到
$DISPLAY
被设置为localhost: 0.0。如果我在vnc服务器上运行,这可能不正确。有没有一种方式在我的登录脚本中自动设置它?$DISPLAY
被设置为localhost: 0.0。如果我在vnc服务器上运行,这可能不正确。有没有一种方式在我的登录脚本中自动设置它?这是我刚刚草拟的代码。它检查了最后启动的“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 文件中即可。
export DISPLAY=$(cat /proc/$PID/environ | strings | awk 'BEGIN{FS="=";} $1=="DISPLAY" {print $2; exit}')
然后它才能正常工作。 - isaaclwpgrep
更改为 'gnome-session|xfdesktop'
,以包括 xfce 桌面。完整命令现在是:PID=$(pgrep -n -u $USER 'gnome-session|xfdesktop')
。 - isaaclwexport $(grep -z ^DISPLAY= /proc/$PID/environ)
。 - scai你是否使用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
你的vncserver有一个配置文件,其中设置了显示编号。为了自动化,一种解决方案是解析此文件,提取数字并正确设置它。更简单(更好)的方法是在配置脚本中设置此显示编号,并在VNC服务器配置和初始化脚本中使用它。
根据我过去遇到并解决的问题,我猜测:
我最终得出了两个解决方案。我的原始解决方案是基于使用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传递,因此显示器始终会正确设置。登录后,您需要告诉您的VNC客户端导出正确的$DISPLAY。如何操作可能取决于您的VNC客户端。