本文主要介绍如何在Linux下配置图形服务以便ssh远程使用GUI环境。
X的概念
Linux的桌面环境是通过X Server(XFree86、Xorg),X Client(libX11),Window Manager(KDE、xfce、wm2)等服务提供的。我们先简单了解X涉及的一些概念,下面的X架构图来自wikipedia,请注意X server是运行在有屏幕的机器这边,也就是你自己的PC上,而远程执行的应用,例如jvisualvm则是X的client端。换句话说就是SSH的client端是X的server端,SSH的server端是X的client端。
Windows下常用的X Server是Xming和MobaXterm。它们都带有简单的窗口管理服务,例如下图就是MobaXterm WM配置,以及启用fvwm的窗口界面:
X server启动后默认会监听本地6000端口,X client通过环境变量
DISPLAY
获取X server服务地址,例如DISPLAY=localhost:0.0
代表X server在本机6000端口,DISPLAY=localhost:1.0
代表X server在本机6001端口依此类推。建立连接之前,X server还需要验证X client的身份,最常的是基于Cookie机制,也就是client读取~/.Xauthority
中的信息用于授权。
由于X server是监听在本地的,ssh服务端的远程client想连回本地必须使用remote tunnel,X11 forwarding则可以方便的将X11协议转发到远程主机。转发过程中会自动设置DISPLAY
环境变量和Xauth授权信息。
设置步骤和检查点
- SSH服务端设置
检查/etc/ssh/sshd_config
文件,确保以下参数正确:
X11Forwarding yes #启用X11 Forwarding
#X11DisplayOffset 10 #默认从10.0开始设置DISPLAY环境变量
然后重启sshd,重启并不会导致已连上的ssh client断开。
service sshd restart
- SSH客户端设置
-
PuTTY+Xming,确保Xming已开启,putty中已启用X11 forwarding。
- MobaXterm默认已启动X server和X11 forwarding,无需特别配置。
- 服务器的X配置
有些服务器可能没安装xauth导致无法编辑.Xauthority
文件,请用下面的命令安装
sudo yum install xorg-x11-xauth
服务器的XLib版本则可以通过rpm -q libX11
命令确认。
SSH调试
在MobaXterm命令行窗口执行ssh -vvv root@host
可以看到详细的debug信息,v的个数越多内容越详细。sudo或su之后无法连接X server
- 缺少
DISPLAY
环境变量:直接export之前账户的DISPLAY
信息。 -
Authorisation not recognised
异常:导入前一用户的xauth信息,比如导入test用户的到当前用户下:
xauth add $(xauth -f ~test/.Xauthority list|tail -1)
-
.Xauthority
的一些异常可以试试下面这组命令
# Rename the existing .Xauthority file by running the following command
mv .Xauthority old.Xauthority
# xauth with complain unless ~/.Xauthority exists
touch ~/.Xauthority
# only this one key is needed for X11 over SSH
xauth generate :0 . trusted
# generate our own key, xauth requires 128 bit hex encoding
xauth add ${HOST}:0 . $(xxd -l 16 -p /dev/urandom)
- SSH跳转后的设置
上面概念部分已经说过X11 forwarding本质上就是通过ssh remote tunnel将本地X server转发到远程,所以即使远程主机的X11 forwarding是关闭的,我们也可以通过ssh -R
转发服务。
ssh -R6000:127.0.0.1:6000 root@host #可以多次跳转
export DISPLAY=localhost:0.0
#根据需要执行xauth add