Linux下新手基本操作及技巧看图上路 (4)

您总是可以通过注销当前用户标识,然后以新的用户标识登录来切换到另一个用户标识。但是如果您只需要以另一个用户身份运行几个快捷的命令,那要怎么办呢? Linux 以 su(替代用户,substitute user)命令的形式向您提供了解决方案,该命令允许您暂时以另一个用户身份运行命令。这经常用于需要 root 访问权的任务。实际上,如果您使用终端程序(如 telnet)远程连接一个系统,那么许多 Linux 发行版本会阻止您以 root 用户身份登录。这是良好的安全性做法,我们建议您不要尝试绕开这种限制。相反,您应该以非特权用户身份登录,然后使用 su 命令成为 root。 

那么,让我们假定您已经登录并正在使用终端窗口,而且您不是 root 用户,但需要以 root 用户身份运行一条命令。用于这种情形的两种最常见的 su 形式是:

  su 
  su - 

第一种形式(不带 - 符号)只是将您切换成 root,但没有更改包括路径在内的环境变量。第二种形式使用了 - 符号,如果您确实喜欢输入额外的字母,也可以输入为 -l 或者 -login。这允许读取替代用户的登录启动文件,从而设置诸如路径、环境和提示符之类的东西。清单 4 显示了这两种形式在 SuSE Linux 系统上的示例。在两个示例中,我们都使用了 pwd(打印工作目录,print working directory)命令来显示当前工作目录。请注意提示符是如何变化的。如果您希望理解关于如何定制您自己的提示符,或想了解是什么使提示符以现在的形式显示的更多信息,请查阅 developerWorks 上的“技巧:提示行魔术” 技巧文章。

清单 3. 切换到 root 用户

ian3@echidna:~> su
Password:
echidna:/home/ian3 #pwd
/home/ian3

ian3@echidna:~> su -
Password:
echidna:~ # pwd
/root


您会注意到必须提供口令以切换到 root 用户,这一点都不足为奇。您还可以使用 su 命令切换到其他非 root 用户。例如:

  su - db2inst1 

如果您已经是 root 用户,则无需提供口令,但如果您不是 root 用户,那么必须提供正确的口令。 

如果您正在使用 bash shell(它是大多数 Linux 系统上的默认 shell),要返回前一个标识,只要按 Ctrl-d 或输入 exit 并按 Enter。 

以另一个用户身份使用 GUI 应用程序 

您可能注意到了,我们在前一节中讨论 su 命令时,只运行了在终端窗口中显示输出的命令。要能够运行 GUI 应用程序,您可能必须采取一些额外的步骤,具体步骤因 Linux 发行版本而异。 Linux 上的 GUI 应用程序使用 X Window 系统(X Window System),它旨在允许多个用户使用窗口化的应用程序通过网络访问计算机。 

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
ian
ian@lyrebird:~> echo $DISPLAY
:0.0
ian@lyrebird:~> su -
Password:
lyrebird:~ # echo $DISPLAY

lyrebird:~ # xclock
Error: Can't open display:
lyrebird:~ # export DISPLAY=:0.0
lyrebird:~ # echo $DISPLAY
:0.0
lyrebird:~ # xclock
Xlib: connection to ":0.0" refused by server
Xlib: No protocol specified

Error: Can't open display: :0.0
lyrebird:~ # export XAUTHORITY=~ian/.Xauthority
lyrebird:~ # xclock
lyrebird:~ # ls -l ~ian/.Xauthority
-rw-------  1 ian users 206 Feb 18 16:20 /home/ian/.Xauthority


让我们研究一下这里发生的情况。在本例中,用户 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 的手册页入手。

posted @ 2010-11-22 16:03  footman265  阅读(284)  评论(0编辑  收藏  举报