如何成为 Root 用户

强烈推荐不要以 root 身份执行图像界面。这样做很易会引起大祸。最妥善的做法就是登录成为没有特殊权限的一般用户,然后按需要应用 root 的权限。

1. 使用 su 指令

有很多指令都只可以用 root 身份去执行,因此我们需要成为 root 用户。要这样做,我们可以使用 su 指令(更替用户)。su 指令有下列格式:

su - <user>

su <user>

但我们最经常是用 su 指令来成为 root 用户:

su - root

su root

如果不指定用户名称,缺省的用户是 root,因此以上的指令可以缩短为:

su -

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。

2. 使用 sudo

其实你不必在每次执行某些管理的工作时都要是 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 时,请不要忘记:「能力越强,责任越大」。

2.1. sudo 指令壳

假若你在 suderos 内拥有足够的权限,你亦可以这样可打开一个 root 指令壳

sudo -s

sudo -i

第二个方法只适用於 CentOS 5。当采用 sudo -s 时,你将会在调用用户的环境下运行 root 指令壳。请格外小心,因为你将会以 root 的身份来创建或更改文件,但 $HOME 的值指向调用用户的主目录。

3. 图像界面的帮手

3.1. GNOME

待写……

3.2. KDE

KDE 选单上的「执行指令……」选项(通过「选项」)容许以另一个用户的身份去执行一个指令或应用程序。对指命行较陌生的用户可以考虑利用这个图像化的方法来进行需要 root 身份的工作。

4. consolehelper

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'。


请亦参详一位有见地的社区成员所着的外置文章

(完)
comments powered by Disqus
Powered by GitHub  &&  Jekyll | CC BY-NC-SA