我看到它$DISPLAY
设置为 localhost:0.0 如果我在 vnc 服务器上运行,这可能不正确,有没有办法在我的登录脚本中自动设置它?
5 回答
这是我刚刚敲过的东西。它检查上次启动的“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 文件中。
你使用 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
我在这里猜测,基于我过去解决的问题:
- 您正在连接到机器 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”身份进入时“这有一些差异,因为我们在某些机器上有多个根,原因我不完全理解),并且 $cmd 基本上是“DISPLAY=$DISPLAY xterm”,但如果我启动 konsole,例如,$cmd 将是"konsole --display=$DISPLAY"。由于 $DISPLAY 是在本地评估的(在它设置正确的地方),而不是通过 rsh 逐字传递,所以显示将始终正确设置。
我还必须确保没有人做任何愚蠢的事情,比如重置 DISPLAY,如果它已经设置好了。
现在,我只使用 ssh,确保服务器上的 X11Forwarding 设置为 yes(sshd_config),然后我可以 ssh 到机器,让 X 命令通过加密的线路,它总是会回到正确的地方。
您的 vncserver 有一个配置文件来设置显示编号。要自动执行此操作,一种解决方案是解析此文件,提取数字并正确设置。更简单(更好)的是在配置脚本中设置此显示编号,并在您的 VNC 服务器配置和初始化脚本中使用它。
登录后,您需要告诉您的 vnc 客户端导出正确的 $DISPLAY。如何执行此操作可能取决于您的 vnc 客户端。