2008年7月7日星期一

xauth

xauth 是一个很有意思的程序,也许平时不会直接用到,但是很多程序会默默的使用它为你工作,比如前面的 ssh。

提到 xauth 就不可避免的涉及到 X 的工作原理,这里仅仅讨论认证部分。比较傻瓜且很不安全的方式就是用 xhost,比较聪明的方式还是用 xauth。这里讨论后者,在后面提到前者的时候我们会将它们比较。xauth 认证靠一串 128bit 的数字,所谓的 magic cookie,正式名称为 MIT-MAGIC-COOKIE-1。这串数字由 X server 产生,一般一个 X client 需要访问 X server 根据 -display 或者 DISPLAY 变量给出的地址,查询本地 XAUTHORITY 文件(一般是 ~/.Xauthority)获得对应 magic cookie,这样才会被授权访问 X server。在 X11R6.3 以后还加入了一个新特性,就是 X11 服务器可以 on-the-fly 生成 magic cookie,并标注某些 trusted,某些为 untrusted,这样给不同的 Xclient 以不同的 cookie,就可以防止某些 X client 程序盗取键盘按键序列等敏感信息。

一般来说 X server 启动的时候会产生 magic cookie,我们只需要将合适的 cookie 分发到需要调用 X clients 的主机上,那些主机的 X clients 就可以出现在 X server 上了。比较常用的 magic cookie 的生成程序来自于 mcookie。

xauth 就是用来操纵 XAUTHORITY 文件的程序,使用它会方便分发 magic cookie。一方面可以直接用 xauth command 来执行相关的命令,另一方面也可以在命令行上通过 xauth 进入交互环境。命令不多,有 n 开头和非 n 开头的命令,n 表示输出用数字,在某些情况更加合适一些,如某些传输情况。由于 XAUTHORITY 文件访问可能被锁定,所以有 -b 选项尝试解锁,-i 选项忽视锁。下面是常用命令,
  • add displayname protocolname hexkey:添加一个 display 和对应的 magic key,中间的 protocolname 可以用 . 表示 magic cookie。
  • generate displayname protocolname [trusted|untrusted]:和 add 不同在于是自动连接 X server 获得 magic cookie。
  • [n]extract filename displayname:把指定 displayname 的 magic cookie 写入指定文件,如果文件名为 - 则是标准输出。
  • [n]list [displayname...]:显示 XAUTHORITY 里面的 magic cookies。
  • [n]merge [filename...]:把 filename 和现在的融合在一起。
  • remove displayname:删除某项。
  • source filename:执行 xauth 命令序列
  • info:显示相关信息
  • exit:保存并退出。
  • quit:不保存但退出。

我们可以分析一下 ssh 如何实现 X11 forwarding,首先设置 DISPLAY 变量,并将其关联到自己的 tunnel,然后需要把远程主机 XAUTHORITY 更改:
if read proto cookie && [ -n "$DISPLAY" ]; then
if [ ‘echo $DISPLAY | cut -c1-10‘ = ’localhost:’ ]; then
# X11UseLocalhost=yes
echo add unix:‘echo $DISPLAY |
cut -c11-‘ $proto $cookie
else
# X11UseLocalhost=no
echo add $DISPLAY $proto $cookie
fi | xauth -q -
fi
可见,如果是 localhost 开始(已经使用了 ssh)取 localhost: 后面的数字前面加上 unix:,否则直接使用。这个符合语句通过 echo 把命令显示并由管道输入给 xauth。有些不使用 ssh 的环境,如 telnet 或者 rsh,同时 home 又不公用,就需要一边 xauth list 一边 xauth merge 了。

相关程序:
xhost 来自于 x11-server-utils。
mcookie 来自于 util-linux。

没有评论: