UNIX用户和基本的帐户管理


    修改帐户   在UNIX® 的处理用户帐户的环境中有很多不同的命令可用. 最普通的命令如下,接下来是详细使用它们的例子。
    
命令摘要
adduser(8)在命令行添加新用户.
rmuser(8)在命令行删除用户.
chpass(1)一个灵活的用于修改用户数据库信息的工具.
passwd(1)一个用于修改用户口令的简单的命令行工具.
pw(8)一个强大灵活修改用户帐户的工具.

    FreeBSD允许多个用户同时使用计算机。当然,这些用户中不是很多人同时坐在同一台计算机前,而是其他用户可以通过网络来使用同一台计算机以完成他堑墓ぷ鳌R?褂孟低常?恳桓鋈硕家?幸桓稣驶А?
    读完这章,你将了解到:
                 在一个FreeBSD系统上不同用户帐户之间的区别。
                 如何添加用户帐户。
                 如何删除用户帐户。
                 如何改变帐户细节,如用户的全名,或首选的shell。
                 如何在每个帐户基础上设置限制,来控制像内存,CPU时钟这样的资源。
                 如何使用组来使帐户管理更容易。
    在阅读这章之前,你应当了解:
                 了解UNIX和FreeBSD的基础知识(第3章)。
    8.2介绍
    所有访问系统的用户都是通过帐户完成的,所以在FreeBSD系统中用户和用户帐户的管理是非常重要的。
    用户名
    用户名在login:提示符的后面键入。用户名对于一台计算机来讲是唯一的。你不可以使用两个相同的用户名来登陆。有很多用来创建正确用户名的规则,可以看看passwd的联机手册。你使用的用户名通常需要8个或更少的小写字母。
    口令(password)
    每个帐户都有一个口令与它对应。口令可以是空的,这样不需要口令就可以访问系统。这通常不是一个好主意。每个帐户都应当要有一个口令。
    用户ID (UID)
    UID是系统用来识别用户的0到65536之间的数字。FreeBSD使用UID来识别用户——在工作以前,任何允许你指定一个用户名的FreeBSD命令都会把它转换成UID。这意味着你可以用不同的用户名使用多个帐户,但它们的UID是一样的。FreeBSD会把这些帐户认定是同一个用户。
    组ID (GID)
    GID是用来识别用户所在的组的0到65536之间的数字。组是一种基于用户GID而不是它们的UID的用来控制用户访问资源的机制。这可以减少一些配置文件的大小。一个用户也可以属于多个组。
    登陆类
    登陆类是对组机制的扩展,当把系统分配给不同用户时,它提供了额外的灵活性。
    口令的定期改变
    默认情况下,FreeBSD不会强迫用户去改变他们的口令。你可以在每个用户的基础上强迫执行,当一个帐户过期了,可以强迫一些或所有的用户改变他们的口令。
    帐户到期了
    默认情况下,FreeBSD不会终止帐户。如果你正在创建帐户,你要知道有一个有限的使用期限。例如,在学校里,你会为每个学生设立一个帐户,当帐户到期了,你可以重新指定它。帐户到期后,虽然帐户的目录和文件仍然存在,但帐户已经不能再使用了。
    用户的全名
    用户名可以唯一地识别FreeBSD的帐户,但不会反映用户的全名。这些信息可能与帐户是相关的。
    主目录(home)
    主目录是用户用来启动的目录的完全路径。一个通常的规则是把所有用户的主目录都放在/home/username下。用户将会把他们的个人文件放在他们自己的主目录下,他们可以在那儿创建任何目录。
    用户shell
    Shell提供了用户用来操作系统的默认环境。有很多不同的shell,有经验的用户会根据他们的经验来选择。
    有三种类型的帐户:超级用户、系统用户和普通用户。超级用户帐户通常叫做root,可以毫无限制地管理系统。系统用户运行服务。最后,普通用户帐户给那些登陆系统,阅读邮件等的人们使用。
    8.3超级用户帐户
    超级用户帐户通常叫做root,可以重新配置和管理系统,在收发邮件、系统检查或编程时尽量不要使用root权限。
    这是因为不像普通用户帐户,超级用户能够毫无限制地操作系统,超级用户帐户的滥用可能会引起无法想象的灾难。普通的用户帐户不会由于出错而损 坏系统。所以通常要尽可能地使用普通帐户,除非你需要额外的特权。
    另外,在使用超级帐户时要再三检查命令,因为一个额外的空格或缺少某个字符的命令都可能会引起数据丢失。
    所以,你在阅读了这章后要做的第一件事是,在平时使用的时候,创建一个没有特权的用户帐户。无论你使用的是多用户还是单用户的系统,这样的申请都是相同的。在这一章的后面,我们将讨论如何创建一个额外的帐户和如何在普通用户和超级用户之间进行切换。
    8.4系统帐户
    系统用户是那些要使用诸如DNS,mail,web等服务的用户。使用帐户的原因就是为了安全。如果所有的服务都由超级用户来运行,那他们就可以不受约束地做任何事情。系统用户可以是后台程序、操作员、bind或新闻。系统管理员经常创建httpd来运行web服务器。
    Nobody是普通的没有特权的系统用户。然而,绝大多数与用户联系很密切的服务是使用nobody的,记住这一点是非常重要的,因此用户可能会变得很有特权。
    8.5用户帐户
    用户帐户是让真实用户访问系统的主要方式。这些帐户把用户和环境分隔开,能阻止用户损 坏系统或其他用户,在不影响其他用户的情况下定置它们的环境。
    每个人访问你的系统必须要有他们自己的唯一帐户。这允许你可以找到谁做了些什么,阻止人们损 坏其他用户的设置和阅读其他人的邮件等等。
    每个用户能够设置他们自己的环境,以利于他们通过改变shell、编辑器、键盘绑定和语言等适应使用这个系统。
    8.6修改帐户
    在UNIX的处理用户帐户的环境中有很多不同的命令可用。最普通的命令总结如下:
    命 令
    摘 要
    adduser
    被推荐的用于添加新用户的命令行应用。
    rmuser
    被推荐的用于删除新用户的命令行应用。
    chpass
    一个灵活的用于修改用户数据库信息的工具。
    passwd
    用于修改用户口令的简单的命令行工具。
    pw
    一个强大而又灵活的修改用来修改用户帐户的工具。
    8.6.1增加用户
    adduser是个简单的增加新用户的命令。它为用户创建passwd和group文件。它也为新用户创建一个主目录,从/usr/share/skel拷贝进一个默认的配置文件(“dotfiles”),然后给新用户发送一个带欢迎信息的邮件。
    要创建一个初始的配置文件,使用adduser -s -config_create。既然给普通用户创建root帐户是很危险的,所以下面我们配置adduser的默认设置,创建我们第一个用户帐户。
    例8-1,配置adduser
    # adduser -v
    Use option “-silent” if you don’t want to see all warnings and questions.
    Check /etc/shells
    Check /etc/master.passwd
    Check /etc/group
    Enter your default shell: csh date no sh tcsh zsh [sh]: zsh
    Your default shell is: zsh -_ /usr/local/bin/zsh
    Enter your default HOME partition: [/home]:
    Copy dotfiles from: /usr/share/skel no [/usr/share/skel]:
    Send message from file: /etc/adduser.message no
    [/etc/adduser.message]: no
    Do not send message
    Use passwords (y/n) [y]: y
    Write your changes to /etc/adduser.conf? (y/n) [n]: y
    Ok, let’s go.
    Don’t worry about mistakes. I will give you the chance later to correct any input.
    Enter username [a-z0-9_-]: jru
    Enter full name []: J. Random User
    Enter shell csh date no sh tcsh zsh [zsh]:
    Enter home directory (full path) [/home/jru]:
    Uid [1001]:
    Enter login class: default []:
    Login group jru [jru]:
    Login group is “jru”. Invite jru into other groups: guest no
    [no]: wheel
    Enter password []:
    Enter password again []:
    Name: jru
    Password: ****
    Fullname: J. Random User
    Uid: 1001
    Gid: 1001 (jru)
    Class:
    Groups: jru wheel
    HOME: /home/jru
    Shell: /usr/local/bin/zsh
    OK? (y/n) [y]: y
    Added user “jru”
    Copy files from /usr/share/skel to /home/jru
    Add another user? (y/n) [y]: n
    Goodbye!
    #
    总的来讲,我们把默认的shell设置成zsh(另一个可以在ports collection中找到的shell),关闭欢迎邮件。然后,保存配置,接着创建一个jru的帐户,并且确信jru在wheel组里面。(它可能假定已经用su转换成了root)。
    注意:你输入的口令是不会显示出来的,而只会显示星号。确保输入两次口令时,不要输错。从现在起,只要使用adduser,你不必改变默认设置。如果程序要求你改变默认设置,先退出程序,然后执行程序时加上-s选项。
    8.6.2 rmuser
    你可以使用rmuser从系统中完全删除一个用户。rmuser执行下面的步骤:
    1.         删除用户的crontab记录。
    2.         删除属于用户的at工作。
    3.         杀掉属于用户的所有线程。
    4.         删除本地口令文件中的用户。
    5.         删除用户的主目录。
    6.         删除来自/var/mail的属于用户的邮件。
    7.         删除所有诸如/tmp的临时文件存储区中的文件。
    8.         最后,删除在/etc/group中所有属于组的用户名。
    注意:如果一个组变成空,而组名和用户名一样,组将被删除。rmuser不能用来删除超级用户的帐户。
    例8-2. rmuser interactive account removal
    # rmuser jru
    Matching password entry:
    jru:*:1000:1000::0:0:J. Random User:/home/jru:/usr/local/bin/tcsh
    Is this the entry you wish to remove? y
    Remove user’s home directory (/home/jru)? y
    Updating password file,updating databases,done.
    Updating group file: trusted (removing group jru-personal group is empty) done.
    Removing user’s incoming mail file /var/mail/jru: done.
    Removing files belonging to jru from /tmp: done.
    Removing files belonging to jru from /var/tmp: done.
    Removing files belonging to jru from /var/tmp/vi.recover: done.
    #
    8.6.3 chpass
    Chpass可以改变用户的口令,shell和个人信息的数据库信息。只有超级用户才能改变其他用户的信息。除了可选择的用户名,不需要任何选项,chpass显示一个包含用户信息的编辑器,而且可以试图改变在用户数据库中的信息。
    例如8-3.用超级用户交互式执行chpass
    #Changing user database information for jru.
    Login: jru
    Password: *
    Uid [#]: 1000
    Gid [# or name]: 1000
    Change [month day year]:
    Expire [month day year]:
    Class:
    Home directory: /home/jru
    Shell: /usr/local/bin/tcsh
    Full Name: J. Random User
    Office Location:
    Office Phone:
    Home Phone:
    Other information:
    The normal user can change only a small subsection of this information, and only for themselves.
    例如8-4. 用普通用户交互式执行chpass
    #Changing user database information for jru.
    Shell: /usr/local/bin/tcsh
    Full Name: J. Random User
    Office Location:
    Office Phone:
    Home Phone:
    Other information:
    注意:chfn和chsh只连接到chpass。同样的是,ypchpass,ypchfn和ypchsh。NIS支持是自动的,所以不一定要在命令前指定yp。如果你感到有点糊涂,请不要着急,NIS将在第17章讲到。
    8.6.4 passwd
    passwd是改变你自己作为一个普通用户的口令或另一个作为超级用户口令的常用方法。
    注意:在改变口令前,用户必须键入原来的口令。当用户离开他们的控制台时,可以阻止一个没有经过认证的人改变他们的口令。
    例如8-5. 改变你的口令
    % passwd
    Changing local password for jru.
    Old password:
    New password:
    Retype new password:
    passwd: updating the database...
    passwd: done
    例如8-6. 改变另一个用户的口令
    # passwd jru
    Changing local password for jru.
    New password:
    Retype new password:
    passwd: updating the database...
    passwd: done
    注意:就像chpass一样,yppasswd只是一个到passwd的链接,所以NIS用任何一个命令都能工作。
    8.6.5 pw
    pw是一个用来创建、删除、修改、显示用户和组的命令行工具,它还有系统用户和组文件编辑器的功能。pw有一个非常强大的命令行设置选项,但新用户可能会觉得它比这儿讲的其他命令要复杂得多。
    8.7受限制的用户
    如果你运行一个多用户系统,你不信任的用户对系统所作的修改可能会损坏你的系统。FreeBSD提供了系统管理员限制用户访问系统资源的方法。这些限制通常被分成两种:磁盘配额和其他资源限制。
    磁盘配额为系统管理员提供了一个告诉文件系统给用户使用多少磁盘空间的方法。而且,它还提供了一种快速检查用户所使用的磁盘数量而不需要时刻计算的方法。配额将在第12.5节讨论。
    其他资源限制包括限制CPU、memory的数量和用户可能会使用的其他资源。这些是通过对登陆进行分类来完成的,下面将作讨论。
    登陆的类由/etc/login.conf文件来定义。比较精确的表述超出了本章的范围,但login.conf的联机手册会有比较细致的描述。
    资源限制与普通的登陆限制是有区别的。首先,对于每一种限制,有软限制和硬限制之分。一个软限制可能被用户或应用程序调整过了,但不会超越硬限制。越往后可能会越低,但不会升高。第二,绝大多数资源限制会分配每个进程给一个特殊的用户。
    下面就是绝大多数资源限制的例子:
    coredumpsize
    很明显,由程序产生的核心文件大小的限制在磁盘使用上是从属于其他限制的(如,文件大小,或磁盘配额)。然而,既然用户自己无法产生核心文件,而且经常不删除它们,设置这个可以减少由于一个大型应用程序的崩溃所造成的大量磁盘空间的浪费。
    cputime
    这是一个用户程序所能消耗掉的最大的CPU时钟数量。一些不理想的进程会被内核杀掉。
    注意:这是一个有关CPU消耗的时钟限制问题,不是在使用top和ps命令时屏幕上显示的CPU消耗的百分比。
    filesize
    这是用户可以处理的一个文件的最大值。不像磁盘配额,这个限制是对单个文件强制执行的。
    maxproc
    这是一个用户可以运行的最大的进程数。这包括前台和后台进程。很明显,这不可能比系统指定的限制要大。当然,如果设置得太小可能会削弱用户的处理能力:可能需要多次登陆或执行多个管道。一些任务,像编译一些大的程序,也可能会产生很多进程。(像make,cc,和其他一些预处理程序)。
    memorylocked
    这是一个进程可能会被锁定到主内存中的最大内存数量。一些比较大型的程序,像amd ,在遇到问题时,他们得到的巨大交换量无法传递给系统进行处理。
    memoryuse
    这是在给定时间内一个进程可能消耗的最大的内存数量。它包括核心内存和交换内存。在限制内存消耗方面,这个不是一个完全的限制,但它是一个好的开始。
    openfiles
    这是一个进程可以打开的最大的文件数。在FreeBSD中,文件也可以被用来表现套接字和IPC通道。然而,注意不要把这个设置得太小。对这个更深入的限制是由kern.maxfiles sysctl来定义的。
    sbsize
    这是网络内存数量的限制。这可以通过创建许多套接字来生成一些针对老式的DoS的攻击的回应,但它通常被用来限制网络通信。
    stacksize
    这是一个进程堆栈可能达到的最大值。这个不能单独地限制一个程序可能使用的内存数量,而是要和其他的限制一起配合。
    在设置资源限制时,有一些其他的事情需要记住。下面是一些通常的技巧,建议和各种注意事项。
                 系统启动的进程会被指派给守护程序的登陆类。
                 虽然来自系统的/etc/login.conf文件是一个对于绝大多数的限制作合理配置的资源文件,但只有你,系统管理员,才知道什么对你的系统才是最适当的。限制设得太高可能会把你的系统开放得太大而被人滥用,而设得太低可能会处理时效率很低。
                 X视窗系统的用户可能要比其他用户使用更多的资源。X11本身就要使用很多资源,但它也可以让用户同时运行更多的程序。
                 记住许多限制会被应用于单独的处理进程,不是所有的用户。例如,设置openfiles为50,意味着用户运行的每个进程可能最高只能打开50个文件。然而,用户可以打开的文件的总的大小是根据maxproc值逐步增加的openfiles值。这也会影响内存的消耗。有关资源限制,登陆类的更深入信息可以看看相关的联机手册:cap_mkdb,getrlimit,login.conf。
    8.8私有化用户
    本地化是由系统管理员或用户设置的一个环境,它可以用来调整不同的语言,字符设置,时钟标准等。这将在第13章本地化-I18N/L10N使用与设置作详细讨论。
    8.9组
    组简单来讲就是许多用户的列表。组可以通过它们的组名和编号来识别。在FreeBSD(和其他绝大多数的Unix系统)中,这两个要素通常被内核用来决定一个允许被执行的进程是否是它的用户ID,还是它所属的组的列表。不像用户ID,一个进程有一个与它相关联的组的列表。你可能听说过一些有关一个用户或进程的组ID的事情。在大多数情况下,这只意味着在列表中的第一个组。
    与组ID地图对应的组名在/etc/group中。这是一个用四个冒号来界定的文本文件。第一部分是组名,第二部分是加密的口令,第三部分是组ID,第四部分是以逗号分割的成员列表。它可以用手工的方式进行编辑。对于更完整的语法描述,可以参看group的联机手册。如果你不想手工编辑/etc/group,你可以使用pw命令来增加和编辑组。例如,要增加一个叫teamtwo的组,确信它存在:
    例如8-7. 使用pw增加一个组:
    # pw groupadd teamtwo
    # pw groupshow teamtwo
    teamtwo:*:1100:
    上面的1100数字是组teamtwo的组ID。在这儿,teamtwo没有成员,那它也就没有多大用处。
    例如8-8.使用pw在组中添加一些成员:
    # pw groupmod teamtwo -M jru
    # pw groupshow teamtwo
    teamtwo:*:1100:jru
    使用-M参数是为了用逗号划分开一个组成员中的用户列表。你可能知道口令文件也会为每个用户包含一个组。当使用pw来询问组成员的时候,在口令文件中的组会自动被添加到组列表中,而不会出现在成员列表中。如果你想知道一个用户属于哪个组,可以使用id命令:
    例如8-9.使用id来决定组成员
    % id jru
    uid=1001(jru) gid=1001(jru) groups=1001(jru),1100(teamtwo)
    正如你所看到的,jru是组jru和teamtwo的成员。
    有关pw的更多信息,可以参看它的联机手册,更多有关/etc/group格式的信息,可参考group的联机手册。