[FrontPage] [TitleIndex] [WordIndex

This is a read-only archived version of wiki.centos.org

如何切换为 Root

我们强烈推荐不要以 root 的身份运行图像界面。这很容易导致灾难性后果。最佳的做法是以普通无特权的用户登录,然后在有需要时才使用 root 的权限。

1. 运用 su 指令

很多指令只能以 root 用户的身份执行,因此我们必须切换为 root 才能执行这些指令。要如此行,我们可以运用 su 指令(「切换用户」之意)。su 指令有以下格式:

su - <user>

su <user>

但我们普遍利用 su 来切换为 root 用户:

su - root

su root

要是没有指定用户名称,root 是缺省值,因此以上指令多数缩写为:

su -

su

然而以上两个指令有截然不同的功用。'su <user>' 把 <user> 的身份赋予现有用户;而 'su - <user>' 却会把 <user> 的身份带同 <user> 的登录环境一并赋予现有用户。

很多时候用户只采用 '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,但我们推荐不要作手动编辑。要是你拥有一台桌面计算机,你应该会想容让自己执行大部份的指令。

有见及此,最便捷的方法就在在 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 别名内的所有指令。

到现时为止,/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

让我们(利用 visudo)将这别名加进 /etc/sudoers 档,并授权给 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 指令壳

要是你在 sudoers 拥有足够权限,你可以这样进入 root 的指令壳:

sudo -i

3. 图像界面协助程序

3.1. GNOME

待办……

3.2. KDE

KDE 选单内的 Run Command... 项目提供选项,通过提供另一个用户的口令,以该用户的身份来执行指令或应用程序。对命令行缺乏信心的用户可考虑以此图像界面来进行须要 root 权限的工作。

4. consolehelper

consolehelper 是用来执行图像界面应用程序的封套。当它引导时,它会检查 PAM 对目标程序的相关设置。意思就是我们可以利用已安装的 PAM 模块验证用户。基本的方式是查询口令,但只要我们有合适的硬件,我们也可以用智能卡、符记、手指模等进行验证。PAM 的设置已超出了本文档的范畴(见 PAM 管理员指南),我们只会示范如何设置 PAM,让我们以 root 身份执行应用程序时会查询 root 的口令。

这个样例将会设置 /usr/bin/xterm 以 root 的身份引导。

首先,由于我们仍然有意保留以普通用户的身份执行 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,或在 /etc/security/console.apps/xterm-root 档内加入:

SESSION=true

请确保该行的末端有换行字符。

Translation of revision 27


2023-09-11 07:24