第九章 管理用户帐号
“系统管理员与毒品销售商的相似之处在于:两者都是用
K来度量,两者都有用户。”(老的,陈旧的计算机笑话。)本章解释如何创建新用户帐号,如何修改这些帐号的属性,以及如何删除帐号。不同的
Linux系统有不同的工具来做这些工作。当一台计算机被许多人使用时,常常需要区分这些用户,例如,他们的私有文件保持私有。甚至,在某一时刻,计算机只能被单个用户使用时这也是很重要的,就如同许多微型计算机一样。
[1] 因此,每个用户都有一个唯一的用户名,这个用户名是用于登录的。然而,对于用户来说除了名字还有许多其它特性。一个帐号(
account)是指属于一个用户的所有文件、资源、以及信息。这个术语暗示如同在银行一样,并且在一个商业系统中每个帐号通常有些金钱与之有关,并且依赖于用户如何使用系统,那些金钱以不同的速率花光。例如,磁盘空间可能每兆字节每天有个价,处理时间可以每秒钟有个价。Linux
内核本身将用户仅仅看作是一些数字。每个用户都用唯一的一个数字加以识别,即用户id(user id)或uid,因为对于计算机来说处理数字比处理文字来的更快更容易。在内核外的一个独立的数据库为每个文字名称,即用户名(username),指派了一个用户id。该数据库同样也包含一些另外的信息。
要创建一个用户,你需要给用户数据库增加有关该用户的信息,并为该用户建立一个登录目录(用户主目录)。还常常需要训练该用户,并为它设立适当的初始环境。
许多
Linux发行版带有一个创建帐号的程序。现有几种这样的程序。两个可选的命令行命令是adduser和useradd;同样也许有个GUI上的工具。不管是什么样的程序,其结果是很少需要进行手工作业。尽管如此,细节却是很多并且复杂而难以理解,这些程序使得任何事情看上去都很简单而直接。不过,在手工创建用户帐号一节中描述了如何手工做到这点。 以及其他信息文件UNIX
系统中基本的用户数据库是字符型文件,/etc/passwd(称为口令文件),里面列出了所有有效用户的用户名以及它们相关的信息。每个用户名对应文件中的一行,并且用冒号分成七个域:。用户名
。口令,以加密的方式。
。数字形式的用户
id。。数字形式的组
id。。帐号的全名或其它描述。
。登录(主)目录。
。登录
shell(登录时运行的程序)。在
passwd的manual page中有对格式更详细的解释。系统上的任何用户都可以读取口令文件,例如,他们可以知道其他用户的名称。这同样意味着每个人也都能看到口令(第二个域)。口令文件对口令进行了加密,所以从理论上讲是没有问题的。然而,这个加密术是可以破的,特别是当口令取得不好时(也即,它很短或者它可以从字典中查到)。因此,将口令放在口令文件中是不太好的。
许多
Linux系统有影子口令(shadow passwords)。这是存储口令的另一种方法:加密的口令被存储在一个独立的文件中,/etc/shadow,只有root用户能读取这个文件。/etc/passwd文件的第二个域只含有一个特殊的标记。任何一个需要验证用户的程序需要设置uid,由此可以访问影子口令文件了。只使用口令文件其它域的常规的程序是得不到口令的。[2] id数值在许多系统上,用户和组的
id数值是怎样的并无关系,但是如果你使用网络文件系统(NFS),你必须在所有的系统中有相同的uid和gid。这是因为NFS也用uid的数值来确认用户的。如果你没有使用NFS,你可以让你的帐号创建工具自动地选择它们。如果你使用
NFS,你就必须为同步帐号信息创建一种机制。另一种方法是使用NIS系统(见XXX网络管理员手册)。然而,你应该避免重复使用曾经有的
uid值(以及用户名),因为uid(或用户名)的新的拥有者有可能能够访问到原来的相同用户名的文件(或邮件、或其它的信息)。/etc/skel
当为一个新用户创建了登录(主)目录时,就为用
/etc/skel中的文件对这个目录进行初始化工作。系统管理员能够在/etc/skel中建立文件,这些文件可以为用户提供一个很好的缺省环境。例如,他可以建立一个/etc/skel/.profile文件,在其中可以为一些编辑器设置成对新用户友好的EDITOR环境。然而,通常最好尽量保持
/etc/skel越小越好,否则的话就很难更新已存在的用户的这些文件了。例如,如果友好编辑器的名称改变了,那么所有现存用户就不得不编辑修改他们的.profile文件。虽然系统管理员可以用一个描述文件来作自动的修改,当这样做几乎肯定会搞乱一些人的.profile文件。只要可能,尽量将全局配置放入全局文件中,比如
/etc/profile。这样就可以在不破坏用户自己的设置下做更新工作。
按以下步骤手工地创建一个新帐号:
。使用
vipw编辑/etc/passwd并为新帐号加入一新行。小心语法。不要直接用一个编辑器编辑该文件!vipw会锁住这个文件,这样别的命令就不能同时更新它。你应该让口令域成‘*’,这样这个帐号就还不可以登录。。类似地,如果你也想创建一个新组时,使用
vigr来编辑/etc/group文件。。使用
mkdir为该用户建立一个登录(主)目录。。将
/etc/skel中的文件拷贝到这个新目录中。。用
chown和chmod修改所有权和权限。此时,-R选项是非常有用的。不同的站点的权限稍有不同,但是通常以下命令所做的是正确的:cd /home/newusername
chown -R username.group .
chmod -R go=u,go-w .
chmod go= .
。用
passwd设置口令。当你在最后一步设置好口令以后,该帐号就可以被使用了。在所有的工作都做完之前你不应该设置口令,否则的话,很有可能当你仍在拷贝文件时该用户冒昧地登录了进来。
有时需要创建不被用户使用的哑帐号(
dummy accounts)[3]。例如,为了设置一个匿名FTP服务器(这样任何人都可以从上面下载文件,而无需首先有一个帐号),必须创建一个叫做ftp的帐号。在这种情况下,不需要设置口令(上面的最后一步)。确实,最好不要,这样没人可以使用这个帐号,除非他们首先成为root,而root可以变成任何用户的。有一些命令用于更改一个帐号的各种属性(也即,
/etc/passwd中的相关域):chfn
更改全名域。
chsh
更改登录的
shell。passwd
改变口令。
超级用户可以使用这些命令来改变任何帐号的属性。普通用户只能更改自己帐号的属性。有时也需要不让普通用户使用这些命令(用
chmod来改),例如在一个有许多新手的环境中。其它的一些任务需要手工来做。例如,要改变用户名,你需要直接编辑
/etc/passwd文件(记住,用vipw)。同样地,要将用户加入进一些组中或从一些组中删除,你需要编辑/etc/group文件(用vigr)。这些任务其实是不多的,然而,你要很小心地去做:例如,如果你改变了用户名,用户就再也收不到原来的e-mail了,除非你也建立了邮件的别名。[4]要删除一个用户,你首先要删除他的所有文件、邮箱、邮件别名、打印作业、
cron和at作业、以及所有该用户的其它一切。然后,从/etc/passwd以及 /etc/group中移去相关行(记住,从所有组中移去该用户名)。在开始进行删除工作时,最好首先禁用该帐号(见下面),以免在该帐号正被删除之际,用户正使用该帐号。记住,用户可能在他的登录目录(他的主目录)之外还有文件。
find命令可用来找出它们:find / -user username
然而,如果你的硬盘很大的话,上面这条命令将需要很长的时间。如果你加载上了网络磁盘,你就必须小心,不要搜索网络或其上的服务器。有些
Linux发行版带有做这个工作的专用命令;参见deluser或userdel。不过,手工同样也能轻易地做到,而且使用命令可能做不彻底。有时需要临时禁用一个帐号,而不是删除它。例如,用户可能没有付费,或者系统管理员可能怀疑有个解密高手已经取得了该帐号的口令。
最好的禁用一个帐号的方法是将它的
shell换成一个特殊的程序,这个程序只是打印一条消息。这样,不管谁想登录进这个帐号,都将失败,并会知道为什么。这条消息可以告诉用户去与系统管理员联系以解决任何问题。同样也可以将用户名或口令改成别的,但这样做的话这个用户会被搞懵了,不知道怎么回事。让用户感到困惑意味着会有更多的麻烦。
[5]建立特殊程序的一个简单方法是写一个‘
tail scripts(描述文件)’:#!/usr/bin/tail +2
This account has been closed due to a security breach.
Please call 555-1234 and wait for the men in black to arrive.
头两个字符(‘
#!’)告诉内核该行的余下部分是命令,是用于解释执行这个文件的。在这种情况下的tail命令将在标准输出设备上输出除第一行以外的所有信息。如果用户
billg被怀疑有破坏安全的行为,系统管理员可能会象以下这样做:# chsh -s /usr/local/lib/no-login/security billg
# su - tester
This account has been closed due to a security breach.
Please call 555-1234 and wait for the men in black to arrive.
#
当然,这里的su的目的是用于测试改变是否发挥作用了。Tail scripts
应该存放在一个独立的目录中,这样,他们的名字不会妨碍普通用户的命令。注释