第四章 使用者管理

FreeBSD 是一个多重使用者的操作系统,在系统可有存在多个使用者。使用者的管理可以说是系统管理最基本的议题,在系统一安装完成时,我们就必须进行使用者的新增及设定。

本章将介绍和使用者相关的管理知识,包括:

4.1 账号管理

4.1.1 新增使用者

新增使用者时,我们会以 adduser 这个指令来进行,adduser 指令其实是将新增使用者所必须做的事写成一个执行档来自动帮我们做,在 FreeBSD 4.x 是以 perl 所写成,而 FreeBSD 5.x 改以 shell scripts 来实作。为了了解系统对于使用者管理细节,让我们先回顾一下上一章关于使用 adduser 新增使用者的过程。在 4.x 和 5.x adduser 指令的细节有一点不同,但大同小异。

# adduser
Username: jack

执行了 adduser 之后,首先要输入使用者名称,使用者名称除了英文字、数字及 -_ 外不可以包含其它特殊字符。

Full name: Jack

接着我们要输入使用者全名,这个字段可以是空的,如果您不输入则直接按 Enter 即可。

Uid (Leave empty for default):

这个字段是使用者编号,直接留白按 Enter 即可,系统会自动指定。

Login group [jack]:

输入使用者群组名称,群组名称预设会自动产生一个和新增的使用者同名的群组,如果要使用不同的群组,必须先手动新增群组。我们直接按 Enter 即可。

Login group is jack. Invite jack into other groups? []:wheel

是否要将新的使用者加入其它群组,由于这是我们新增的第一个一般使用者,所以我们将它加入系统管理者 wheel 这个群组,让他可以使用 su 这个指令来切换身份成 root。

Login class [default]:

登入的类别,这是用来分类控制使用者对于系统资源的使用,请参考下一节系统资源限制的说明。在这里我们直接按 Enter 使用默认值即可。

Shell (sh csh tcsh nologin) [sh]: tcsh

输入所要使用的 Shell,建议输入 tcsh,如果您不想让该使用者登入系统,可以输入 nologin。

Home directory [/home/jack]:

输入使用者的家目录,也就是使用者在系统中的数据夹,所有使用者的目录我们都放在 /home 下,所以我们直接按 Enter 即可。

Use password-based authentication? [yes]:

是否要使用密码认证的方式,预设为是,我们直接按 Enter 即可。

Use an empty password? (yes/no) [no]:

是否要使用空密码,预设为否。

Use a random password? (yes/no) [no]:

是否使用随机产生的密码,如果使用随机产生的密码,在新增完毕后,系统会告知我们产生的密码,预设为否。

Enter password:

输入该使用者的密码。

Enter password again:

再输入一次密码,以确认输入无误。

Lock out the account after creation? [no]:

在新增完使用者后,是否要先将该账户关闭。

看了 adduser 指令的过程,您对于新增使用者应有的步骤应该已经有初步的了解了,接下来我们要介绍 adduser 这个指令到底做了哪些事。

知道了以上的流程,我们也可以手动自己做上述的步骤,但我们必须先知道 group 及 master.passwd 等档案的格式。所以我们接下来要介绍这些档案。

小提示

在旧版的 FreeBSD 中,adduser 一开始会先问您使用者名称要符合怎样的规则,通常我们会直接按 ENTER 跳过,您要注意看清楚喔,不要在那个时候输入使用者名称,否则在新增使用者时可能会有问题。如果您已经输入错了,可以将 /etc/adduser.conf 删除,就可以恢复原本的设定。

4.1.2 /etc/group 介绍

在使用者的管理方面,FreeBSD 大致上可以分为群组管理及账号管理。每一个账号至少属于一个群组,这样子有利于权限控制。例如学生的账号就有一个学生群组,而老师的账号就属于教师群组,某几位老师属于管理者的群组。这样一来,我们除了可以针对个人设定权限外,也可以针对不同群组给予不同的权限。

每个使用者预设都会有一个群组,这个预设群组是设定在 /etc/master.passwd,我们会在下一小节中说明。而您也可以将使用者加入其它群组中,这些其它加入的群组设定是在 /etc/group 中,在群组后面加上使用者名称即可。

/etc/group 这个档案就是记录群组的档案,这是一个文字文件,我们可以使用 ee 等文字编辑软件打开它。在 group 档案中,其格式如下:

wheel:*:0:root,alex
students:*:1000:
teachers:*:1001:
webadmin:*:1002:alex,john,tom

每一个字段以冒号分开,以最后一行为例,第一个字段代表群组名称为 teachers,而群组代号(gid) 是 1001。我们可以自行使用文字编辑器加入想要的群组名称及 gid,但要注意的是群组名称和 gid 不能重复。

第一行的最后面是 root,alex,表示该群组成员。由于记录使用者数据的档案中只能记录使用者的预设群组,如果使用者还属于其它群组,则必须记录在 /etc/group 中。例如使用者 alex 的预设群组是 alex,我们希望他同时是 webadmin 群组,则我们必须在 webadmin 群组后加上该使用者。

在 FreeBSD 中,如果其它使用者要能使用 su 变成超级使用者的话,必须将其账号加入 wheel 群组中。
新增群组时,除了可以使用文字编辑外,也可以使用指令 pw 来新增群组:

# pw groupadd newgroup
# pw groupshow newgroup
newgroup:*:1002:

第一个指令是以参数 groupadd 来新增群组 newgroup,再以参数 groupshow 来显示 newgoup 的信息。

4.1.3 /etc/master.passwd 介绍

FreeBSD 使用 shadow password 的方式来保护密码文件,只有 root 才可以读取编码后的密码文件 /etc/master.passwd。但是这并不是系统用来验证的档案,为了加快速度,FreeBSD 将该文件做成数据库 /etc/spwd.db/etc/pwd.db, 因此在修改完 master.passwd 后,必须使用指令 pwd_mkdb 来将 master.passwd 做成数据库档案。不过一般而言,我会使用 vipw 这个指令来修改 master.passwdvipw 会先将 master.passwd 以预设的文书编辑软件打开,修改完存盘后,它会视需要自动更新数据库。如果您没有修改过 ~/.cshrc,则预设的文书编辑软件是 vi。vi 在使用上比较复杂,如果您要离开编辑器,请依序按 [Esc] : q ! 再按 Enter 即可不存档离开。关于 vi 的用法,您可以参考第三章相关章节。

在执行 vipw 之后,会出现:

# $FreeBSD: src/etc/master.passwd,v 1.25.2.6 2002/06/30 17:57:17 des Exp $
#
root:$1$94sxalyM$w1lBLBGAsRPfdVciGqNfL/:0:0::0:0:Charlie &:/root:/bin/tcsh
toor:*:0:0::0:0:Bourne-again Superuser:/root:
daemon:*:1:1::0:0:Owner of many system processes:/root:/sbin/nologin
operator:*:2:5::0:0:System &:/:/sbin/nologin
bin:*:3:7::0:0:Binaries Commands and Source:/:/sbin/nologin
tty:*:4:65533::0:0:Tty Sandbox:/:/sbin/nologin
kmem:*:5:65533::0:0:KMem Sandbox:/:/sbin/nologin
games:*:7:13::0:0:Games pseudo-user:/usr/games:/sbin/nologin
news:*:8:8::0:0:News Subsystem:/:/sbin/nologin
man:*:9:9::0:0:Mister Man Pages:/usr/share/man:/sbin/nologin
sshd:*:22:22::0:0:Secure Shell Daemon:/var/empty:/sbin/nologin
smmsp:*:25:25::0:0:Sendmail Submission User:/var/spool/clientmqueue:/sbin/nologin
mailnull:*:26:26::0:0:Sendmail Default User:/var/spool/mqueue:/sbin/nologin
bind:*:53:53::0:0:Bind Sandbox:/:/sbin/nologin
uucp:*:66:66::0:0:UUCP pseudo-user:/var/spool/uucppublic:/usr/libexec/uucp/uucico
pop:*:68:6::0:0:Post Office Owner:/nonexistent:/sbin/nologin
www:*:80:80::0:0:World Wide Web Owner:/nonexistent:/sbin/nologin
nobody:*:65534:65534::0:0:Unprivileged user:/nonexistent:/sbin/nologin
tom:Bk5AI4MiRKCJ2:1000:1000::0:0:Tom Chang:/home/tom:/bin/tcsh

master.passwd 这个档案内容中,每个使用者都是独立的一行,每个字段使用冒号分开,它的格式是:

name:password:UID:GID:class:change:expire:fullname:home:shell

每个字段的说明如下:

# expr `date +%s` + 86400 \* 30

我们可以看到在 master.passwd 中已经有许多使用者,这些使用者是系统服务的使用者。例如 smmsp 是邮件服务器的 daemon 所使用的使用者名称。nobody 这个使用者是预设无任何权限的使用者,但有很多系统服务软件的预设使用者都是 nobody,我们应该要注意不要以 nobody 负责为太多服务,否则它不就变成了拥有许多权限的使用者了吗!

4.1.4 删除使用者

知道了新增使用者的步骤后,您大概已经知道要怎么删除使用者了吧。只要把新增使用者的步骤反过来即可。

以上这些步骤其实就是指令 rmuser 所做的事。我们可以使用这个指令来快速的移除使用者账号。以下即为 rmuser test 的执行结果:

Matching password entry:
test:J7kPK0pKTn2oQ:1001:1001::0:0:Tom:/home/test:/bin/tcsh
Is this the entry you wish to remove? y →真的要移除这一个使用者吗?
Remove user's home directory (/home/test)? y →是否要移除使用者家目录?
# 移除使用者正在执行的程序及更新系统数据
Removing user's at jobs:Updating password file, updating databases, done.
# 移除使用者群组
Updating group file: (removing group test -- personal group is empty) done.
# 移除使用者家目录
Removing user's home directory (/home/test): done.
# 移除使用者信件
Removing user's incoming mail file /var/mail/test: done.
# 移除使用者暂存目录
Removing files belonging to test from /tmp: done.
Removing files belonging to test from /var/tmp: done.
Removing files belonging to test from /var/tmp/vi.recover: done.

4.2 系统资源限制

如果您的 FreeBSD 系统允许多位使用者同时使用,每个使用者可能同时执行许多工作,例如 Alex 可能会执行庞大的数学运作程序,而 Tom 在系统中执行占用海量存储器的数据库程序。如此一来,我们的系统资源将全部被几个使用者耗尽,其它正常的系统服务便无法拥有较高的效能。我们不能单纯的假设系统中所有使用者都会乖乖的使用单纯的服务,因此,在一个多重使用者的环境中,系统管理者有必要针对每个使用者限于他们所可以使用的系统资源,例如 CPU、内存、磁盘空间的使用量等。

4.2.1 登入类别

我们在新增使用者时会设定使用者的 login class,所谓的 login class 就是将使用者分类管理,以限制不同类别的使用者对于系统资源的使用。

/etc/login.conf 定义了不同的 login class。这个档案中所有对于使用者限制的设定都是以 key=value 的方式来表示。这些限制大部份是针对某个使用者所执行的某一个行程 (process) 所能占用的资源,而非该使用者全部执行的行程所占用的资源总合。因此,除了每个行程所能占用的资源外,我们还会设定使用者最多可以执行多少个行程。

以下为 /etc/login.conf 中关于 default class 的设定:

# defaults
# These settings are used by login(1) by default for classless users
# Note that entries like "cputime" set both "cputime-cur" and "cputime-max"

default:\
	:passwd_format=md5:\
	:copyright=/etc/COPYRIGHT:\
	:welcome=/etc/motd:\
	:setenv=MAIL=/var/mail/$,BLOCKSIZE=K,FTP_PASSIVE_MODE=YES:\
	:path=/sbin /bin /usr/sbin /usr/bin /usr/games /usr/local/sbin
	:nologin=/var/run/nologin:\
	:cputime=unlimited:\
	:datasize=unlimited:\
	:stacksize=unlimited:\
	:memorylocked=unlimited:\
	:memoryuse=unlimited:\
	:filesize=unlimited:\
	:coredumpsize=unlimited:\
	:openfiles=unlimited:\
	:maxproc=unlimited:\
	:sbsize=unlimited:\
	:vmemoryuse=unlimited:\
	:priority=0:\
	:ignoretime@:\
	:umask=022:
	

以下为关于系统资源限制的字段说明,每一个字段都有可使用的数值类型,例如 size、time 等,让我们来看看每个字段的说明:

字段名称 数值类型 说明
coredumpsize Size 当使用者所执行的程序出了问题 (coredump),系统会将该程序的执行状况从内存中写到硬盘上,这个值就是在限制 core file 的档案大小。如果使用者所执行的程序是需要消耗许多内存的程序,则所产生的 core file 也会很大。这个值不应该比使用者的磁盘配额限制大。
cputime Time 这是一个行程所能使用的最长 CPU 时间,这个时间指的不是我们在 top 或 ps 中看到的 CPU usage 百分比,而是一个行程所使用的 CPU 时间。当超过时间,系统核心会自动停止该行程。
filesize Size 使用者单一档案的最大容量。我们对于使用者磁盘配额只能限制使用者对于硬盘的使用总额,而这个设定可以限制单一档案的大小。
maxproc Number 限制使用者最多可以执行的行程总量。这个限制包含所有以该使用者名称所执行的程序,有的程序在执行时,会自动产生许多子行程,如果这个值设定的太小,可能会造成使用者的困扰。
memorylocked Size FreeBSD 系统中有所谓的虚拟内存空间,当物理内存不足时,系统会将某部份的内存数据放到虚拟内存中。而有的程序会使用 mlock() 这个系统呼叫要求系统将它所占用的内存空间全部放在物理内存中,memorylocked 就是限制使用 mlock() 的内存大小。
memoryuse Size 限制行程最大的内存使用量,包含物理内存及虚拟内存。
openfiles Number 限制使用者同一时间最多可以开启的档案数量。所谓的档案数量包含了一般的档案及 socket。
sbsize Size 用以限制最大的网络缓冲区的使用量。
stacksize Size 行程可使用的最大堆栈 (stack) 空间。

以下为上表中数值类型的说明:

类型 说明
Size 我们可以单纯的以数字来表示 Size,预设的单位是 byte。例如 1234 表示 1234 bytes。除此之外,我们也可以在数字之后加上单位。例如:
    b: 表示 512-byte block (1b = 512bytes)。
    k: 表示 kilobytes,即 KB (1k=1024 bytes)。
    m: 表示 megabytes,即 MB (1m=1048576 bytes)。
    g: 表示 gigabytes,即 GB。
    t: 表示 terabytes,即 TB。
Time 当我们只写数字时,预设的单位是秒。或者我们也可以在数字后加上单位 y (年)、w (周)、d (天)、h (时)、m (分)、s (秒)。

例如,三小时四十分可以表示为:13200s、220m、或是 3h40m。

Number 您可以使用 0 到 9 的数字,预设为十进制。您也可以使用开头为 0x 的数字来表示十六进制。

当要修改类别时,我们以将 default class 复制一份,并更名为其它类别,最后再进行编辑。类别新增完毕后,我们必须执行下列指令以重建系统数据库。

# cap_mkdb /etc/login.conf

接下来我们就可以执行 vipw 在想要限制的使用者的 class 的字段填入我们新增的类别了。

除了限制系统资源的使用外,我们也可以使用 login.conf 来客制化每个使用者的登入环境、所使用的语言等,请 man login.conf 以得到更多的说明。

小提示

使用 login.conf 来设定 class 的好处是您可以统一在一个地方设定不同类别使用者的权限及系统资源的使用量,对于需要管理大量使用者时十分有用。

4.2.2 磁盘配额

当系统中有多位使用者时,如果其中一个人拥有大量档案,那么其它使用者便无法有足够的空间来使用。如果系统有许多使用者,而又不限制他们对磁盘的使用量,那么磁盘很容易就会爆掉,因此我们必须对使用者加以限制。您可以限制系统中每个使用者可使用的硬盘大小(quota)。步骤如下:

# Device	Mountpoint	FStype	Options	Dump	Pass#
/dev/ad0s1b	none	swap	sw	0	0
/dev/ad0s1a	/	ufs	rw	1	1
/dev/ad1s1f	/home	ufs	rw,userquota	2	2
/dev/ad0s1e	/usr	ufs	rw	2	2
/dev/ad1s1e	/var	ufs	rw	2	2

完成了上述的步骤并重新开机之后,我们就可以使用指令 edquota 来编辑磁盘配额。首先,以指令 edquota -u tom 进入文书编辑,我们通常会加入二行,一行限制档案大小,一行限制档案数:

Quotas for user tom:
/home: blocks in use: 65, limits (soft = 50000, hard =55000)
        inodes in use: 7, limits (soft = 5000, hard = 6000)

共中 blocks 代表使用者使用档案大小总合,而 inodes 代表档案数目。soft limits 代表使用量达到多少时提出警告,而 hard limits 代表使用量达多少时立刻禁止写入。

上面的范例中,使用者 tom 目前使用的档案大小为 65K,在档案大小总合为 50000K 时提出警告,55000K 时禁止写入。目前该使用者有7个档案,在档案数达 5000 个时提出警告,达 6000 个时禁止写入。

我们也可以使用 edquota -p tom 2000-3000 来以使用者 tom 的设定为范例,将 UID 为 2000 到 3000 的使用者设定为和 tom 一样。或者使用指令 edquota -p tom jack rose 来以使用者 tom 为范例,将 jack 及 rose 的设定变成和 tom 一样。

您可以使用 quota -v tom 来看使用者 tom 目前的使用情形,或使用 repquota 来查看所有使用者目前的使用情形。

在 FreeBSD 3.2 以后的版本,系统开机后预设会检查所有使用者的 quota,但这必须要花上一段时间,如果您不想在开机时自动检查 quota 的话,请在 /etc/rc.conf 中加入下列设定:

check_quotas="NO"

在 FreeBSD 3.2 版以前,开机内定是不检查 quota 的,如果你想在开机时即检查的话,请在 /etc/rc.conf 中加入下列设定:

check_quotas="YES"

4.3 大量新增账号

对于大型主机的管理者而言,要大量新增账号时,若没有一套"撇步"的话,使用 adduser 指令来新增账号将会非常累人,所以我们必须要想出一个大量新增账号的方法。

大量新增账号的方法有很多,最简单的就是写一个程序来处理,只要依照之前提及的新增账号步骤使用程序来一步步建立或在程序中呼叫 FreeBSD 系统中新增账号的指令并经由循环来完成。但是 adduser 指令会问一堆问题,不适合拿来作程序中要呼叫的指令,所幸在 FreeBSD 中还有一个管理使用者账号及群组的程序 pw ,所以笔者就以指令 pw 加上一些控制来写成 script。

一般而言,如果要新增的账号是没有规则性的,那么就必须先将账号做成一个文字文件,再以程序读入。若账号是有规则性的,则可以给定参数来完成。您可以在本书所附的第二片光盘中的 examples 目录中找到笔者所写的「新增大量账号」程序,文件名是 adduser.tar.gz

这个程序可以使用档案汇入账号及密码,或只给账号并自动产生密码,最后将账号及密码存成一个档案(预设是 adduser.log)。我们也可以使用连续产生账号的方式,产生一堆连续的账号,产生的结果同样会放成 adduser.log 中。

首先,将第二片光盘放入光驱中,并使用下列指令将档案复制到 root 的目录下:

# mount /cdrom
# cp /cdrom/examples/adduser.tar.gz /root/

将档案放到硬盘中后,请切换目录到 /root 并以下列指令解压缩:

# cd /root
# tar zxvf adduser.tar.gz

解压缩后,进入 adduser 目录,你可以看到该目录中有下列档案:

檔名 用途
adduser.pl 主要执行档。
adduser.cfg 这是 pw 这个指令所要使用的设定档,我们可以在其中设定预设所要使用的群组名称、shell、最大及最小的 uid、及家目录等。您也可以 man pw.conf 来取得这个档案格式的用法。

建议您至少应该要修改 defaultgroup 这个字段,它是我们新增使用者预设所要使用的群组名称,您必要先在 /etc/group 中加入所要使用的群组。如果 defaultgroup 所指定的群组不在 /etc/group 中,则预设会以让使用者的名称作为群组名称。

readme.txt 这是 adduser.pl 的说明档。
user.txt 你可以使用档案汇入使用者的方式来新增使用者,这个档案存放了我们所要新增的使用者及密码。其格式是 username,password。如果只有使用者名称而无密码,我们会随机产生新的密码,并将密码及使用者名称存放在 adduer.log 中。

adduser.pl 这个程序的使用方式如下:

./adduser.pl -f users.txt 参数 -f 或 -file 表示使用档案汇入,文件名称可以自由命名,档案每一行内容即一个账号 的设定,每一行的格式可以是只有账号或者是有账号及密码,账号和密码间使用逗点 "," 隔开。本范例中将以档案 user.txt 来产生账号。
./adduser.pl -u alex 001 003 参数 -u 或 -user 表示使用连续账号,此范例将产生 alex001 alex002 alex003 三个账号。

在执行完 adduser.pl 之后,在该目录下会产生一个 adduser.log,这个档案将记录我们新增的使用者及其密码。

4.4 备份与移转

在了解了新增使用者的步骤后,您对于备份使用者的作法在心中应该也有个谱了吧。在更新系统时,使用者的数据需要备份的有:

4.4.1备份

除非我们和使用者间已有共识,不帮使用者备份其邮件及档案,否则平常想要备份使用者数据的话,这是一件麻烦且费时的工作。不管是外在因素或是硬件固障,系统都有可能数据流失。对于一个公众服务器的管理者而言,事前明白告知使用者系统管理的原则是一件十分重要的事。如果未事前请使用者自行备份个人的档案及邮件的话,首先,备份的工作将非常耗时,尤其是使用者拥有大量档案时。再者,若未备份文件,当系统数据流失时,容易和使用者产生争议,就算平常每天都有备份,也只能保住备份当时的档案,从备份到系统出问题的时候所产生的档案就无法回复了。

如果不必备份使用者个人数据的话,就只需把 /etc/master.passwd/etc/group 存在别的储存设备或计算机中,要回复时只要依下列移转的步骤做即可。

4.4.2 移转

如果系统中已有其它使用者,要先编辑 /etc/group,加入和备份的 group 档案有差异的地方,再使用 vipw 来将加入和备份的 master.passwd 有差异的地方。如果新系统中无其它使用者,则将所备份的 master.passwdgroup 放到新计算机的 /etc 下,再执行下列指令以将密码文件转成数据库格式即可:

# pwd_mkdb -p -d /etc /etc/master.passwd

如果没有要移转使用者个人数据的话,也必须建立使用者家目录及邮件目录。如果要移转使用者目录的话,记得移转后要检查一下该目录的所有人是不是该使用者。如果不是,就必须使用下列指令来将使用者目录拥有者更改为所属的使用者:

# chown -R user:group /home/user

上面这个指令是将 /home/user 这个目录及其下所有目录的所有人变成使用者名称为 user,群组为 group。
我们也可以在密码文件及群组数据移转后,将旧的硬盘存放使用者数据的扇区(假设是 /home) mount 到 /mnt 下,再到 /mnt 下存放使用者数据的目录中使用指令

# tar clf - . | tar xvpf - -C /home

来将使用者数据复制到 /home 中。并依此方法 mount 使用者邮件目录扇区并复制到 /var/mail 下即可。

4.5 使用历程记录

4.5.1 记录使用者指令

为什么要记录使用者下过的指令?并不是为了要监视使用者,而是在系统有问题时,可以找出原因。找出使用者曾经使用过哪些指令,以了解问题的所在。FreeBSD 提供指令 lastcomm 让你查看系统中使用者执行的指令,但是你必须先修改 /etc/rc.conf,加上下列一行设定:

accounting_enable="YES"

系统会将使用者的历程记录在 /var/account/acct* 中,最新的记录是 acct,随着数据越来越多,系统每天会将该档案移成 acct1,而 acc1 将变成 acct2,依此类推。如果站上使用者很多的话,acct 的档案将变得非常大,所以你必须确保该目录有足够的空间存放数据,为了避免档案过多,系统内定只会保留最近四天的数据。

当下达指令 lastcomm 时,如果我们未使用任何参数,则系统会以 /var/account/acct 为参考,印出所记录的数据。你也可以使用 lastcomm -f acct1 来查看前一天的资料。

4.5.2 监看使用者

当使用者登入系统后,root 可以使用 watch 指令来取得在线使用者的窗口画面。也就是说当下达指令后,root 所看到的画面就会和该在线使用者一样。我们可以观察该使用者在做些什么事,输出的结果又是什么。

这个指令并不是要给人拿来做坏事用的。如果有不友善的使用者登入系统时,可以使用它来观察该使用者的动作,并适时阻止。
只有超级使用者 root 可以执行 watch,而且如果您使用的是 FreeBSD 4.6-RELEASE 以前的版本,在执行前必须先在 kernel 中加入下列的设定并重新编译核心:

pseudo-device snp

最后使用下列指令新增 snoop device:

# cd /dev
# ./MAKEDEV snp0 snp1 snp2 snp3

接下来就可 watch 指令了。首先,先下指令 w 来看一下站上有哪些使用者。指令结果的第二个字段部份,有使用者的 tty,例如 p0、v0 等,选定要监看的使用者后,使用 watch ttyp0 来监看该使用者,其中 ttyp0 即该使用者的 tty。你可以使用 CTRL+X 来切换不同的 tty,也可以使用 CTRL+G 离开回到自己的画面。

4.5.3 控制 root 的使用

如果我们有在 wheel 群组中加入一般的使用者,则该使用者可以使用指令 su 并输入 root 的密码后变成超级使用者。但如果系统中有多位使用者具有 root 的权限,我们根本不知道是谁使用了 root 的权限、执行了哪些指令;如果我们想针对不同人给予不同的权限,例如一个人只有备份的权限、另一个人只能观看系统设定,su 也无法达成我们的要求。因此有人发展出 sudo 这个软件来支持系统的管理。

不过 sudo 并不是 FreeBSD 系统内定的指令,我们必须自己安装。所幸 FreeBSD 己将该软件移植到 "port" 中,我们只要执行下列指令即可轻松的安装了。由于在 port 中 sudo 的安装设定并未打开 sudo 执行指令记录,如果你希望它能将执行 sudo 的 log 记下来的话,必须先编辑 /usr/ports/security/sudo/Makefile,将 CONFIGURE_ARGS 中的参数 --disable-log-wrap 拿掉。

# cd /usr/ports/security/sudo
# make install clean

安装完后,我们要先执行 /usr/local/sbin/visudo 以设定 sudo 的设定档 (/usr/loca/etc/sudoers)。以下简单说明该设定档如何设定,详细说明及范例请参考 /usr/local/etc/sudoers.sample

# Host alias specification(如果你只有一台机器,可以不必设)
Host_Alias     CUNETS = 128.138.0.0/255.255.0.0
Host_Alias     SERVERS = master, mail, www, ns

# User alias specification(把使用者分成群组,也可以不用分)
User_Alias     PARTTIMERS = millert, mikef, dowdy
User_Alias     WEBMASTERS = will, wendy, wim
User_alias     BACKUP = tom, jack

# Cmnd alias specification(把可以执行的指令分成一个个群组)
Cmnd_Alias     READ=/bin/ls,/bin/cat,/usr/bin/tail,/usr/bin/head
Cmnd_Alias     BACKUP=/sbin/dump,/usr/bin/tar,/usr/bin/find, \
               /usr/bin/cpio,/bin/cp,/sbin/mount,/bin/dd

# User privilege specification(设定使用者的权限)
root       ALL=(ALL) ALL
%wheel     ALL = (ALL) ALL

# 表示 jack 在 CUNET 中所有机器都可执行指令群组中 BACKUP 指令
jack       CUNETS = BACKUP

# 表示使用者群组中 PARTTIMERS 群组的人,只能在 SERVERS
#群组中的机器里执行 READ 群组的指令
PARTTIMERS SERVERS = READ

设定完后,使用者即可执行 sudo <允许的指令> ,使用者只要输入自己的密码即可,不必知道 root 的密码,而且 5 分钟内再次执行 sudo 时不需再输入密码。如果你有打开 log 记录功能,sudo 执行成功或失败的 log 都将被记录到 /var/log/sudo.log 中。详细说明请阅读说明 man sudo