X

Xauth

用xhost命令添加授权的主机或者用户,可以让远端机器上的X客户端程序显示在本机的X server上,此外需要在远端机器上把DISPLAY变量设为本机的。理论上是这样的,实际上还有一个xauth的步骤。直接简单这样做是不行的(Ubuntu 10.10),以前似乎可以。不折腾这个了,直接ssh -X remote machine,就把这些都设置了。参见ssh(1)的X11 Forwording节:

     The DISPLAY value set by ssh will point to the server machine, but with a

     display number greater than zero.  This is normal, and happens because

     ssh creates a “proxy” X server on the server machine for forwarding the

     connections over the encrypted channel.

     ssh will also automatically set up Xauthority data on the server machine.

     For this purpose, it will generate a random authorization cookie, store

     it in Xauthority on the server, and verify that any forwarded connections

     carry this cookie and replace it by the real cookie when the connection

     is opened.  The real authentication cookie is never sent to the server

     machine (and no cookies are sent in the plain).

http://ubuntuforums.org/showpost.php?p=1406690&postcount=11里面告诉如何手动搞定xauth的方法。

GDM的远程登录

服务端的地址是192.168.1.10,客户端的地址是192.168.1.2。这里的服务端是指开了GDM的机器,而客户端执行远程登陆的机器。在服务端对GDM进行配置。在/etc/gdm/custom.conf里面加入:

[xdmcp]

Enable=false

然后在客户端用

X :1 -query 192.168.1.10

即可远程连接到GDM的登录窗口。这里的-query不是X的命令行选项,应该是所有X应用都支持的选项。另外,这个连接和GDM的DisableTCP选项无关。上面的命令执行后,其实是客户端开启的X server在x11-1(6001)端口监听,在客户端观察TCP连接如下:

State      Recv-Q Send-Q      Local Address:Port          Peer Address:Port

ESTAB      0      0             192.168.1.2:x11-1         192.168.1.10:42860

ESTAB      0      0             192.168.1.2:x11-1         192.168.1.10:42856

ESTAB      0      0             192.168.1.2:x11-1         192.168.1.10:42842

ESTAB      0      0             192.168.1.2:x11-1         192.168.1.10:42835

ESTAB      0      0             192.168.1.2:x11-1         192.168.1.10:42854

ESTAB      0      0             192.168.1.2:x11-1         192.168.1.10:42850

ESTAB      0      0             192.168.1.2:x11-1         192.168.1.10:42845

ESTAB      0      0             192.168.1.2:x11-1         192.168.1.10:42861

ESTAB      0      0             192.168.1.2:x11-1         192.168.1.10:42855

ESTAB      0      0             192.168.1.2:x11-1         192.168.1.10:42831

......

上面的连接用了ss -p,但是没有输出相关的程序。而在开启GDM的服务端,ss -p的输出如下:

State      Recv-Q Send-Q      Local Address:Port          Peer Address:Port

ESTAB      0      0            192.168.1.10:42849          192.168.1.2:x11-1    users:(("gnome-power-man",22773,3))

ESTAB      0      0            192.168.1.10:42851          192.168.1.2:x11-1    users:(("synce-trayicon",22815,3))

ESTAB      0      0            192.168.1.10:42855          192.168.1.2:x11-1    users:(("indicator-apple",22853,3))

ESTAB      0      0            192.168.1.10:42874          192.168.1.2:x11-1    users:(("gdu-notificatio",22962,3))

ESTAB      0      0            192.168.1.10:42841          192.168.1.2:x11-1    users:(("nautilus",22758,3))

ESTAB      0      0            192.168.1.10:42844          192.168.1.2:x11-1    users:(("polkit-gnome-au",22763,3))

ESTAB      0      0            192.168.1.10:42858          192.168.1.2:x11-1    users:(("notification-ar",22858,3))

ESTAB      0      0            192.168.1.10:42846          192.168.1.2:x11-1    users:(("evolution-alarm",22762,3))

ESTAB      2592   0            192.168.1.10:42826          192.168.1.2:x11-1    users:(("dbus-launch",22698,3))

ESTAB      0      0            192.168.1.10:42864          192.168.1.2:x11-1    users:(("gnome-screensav",22949,3))

......

是服务端的各个X应用连接到了客户端的X server。可是把客户端电脑关了,这些TCP连接都不会死。把服务端休眠了,第二天开机观察:

$ w

 09:58:51 up 19:05,  6 users,  load average: 0.20, 0.14, 0.34

USER     TTY      FROM              LOGIN@   IDLE   JCPU   PCPU WHAT

tux      tty8     :0               Wed19   19:05m  3:10   0.28s gnome-session --session=classic-gnome

tux      pts/0    :0.0             09:58    0.00s  0.24s  0.01s w

tux               192.168.1.2:1    Wed19   18:37   9:52   0.28s gnome-session --session=classic-gnome

最后一个登录项是昨天的X远程登录。看看TCP连接:

State      Recv-Q Send-Q      Local Address:Port          Peer Address:Port

ESTAB      0      0            192.168.1.10:42851          192.168.1.2:x11-1    users:(("synce-trayicon",22815,3))

ESTAB      0      0            192.168.1.10:42855          192.168.1.2:x11-1    users:(("indicator-apple",22853,3))

ESTAB      0      0            192.168.1.10:42874          192.168.1.2:x11-1    users:(("gdu-notificatio",22962,3))

ESTAB      0      0            192.168.1.10:42841          192.168.1.2:x11-1    users:(("nautilus",22758,3))

ESTAB      0      0            192.168.1.10:42844          192.168.1.2:x11-1    users:(("polkit-gnome-au",22763,3))

ESTAB      0      0            192.168.1.10:42858          192.168.1.2:x11-1    users:(("notification-ar",22858,3))

ESTAB      0      0            192.168.1.10:42846          192.168.1.2:x11-1    users:(("evolution-alarm",22762,3))

ESTAB      2688   0            192.168.1.10:42826          192.168.1.2:x11-1    users:(("dbus-launch",22698,3))

ESTAB      0      0            192.168.1.10:42864          192.168.1.2:x11-1    users:(("gnome-screensav",22949,3))

ESTAB      0      0            192.168.1.10:42878          192.168.1.2:x11-1    users:(("awn-applet",22987,3))

ESTAB      0      0            192.168.1.10:42888          192.168.1.2:x11-1    users:(("update-notifier",23073,3))

ESTAB      2592   0            192.168.1.10:42808          192.168.1.2:x11-1

ESTAB      0      0            192.168.1.10:42845          192.168.1.2:x11-1    users:(("vino-server",22764,3))

ESTAB      0      0            192.168.1.10:46341          192.168.1.2:x11-1    users:(("gnome-screensav",26856,3))

......

192.168.1.2的IP都不可达了,而这些TCP连接还处于ESTABLISHED状态,这导致客户端再进行X远程连接被拒绝。甚至停止掉GDM,这些进程都不会结束。必须挨个杀掉这些进程,或者重启电脑才能让这些TCP连接消失。这种情况确实太不干净了。不过再次试验,结束掉客户端的X服务后,TCP连接都正常消失了。

参数