3.3.用户和基本账户管理

FreeBSD 允许多个用户同时使用计算机。虽然一次只能有一个用户坐在屏幕前使用键盘,但通过网络,任意数量的用户可以登录系统。为了使用系统,每个用户都应该有自己的用户账户。

本章说明了:

  • FreeBSD 系统上不同类型的用户账户。

  • 如何添加、删除和修改用户账户。

  • 如何设置限制以控制用户和组可以访问的资源。

  • 如何创建组并将用户添加为组的成员。

3.3.1. 账户类型

由于访问 FreeBSD 系统的所有方式都是通过账户完成的,所有进程都由用户运行,因此用户和账户管理非常重要。

有三种主要类型的账户:系统账户、用户账户和超级用户账户。

3.3.1.1. 系统账户

系统账户用于运行诸如 DNS、邮件和 Web 服务器等服务。这是出于安全考虑的原因;如果所有服务都以超级用户身份运行,它们可以不受限制地执行操作。

系统账户的示例包括daemonoperatorbindnewswww

nobody是通用的非特权系统账户。但是,使用nobody的服务越多,该用户将与越多的文件和进程相关联,因此该用户的特权越多。

3.3.1.2. 用户账户

用户账户分配给实际用户,用于登录和使用系统。每个访问系统的人都应该有一个唯一的用户账户。这允许管理员了解谁在做什么,并防止用户破坏其他用户的设置。

每个用户都可以设置自己的环境,以适应其对系统的使用,配置默认 shell、编辑器、键绑定和语言设置。

FreeBSD 系统上的每个用户账户都有与之关联的一些信息:

  • User name,用户名

    用户名在login:提示符处键入。每个用户必须有唯一的用户名。有一些有关创建有效用户名的规则,这些规则在passwd(5)中有文档记录。建议使用由八个或更少小写字符组成的用户名,以保持与应用程序的向后兼容性。

  • Password,密码

    每个账户都有一个关联的密码。

  • User ID (UID),用户 ID

    用户 ID(UID)是一个用于在 FreeBSD 系统中唯一标识用户的数字。允许指定用户名的命令首先将其转换为 UID。建议使用小于 65535 的 UID,因为较高的值可能导致与某些软件的兼容性问题。

  • Group ID (GID),组 ID

    组 ID(GID)是一个用于唯一标识用户所属的主要组的数字。组是一种基于用户的 GID 而不是 UID 来控制对资源的访问权限的机制。这可以显着减小某些配置文件的大小,并允许用户成为一个以上的组的成员。建议使用低于 65535 的 GID,因为较高的 GID 可能破坏一些软件。

  • Login class,登录类别

    登录类别是组机制的扩展,可为不同用户定制系统时提供额外的灵活性。有关登录类别的详细信息,请参见配置登录类别

  • Password change time,密码更改时间

    默认情况下,密码不会过期。但是,可以在每个用户基础上启用密码过期,强制一些或所有用户在经过一定时间后更改其密码。

  • Account expiration time,账户到期时间

    默认情况下,FreeBSD 不会使账户过期。当创建需要有限生命周期的账户,例如学校的学生账户时,请使用pw(8)指定账户到期日期。在到期时间过去后,该账户将无法用于登录系统,尽管账户的目录和文件将保留。

  • User’s full name,用户全名

    用户名唯一标识 FreeBSD 中的账户,但不一定反映用户的真实姓名。与注释类似,此信息可以包含空格、大写字符,并且可以超过 8 个字符的长度。

  • Home directory,主目录

    主目录是系统上目录的完整路径。这是用户登录时的起始目录。一个常见的约定是将所有用户主目录放在/home/username/usr/home/username下。每个用户都将其个人文件和子目录存储在自己的主目录中。

  • User shell,用户 shell

    shell 为用户与系统进行交互提供了默认的环境。有许多不同类型的 shell,经验丰富的用户将根据其账户设置反映出自己的喜好。

3.3.1.3. 超级用户账户

超级用户账户,通常称为root,用于在没有特权限制的情况下管理系统。因此,不应将其用于日常任务,如发送和接收邮件、系统的一般研究或编程。

与其他用户账户不同,超级用户账户可以无限制地运行,并且对超级用户账户的滥用可能导致灾难性的后果。为了避免误操作导致操作系统损坏,建议使用用户账户登录,只有在执行需要额外权限的命令时才切换为超级用户。

在获得超级用户特权方面有几种方法。虽然可以直接登录为root,但这是强烈不推荐的。

而应该使用su(1)成为超级用户。如果在运行此命令时指定了-,则用户还将继承 root 用户的环境。运行此命令的用户必须在wheel组中,否则命令将失败。用户还必须知道root用户账户的密码。

在此示例中,用户仅在运行make install需要超级用户特权时才成为超级用户。一旦命令完成,用户键入exit以退出超级用户账户并返回到其用户账户的权限。

示例 2. 以超级用户身份安装程序

% configure
% make
% su -
Password:
# make install
# exit
%

内置的su(1)框架适用于单一系统或只有一个系统管理员的小型网络。另一种选择是安装security/sudo软件包或 Port。此软件提供活动日志记录,并允许管理员配置哪些用户可以以超级用户身份运行哪些命令。

3.3.2. 账户管理

FreeBSD 提供了各种不同的命令来管理用户账户。最常见的命令总结在用于管理用户账户的实用程序中,然后是一些使用示例。有关详细信息和用法示例,请参阅每个实用程序的手册页面。

表 2. 用于管理用户账户的实用程序

| 命令 = | 概述 | | --------------------------=-----=----- | ------------------------------------ | | adduser(8) | 用于添加新用户的推荐命令行应用程序。 | | rmuser(8) | 用于删除用户的推荐命令行应用程序。 | | chpass(1) | 用于更改用户数据库信息的灵活工具。 | | passwd(1) | 用于更改用户密码的命令行工具。 | | pw(8) | 用于修改用户账户的强大而灵活的工具。 | | bsdconfig(8) | 具有账户管理支持的系统配置实用程序。 |

3.3.2.1. 添加用户

添加新用户的推荐程序是adduser(8)。当添加新用户时,此程序会自动更新/etc/passwd/etc/group。它还会为新用户创建主目录,从/usr/share/skel复制默认配置文件,并可以选择向新用户发送欢迎消息。此实用程序必须作为超级用户运行。

adduser(8)实用程序是交互式的,并且会按步骤引导创建新用户账户。如在FreeBSD 上添加用户中所示,要么输入所需的信息,要么按 Return 键接受方括号中显示的默认值。在此示例中,用户已被邀请加入wheel组,从而允许他们使用su(1)成为超级用户。完成后,实用程序将提示要么创建另一个用户,要么退出。

示例 3. 在 FreeBSD 上添加用户

# adduser

输出应类似于以下内容:

Username: jru
Full name: J. Random User
Uid (Leave empty for default):
Login group [jru]:
Login group is jru. Invite jru into other groups? []: wheel
Login class [default]:
Shell (sh csh tcsh zsh nologin) [sh]: zsh
Home directory [/home/jru]:
Home directory permissions (Leave empty for default):
Use password-based authentication? [yes]:
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]:
Username   : jru
Password   : ****
Full Name  : J. Random User
Uid        : 1001
Class      :
Groups     : jru wheel
Home       : /home/jru
Shell      : /usr/local/bin/zsh
Locked     : no
OK? (yes/no): yes
adduser: INFO: Successfully added (jru) to the user database.
Add another user? (yes/no): no
Goodbye!

注意

由于在键入密码时密码不会被回显,请在创建用户账户时当心不要输入错误的密码。

3.3.2.2. 从 FreeBSD 中删除用户

要从系统中完全删除用户,请以超级用户身份运行rmuser(8)。该命令执行以下步骤:

  1. 删除用户的crontab(1)条目(如果存在)。

  2. 删除属于用户的任何at(1)作业。

  3. 发送 SIGKILL 信号给用户拥有的所有进程。

  4. 从系统的本地密码文件中删除用户。

  5. 删除用户的主目录(如果它是用户所有的),包括处理通向实际主目录的路径的符号链接。

  6. /var/mail中删除用户的传入邮件文件。

  7. /tmp/var/tmp/var/tmp/vi.recover中删除用户拥有的所有文件。

  8. /etc/group中删除属于用户的所有组中的用户名。(如果一个组变为空并且组名与用户名相同,则删除该组;这是adduser(8)每用户唯一组的补充。)

  9. 删除用户拥有的所有消息队列、共享内存段和信号量。。

rmuser(8)不能用于删除超级用户账户,因为这几乎总是巨大破坏的迹象。

默认情况下,使用交互模式,如以下示例所示。

示例 4. rmuser交互式账户删除

# rmuser jru

输出应类似于以下内容:

Matching password entry:
jru:*:1001:1001::0:0:J. Random User:/home/jru:/usr/local/bin/zsh
Is this the entry you wish to remove? y
Remove user's home directory (/home/jru)? y
Removing user (jru): mailspool home passwd.

3.3.2.3. 更改用户信息

任何用户都可以使用chpass(1)更改其用户账户关联的默认 shell 和个人信息。超级用户可以使用此实用程序更改任何用户的其他账户信息。

当未传递任何选项时,除了可选的用户名之外,chpass(1)显示包含用户信息的编辑器。用户从编辑器退出时,用户数据库将使用新信息进行更新。

注意

如果没有以超级用户身份运行此程序,那么在退出编辑器时,此程序将提示用户输入密码。

使用chpass 作为超级用户中,超级用户已键入了chpass jru,现在正在查看可以为该用户更改的字段。如果jru运行此命令,只有最后六个字段将被显示和可供编辑。在使用chpass 作为常规用户中显示了这一点。

示例 5. 作为超级用户使用 chpass

# chpass

输出应类似于以下内容:

# 正在更改用户数据库信息以供 jru 使用。
Login: jru
Password: *
Uid [#]: 1001
Gid [# or name]: 1001
Change [month day year]:
Expire [month day year]:
Class:
Home directory: /home/jru
Shell: /usr/local/bin/zsh
Full Name: J. Random User
Office Location:
Office Phone:
Home Phone:
Other information:

示例 6. 作为常规用户使用 chpass

# 正在更改用户数据库信息以供 jru 使用。
Shell: /usr/local/bin/zsh
Full Name: J. Random User
Office Location:
Office Phone:
Home Phone:
Other information:

注意

命令chfn(1)chsh(1)passwd(1)的链接。同样,ypchpass(1)ypchfn(1)ypchsh(1)也是(链接),因此 NIS 与这两个命令都能正常工作。

3.3.2.4. 更改用户密码

任何用户都可以使用passwd(1)

松更改其密码。为防止意外或未经授权的更改,此命令在设置新密码之前将提示用户输入原始密码:

示例 7. 更改你的密码

% passwd

输出应类似于以下内容:

Changing local password for jru.
Old password:
New password:
Retype new password:
passwd: updating the database...
passwd: done

超级用户可以通过在运行passwd(1)时指定用户名来更改任何用户的密码。当作为超级用户运行此程序时,它将不会提示用户输入当前密码。这可以在用户无法记住原始密码时更改密码。

示例 8. 作为超级用户更改另一个用户的密码

# passwd jru

输出应类似于以下内容:

Changing local password for jru.
New password:
Retype new password:
passwd: updating the database...
passwd: done

注意

chpass(1)一样,yppasswd(1)passwd(1)的链接,因此 NIS 与两个命令都能正常工作。

3.3.2.5. 创建、删除、修改和显示系统用户和组

实用程序pw(8)可创建、删除、修改和显示用户和组。它充当系统用户和组文件的前端。pw(8)具有一组非常强大的命令行选项,使其适用于在 shell 脚本中使用,但新用户可能会发现它比本节中介绍的其他命令更复杂。

3.3.3. 管理组

组是用户列表。组由其组名和 GID 标识。在 FreeBSD 中,内核使用进程的 UID 和它所属的组列表来确定进程被允许做什么。大多数情况下,用户或进程的 GID 通常表示列表中的第一个组。

组名到 GID 的映射列在/etc/group中。这是一个包含四个以冒号分隔的字段的纯文本文件。第一个字段是组名,第二个是加密密码,第三个是 GID,第四个是逗号分隔的成员列表。有关语法的更完整描述,请参阅group(5)

超级用户可以使用文本编辑器修改/etc/group,尽管使用vigr(8)编辑组文件更受欢迎,因为它可以捕捉一些常见错误。或者,可以使用pw(8)添加和编辑组。例如,要添加一个名为teamtwo的组,然后确认它是否存在:

警告

在使用 operator 组时必须小心,因为可能会授予意外的类似超级用户的访问权限,包括但不限于关机、重启和对组中 /dev 中的所有项目的访问。

示例 9. 使用 pw(8) 添加组

# pw groupadd teamtwo
# pw groupshow teamtwo

输出应类似于以下内容:

teamtwo:*:1100:

在此示例中,1100teamtwo的 GID。现在,teamtwo没有成员。此命令将jru添加为teamtwo的成员。

示例 10. 使用 pw(8) 将用户账户添加到新组

# pw groupmod teamtwo -M jru
# pw groupshow teamtwo

输出应类似于以下内容:

teamtwo:*:1100:jru

-M的参数是要添加到新(空)组或替换现有组成员的用户的逗号分隔列表。对用户而言,这个组成员身份与用户在密码文件中列出的主要组不同(并且除外)。这意味着在使用pw(8)groupshow时,用户不会显示为成员,但在通过id(1)或类似工具查询信息时会显示为成员。当pw(8)用于将用户添加到组时,它仅操纵/etc/group,不尝试从/etc/passwd中读取附加数据。

示例 11. 使用 pw(8) 向组添加新成员

# pw groupmod teamtwo -m db
# pw groupshow teamtwo

输出应类似于以下内容:

teamtwo:*:1100:jru,db

在此示例中,-m的参数是要添加到组的用户的逗号分隔列表。与先前的示例不同,这些用户附加到组,不会替换组中的现有用户。

示例 12. 使用 id(1) 确定组成员资格

% id jru

输出应类似于以下内容:

uid=1001(jru) gid=1001(jru) groups=1001(jru), 1100(teamtwo)

在此示例中,jru 是组 jruteamtwo 的成员。

有关此命令和 /etc/group 格式的更多信息,请参阅 pw(8)group(5)

最后更新于

FreeBSD 中文社区