2005年(8)
分类:
2005-11-11 15:49:21
X 显示器是通过 hostname:displaynumber.screennumber 这种形式的名称知晓的。运行在工作站(如 PC)上的 Linux 通常只有一个带有单个屏幕的显示器。在这种情况下,displayname 可以(并且通常会)被省略,所以显示器称为 :0.0。我们假设您在阅读本文时是使用图形方式登录的,因此您的启动已经为您设置了 DISPLAY 环境变量。但是,当您使用 su 切换到不同用户时,不会设置这个变量。清单 4 展示了如何使用 echo 命令来显示 DISPLAY 环境变量,然后切换到另一个用户并尝试启动 xclock 应用程序,最初 DISPLAY 环境变量是空的,然后将其值设置为 :0.0。这是 SUSE SLES9 系统中的示例。在 Red Hat 系统上有所不同,后面我们将会提到。
清单 4. 尝试启动 xclock
ian@lyrebird:~> whoami lyrebird:~ # xclock Error: Can't open display: :0.0 |
让我们研究一下这里发生的情况。在本例中,用户 ian 登录到系统,并且正如我们所期望的那样,其 DISPLAY 环境变量被设置为 :0.0。当 ian 切换成用户 root 时,不会去设置 DISPLAY 环境变量,并且因为 xclock 应用程序不能打开显示器,所以启动 xclock 的尝试失败了。
因此,替代用户 root 设置了 DISPLAY 环境变量,并将它导出,以便它可用于可能从该终端窗口启动的其他 shell。请注意,设置和导出环境变量时不使用 $ 前缀符号,但显示和用其他方法使用该值时则使用 $ 作为前缀。也要注意,如果 su 命令省略了 -(减号)符号,那么 DISPLAY 环境就已经如用户 ian 那样被设置。可是,即使设置了环境变量,但 xclock 启动还是失败了。
第二次失败的原因在于 X 的客户机/服务器本质。尽管 root 运行在该系统惟一一个显示器上的窗口中,但该显示器实际上由最初登录的用户(在本例中是 ian)所拥有。对于 Linux 系统中的本地显示器,认证通常是依赖于所谓的 MIT-MAGIC-COOKIE-1,每次 X 服务器重新启动时它都会重新生成。用户可以从他的(或她的)目录中的 .Xauthority 将 magic cookie 导出 (使用 xauth extract 命令),并把它提供给另一个用户,那个用户可以使用 xauth merge 将其 融合 到自己的 .Xauthority 文件。作为另一种选择,用户可以通过 xhost +local: 命令来授权其他用户对本地系统的访问。
有另一个可选方法,即将 XAUTHORITY 环境变量设置为包含正确 MIT-MAGIC-COOKIE-1 的文件的位置。当切换到 root 时,这样做很容易,因为 root 可以读取其他用户所拥有的文件。实际上,在清单 4 中我们就是这样做的,所以,在设置并将 XAUTHORITY 导出到 ~ian/.Xauthority 文件后,root 现在就可以在桌面上打开图形窗口。我们说过将会提及 Red Hat 系统的不同之处,那就是在 Red Hat 系统上使用 su 切换到 root 与 SUSE 系统稍有不同,它会为您自动完成显示器的设置。
那 么,如果是切换到另一个非 root 用户时会怎样呢?在清单 4 中,您会注意到,用户 ian 的 .Xauthority 文件只允许所有者进行读写访问。甚至是同组的成员也不能读取它,这正是您所希望的,除非您乐意让某人打开一个接管您的屏幕并禁止您做任务事情的应用程序! 所以,如果您从 .Xauthority 文件中导出了一个 MIT-MAGIC-COOKIE-1,那么必须要找到某个安全的方式来将它交给您信任的非 root 用户。由于这方面的困难,您可能会发现,对单用户的 Linux 系统来说,xhost 更好用,尽管 xauth 方法通常比 xhost 命令用得更多。不过,要谨记 X Windows 系统的网络传统,以便您不会偶然地授予他人不在计划之内的权限,从而开放您的系统,让任意网络用户都可以在您的桌面上打开窗口。
用户 ian 可以使用 xhost 来赋与所有本地用户在显示器(:0.0)上打开应用程序的权限。在您的桌面上打开另一个终端窗口并输入这条命令:
xhost +local:
请注意末尾的冒号(:)。这样将允许同一系统上的其他用户连接到 X 服务器并打开窗口。由于您使用的是一个单用户系统,这就意味着您可以
su 到一个任意的非 root 用户,而且现在可以启动 xclock 或其他 X 应用程序了。
有关使用 xauth 和 xhost 命令的更多详细信息,可以根据需要使用命令 info xauth、man xauth、 info xhost 或者 man xhost 来查看联机手册页。如果您对 X 连接的安全性感兴趣,可以从 Xsecure 的手册页入手。