强烈推荐不要以 root 身份执行图像界面。这样做很易会引起大祸。最妥善的做法就是登录成为没有特殊权限的一般用户,然后按需要应用 root 的权限。
有很多指令都只可以用 root 身份去执行,因此我们需要成为 root 用户。要这样做,我们可以使用 su 指令(更替用户)。su 指令有下列格式:
su - <user>
或
su <user>
但我们最经常是用 su 指令来成为 root 用户:
su - root
或
su root
如果不指定用户名称,缺省的用户是 root,因此以上的指令可以缩短为:
su -
或
su
然然这两个指令有不同的特性。’su
很多时候,用户会单单采用 ‘su’ 来成为 root,尝试执行一个指令(例如:ifconfig),然后收到一个 ‘command not found’ 的错误。举个例子:
su
Password:
ifconfig
bash: ifconfig: command not found
原因是系统上的普通用户与 root 用户有不同的 PATH 环境变量。当你输入一个 Linux 指令,指令壳会尝试在用户的 PATH 内寻找及执行那个指令。它会寻找 PATH 变量内的每个目录直至找到配对。
很多时候当用户在 IRC 或其它地方汇报问题时,他们会被导向此页。当你要检测_为何_找不到某个执行档时,查看现有的 PATH 很有帮助:echo $PATH
为普通用户而设的指令多数位于 /usr/bin
及 /bin
,偶尔也会在 /usr/local/bin
—— 上游在包装时缺省不会采用 /usr/local/*
路径。然而,root 的指令多数位于 /usr/sbin
及 /sbin
,偶尔也会在 /usr/local/sbin
。这亦反映在 root 的 PATH 内。
当你用 su - 来变成 root 时,你亦会采纳 root 的 PATH;反观只用 su 就会保留用户的 PATH 值。正因如此,单单用 su 来成为 root 时,执行/usr/local/sbin/
、/usr/sbin
、或 /sbin
内的指令便会导致 command not found 这个错误。要获得更详细的解释,请参阅 bash 的使用手册(man bash),特别是有关 INVOCATION 及登录指令壳这个部份。
因此你假若只使用 su,便须要提供指令的全路径(例如:/sbin/ifconfig
),否则请使用 su - 来成为 root。
其实你不必在每次执行某些管理的工作时都要是 root。由於有 sudo,你可以用 root 的身份去执行个别或所有指令。当 sudo 被安装妥后(组件名称:sudo),你可以用 root 的身份执行 visudo 来设置它。基本上,这样会利用 $EDITOR(缺省是 vim)来打开 /etc/sudoers
,但我们不推荐你手动编辑它。假若你是在一台桌面计算机上,你应该会想做差不多所有事情。
因此,一个仓促的方法来设置 sudo 就是在 sudoers 文件的底部加入:
bob ALL=(ALL) ALL
这里 bob 是用户的名称。存储(按 escape,然后输入 ZZ),接著你便准备好了。现在以 bob 登录,然后执行下列例子:
$sudo yum update
sudo 会要求输入口令。这个口令是 bob 的口令,不是 root 的口令,因此请小心地将 sudo 权限给予每个用户。
不过 sudo 能够做更多事情。我氜可以容许一个用户或一群用户单单执行一个指令、或者一组指令。让我们重新返到 sudoers 文件(顺带一提,它在 CentOS 5 下有很清楚的备注)。首先我们看看 bob 及 alice,他们是 admin 群组内的成员。如果我们想 admin 群组内的所有成员都能够以 root 的身份执行所有指令,我们可以修改上面的样例:
%admin ALL=(ALL) ALL
bob 依然可以做他的事情,而 alice 现在亦能够利用她的口令,以相同的权限执行 sudo。假若 bob 及 alice 并不是在同一个群组内,我们可以在 sudoers 档内定义一个用户别名:
User_Alias ADMINS = alice, bob
这里我们定义了名为 ADMINS 的别名,内里有 alice 及 bob 为成员。
然而,我们不想 alice 及 bob 以 root 的身份执行所有指令,而只是执行 updatedb。让我们定义一个指令别名:
Cmnd_Alias LOCATE = /usr/sbin/updatedb
这样仍然不定够!我们须要告诉 sudo ADMINS 内的用户只能执行 LOCATE 内的指令。要这样做,我们用下列这行取代 %admin 那一行:
ADMINS ALL = LOCATE
这里的意思就是 ADMINS 别名内的用户可以执行 LOCATE 别名内的所有(ALL)指令。
此刻,/etc/sudoers 会是这个样子:
User_Alias ADMINS = alice, bob
Cmnd_Alias LOCATE = /usr/bin/updatedb
ADMINS ALL = LOCATE
alice 及 bob 应该可以利用他们的口令来以 root 的身份执行 updatedb。
如果我们将文件的最后一行改为:
ADMINS ALL = NOPASSWD: LOCATE
alice 及 bob 便能够在不输入口令的情况下执行 sudo updatedb。
你可以在一个指令别名内加入更多指令,以及在一个规则里加入更多别名。举个例说,我们可以创建一个名为 NETWORKING 的别名,当中包含一些网络的指令,例如:ifconfig、route 或 iwconfig:
Cmnd_Alias NETWORKING = /sbin/route, /sbin/ifconfig, /bin/ping, /sbin/dhclient, /usr/bin/net, /sbin/iptables,
/usr/bin/rfcomm, /usr/bin/wvdial, /sbin/iwconfig, /sbin/mii-tool
让我们将这些加进我们的 /etc/sudoers 文件内(利用 visudo!),然后授权给我们的 ADMINS 群组内的用户。现在 /etc/sudoers 会是这个样子:
User_Alias ADMINS = alice, bob
Cmnd_Alias LOCATE = /usr/bin/updatedb
Cmnd_Alias NETWORKING = /sbin/route, /sbin/ifconfig, /bin/ping, /sbin/dhclient, /usr/bin/net, /sbin/iptables,
/usr/bin/rfcomm, /usr/bin/wvdial, /sbin/iwconfig, /sbin/mii-tool
ADMINS ALL = LOCATE, NETWORKING
作个小尝试:登录为 alice(或 bob),然后输入:
$ping -c 10 -i 0 localhost
答覆应该立刻出现:
PING localhost.localdomain (127.0.0.1) 56(84) bytes of data.
ping: cannot flood; minimal interval, allowed for user, is 200ms
现在,尝试用 sudo 来执行它:
$sudo ping -c 10 -i 0 localhost
PING localhost.localdomain (127.0.0.1) 56(84) bytes of data.
64 bytes from localhost.localdomain (127.0.0.1): icmp_seq=1 ttl=64 time=0.049 ms
64 bytes from localhost.localdomain (127.0.0.1): icmp_seq=2 ttl=64 time=0.034 ms
64 bytes from localhost.localdomain (127.0.0.1): icmp_seq=3 ttl=64 time=0.021 ms
64 bytes from localhost.localdomain (127.0.0.1): icmp_seq=4 ttl=64 time=0.030 ms
64 bytes from localhost.localdomain (127.0.0.1): icmp_seq=5 ttl=64 time=0.017 ms
64 bytes from localhost.localdomain (127.0.0.1): icmp_seq=6 ttl=64 time=0.016 ms
64 bytes from localhost.localdomain (127.0.0.1): icmp_seq=7 ttl=64 time=0.016 ms
64 bytes from localhost.localdomain (127.0.0.1): icmp_seq=8 ttl=64 time=0.016 ms
64 bytes from localhost.localdomain (127.0.0.1): icmp_seq=9 ttl=64 time=0.016 ms
64 bytes from localhost.localdomain (127.0.0.1): icmp_seq=10 ttl=64 time=0.016 ms
--- localhost.localdomain ping statistics ---
10 packets transmitted, 10 received, 0% packet loss, time 1ms
rtt min/avg/max/mdev = 0.016/0.023/0.049/0.010 ms, ipg/ewma 0.187/0.028 ms
sudo 经常被用来将专用指令的部份访问权赋予某些用户,好让他们能进行有限度的管理工作。sudo 的一个好处,就是所以 sudo 的指令都会被记录在/var/log/secure
内。以上的例子将这行写入日志内:
Apr 18 11:23:17 localhost sudo: bob : TTY=pts/0 ; PWD=/home/bob ; USER=root ; COMMAND=/bin/ping -c 10 -i 0 localhost
就是这样了。使用 sudo 时,请不要忘记:「能力越强,责任越大」。
假若你在 suderos 内拥有足够的权限,你亦可以这样可打开一个 root 指令壳
sudo -s
或
sudo -i
第二个方法只适用於 CentOS 5。当采用 sudo -s 时,你将会在调用用户的环境下运行 root 指令壳。请格外小心,因为你将会以 root 的身份来创建或更改文件,但 $HOME 的值指向调用用户的主目录。
待写……
KDE 选单上的「执行指令……」选项(通过「选项」)容许以另一个用户的身份去执行一个指令或应用程序。对指命行较陌生的用户可以考虑利用这个图像化的方法来进行需要 root 身份的工作。
consolehelper 是一个用来执行图像化应用程或的包装函式。当它引导时,它会检查 PAM 对应所需应用程序的设置。言下之意,就是我们可以通过所有已安装的 PAM 模块来验证用户。最基本的方式是提供一个口令,但假如我们有合适的硬件,我们亦可以利用智能咭、信物、指纹等来进行验证。PAM 的设置已经超越这个文件的范围(参见 PAM Administrator’s Guide),因此我们只会示范如何设置通过 consolehelper 以 root 身份来执行一个应用程序,并要求 root 的口令。
作为一个例子,让我们设置以 root 身份执行 /usr/bin/xterm。
首先,由於我们亦想保留以普通用户的身份来执行 xterm 的可能性,我们需要创建一个名为 /usr/bin/xterm-root 的连结,指向 /usr/sbin/consolehelper:
ln -s /usr/sbin/consolehelper /usr/bin/xterm-root
现在我们设置 pam —— 创建 /etc/pam.d/xterm-root:
#%PAM-1.0
auth include config-util
account include config-util
session include config-util
最后,设置当 consolehelper 以 xterm-root 引导时,用 root 的身份去执行 /usr/bin/xterm。创建 /etc/security/console.apps/xterm-root 这个文件:
USER=root
PROGRAM=/usr/bin/xterm
这样就成了。执行 xterm-root(通过命令行或 .desktop 文件),输入 root 口令,然后好好享受。如果收到 Xlib: connection to “:0.0” refused by server 这个错误,请先执行 ‘xhost local:root’。
请亦参详一位有见地的社区成员所着的外置文章。
(完)