首页 > 教程 > FreeBSD 教程 > FreeBSD 基础 > FreeBSD 用户和基本账户管理

FreeBSD 用户和基本账户管理

FreeBSD 是一款多用户系统,允许多个用户同时使用计算机。只有一个用户能使用屏幕和键盘,但是其他的用户可以通过网络登录系统。

要使用 FreeBSD 系统,每个用户都需要拥有自己的账户。

本文将为你讲述:

  • FreeBSD 系统上的用户账户的类型
  • 如何添加、删除和修改用户账户
  • 如何设置用户和组访问资源的权限
  • 如何创建组并为组添加成员

账户类型

在 FreeBSD 系统中用户需要使用账户访问系统,并运行程序,因此对于用户来说账户管理就显得非常重要。

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

注意:有时 “用户账户” 来表示一种类型;而有时表示整类账户,要注意根据上下文区分。

系统账户

系统账户用于运行系统的服务,如 DNS、Web 服务等。这样设计便于控制服务的运行权限。

如果所有的服务都是以超级用户的权限运行,则无法限制他们访问资源的权限。

系统账户的包括 daemonoperatorbindnewswww 等。

nobody 是通用的无特权系统账户。但是,如果 nobody 运行的服务越多,那么它就能访问相应服务的文件和进程,因此它的权限也就越大。

用户账户

用户账户是分配给真实人员使用的账户,用于登录系统。严格来说最好是一个人对应一个用户账户,这样能够记录每个用户的操作,便于管理。

每个用户都可以配置其自己的 shell、编辑器、键绑定和语言设置,来方便自己的使用。

FreeBSD 系统上的用户账户包含如下的信息:

  • 用户名:在 login: 提示符处输入的用户名;每个用户必须具有一个唯一的用户名;建议使用少于 8 字符的全小写形式的字符串。

  • 密码:对应账户的密码。

  • 用户 ID(UID):是用于标识 FreeBSD 系统中用户的唯一数字;建议使用小于 65535 的 UID。

  • 组 ID(GID):是用于标识用户所属主要组的唯一数字。组是一种基于用户的 GID 来控制资源访问的权限;允许用户成为多个组的成员,可以减少配置;建议使用小于 65535 的 GID。

  • 登录类别:是组的扩展机制,可以提供一些额外配置。

  • 密码更改时间:默认情况下,密码不会过期。也可以为用户设置密码过期时间,强制用户定期更改密码。

  • 账户过期时间:默认情况下,账户不会过期。设置账户过期时间后,过期的账户将无法访问系统,但会保留账户的目录和文件。

  • 用户全名:用户名是唯一标识,但不一定能直观反映用户的真实姓名;而用户全名就是用户的真实姓名。

  • 主目录:是用户在系统上的工作目录,也就是用户存放自己文件的位置,使用一个绝对路径标识。这是用户登录时的起始目录;用户主目录放在 /home/username/usr/home/username 下, /home/username 是对 /usr/home/username 一个符号链接 。

  • 用户 shell:用户默认使用的 shell 环境;用户可以根据自己的偏好,选择一种类型的 shell。

超级用户账户

超级用户账户,通常是指 root 账户,可以访问系统的全部资源,一定要谨慎使用。

在需要使用 root 权限时,最好也不要直接登录 root 账户,而是使用如下两种方式:

  • 使用 su 命令,如果运行时指定参数 -,用户将会使用 root 用户的环境,只有 wheel 组中的用户才能运行 su 命令,还需要输入 root 的密码。
  • 推荐使用 sudo 命令,需要额外安装,我们将在专门的章节介绍。

示例:运行 make install 命令安装程序需要超级用户权限:

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

命令解释说明:

1)每行开头一般是一个 shell 提示符:

Shell 类型 普通用户提示符 root 用户提示符
csh % #
bash / sh (Bourne Shell) $ #

2)使用 su - 登录 root 用户,输入密码后,登录进 root 用户。

3)使用 exit 命令退出 root 用户

管理账户

FreeBSD 系统提供了多个命令来管理用户账户。如下给出一些最常用的管理账户的命令:

  • adduser:用于添加新用户
  • rmuser:推荐用于删除用户的命令行应用程序
  • chpass:用于更改用户的数据库信息
  • passwd:用于更改用户的密码
  • pw:用于修改用户账户所有信息
  • bsdconfig:一个系统实用程序,用于账户管理

添加用户

推荐使用 adduser 命令添加新用户,该命令会做很多自动配置:

  • 自动更新 /etc/passwd/etc/group 中的信息
  • 为新用户创建主目录
  • /usr/share/skel 复制默认配置文件
  • 可以选择向新用户发送欢迎邮件

注意:adduser 命令必须以超级用户权限运行。

adduser 命令以交互的方式创建新用户(以超级用户执行):

# adduser

交互输出的信息如下:

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

解释说明:

  • 把新创建的用户添加到了 wheel 组,具有执行 susudo 的权限。
  • 键入密码时不会回显,是为了安全考虑,所以输入密码是要小心,不要输入错误。

删除用户

使用 rmuser 命令能够删除用户的全部信息,该命令会执行如下的任务:

  1. 删除用户的 crontab 条目
  2. 删除用户的 at 作业
  3. 向用户的所有进程发送 SIGKILL 信号
  4. 从系统的本地密码文件中删除用户
  5. 删除用户的主目录
  6. 删除 /var/mail 中用户的邮件
  7. 删除 /tmp/var/tmp/var/tmp/vi.recover 中用户的文件
  8. 删除 /etc/group 中组中的当前用户名
  9. 删除用户的消息队列、共享内存段和信号量

注意:rmuser 无法删除超级用户账户且需要使用超级用户权限执行。

rmuser 会使用交互的方式产出用户(以超级用户执行):

# rmuser fu

交互输出类似如下的内容:

Matching password entry:
fu:*:1002:1001::0:0:FreeBSD User:/home/fu:/bin/sh
Is this the entry you wish to remove? y
Remove user's home directory (/home/fu)? y
Removing user (fu): mailspool home passwd.

更改用户信息

任何用户都可以使用 chpass 命令;普通用户只能修改与自己相关的信息;超级用户可以修改任何用户的信息。

当不传递用户名时,chpass 会显示自己的用户信息。

使用不同类型的用户运行 chpass 命令,可能会显示不同的字段,因为只会显示当前用户可以修改的字段。

1)以超级用户运行 chpass

# chpass fu

输出应类似于以下内容:

# Changing user database information for fu.
Login: fu
Password:   # 使用使用 FreeBSD 密码哈希标准格式 SHA512-crypt 加密后的字符串
Uid [#]: 1001
Gid [# or name]: 1001
Change [month day year]:
Expire [month day year]:
Class:
Home directory: /home/fu
Shell: /bin/sh
Full Name: FreeBSD User
Office Location:
Office Phone:
Home Phone:
Other information:

编辑后保存即可修改对应的信息。

2)以普通用户运行 chpass

$ chpass fu

输出应类似于以下内容:

#Changing user database information for fu.
Shell: /bin/sh
Full Name: FreeBSD User
Office Location:
Office Phone:
Home Phone:
Other information:

编辑后保存即可修改对应的信息。

更改用户密码

1)用户可以使用 passwd 更改自己的密码,在更改自己密码时需要先输入原始的密码:

$ passwd

输入原始密码后,输入密码和确认密码。

输出应类似于以下的内容:

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

2)超级用户可以运行 passwd 命令修改自己的密码,也可以指定用户名,修改指定用户的密码:

# passwd fu

超级用户修改密码时无需输入原始密码,只需输入密码和确认密码。

输出类似以下的内容:

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

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

pw 命令可以用于创建、删除、修改和显示用户和组。由于此命令比较复杂,在此就不多做介绍了。

管理组

组是用户列表,由其组名和 GID 标识。在 FreeBSD 中,内核进程的 UID 及其属组的列表来表示该进程具有的权限。通常情况下,用户或进程的 GID 表示其所有组中排在最前面的组。

组名和 GID 的对应表保存在 /etc/group 中。这是一个文本文件,包含四个字段,字段之间使用冒号分隔。第一个字段是组名,第二个是加密密码,第三个是 GID,第四个是以逗号分隔的成员列表。

超级用户可以使用文本编辑器修改 /etc/group,但建议使用特定的 vigr 命令编辑组文件,它可以捕获一些常见错误。

推荐使用 pw 命令添加和编辑组。

1)使用 pw 命令的 groupadd 子命令添加一个名为 teamtwo 的组(需要使用超级用户):

# pw groupadd teamtwo

2)使用 pw 命令的 groupshow 子命令查看 teamtwo 组的信息:

# pw groupshow teamtwo

输出类似如下的信息:

teamtwo:*:1100:

teamtwo 组的 GID 是 1100,当前还没有用户。

此命令将添加 jru 作为 teamtwo 的成员。

3)使用 pw 命令的 groupmod 子命令设置组成员:

# pw groupmod teamtwo -M fu

参数 -M 解释说明:

  • 用于指定成员的信息,它会完全替换原有的成员信息
  • 数据是一个使用逗号分隔的用户名列表

pwgroupshow 命令在列出组的用户时,访问 /etc/group 文件读取数据,不会访问 /etc/passwd 中组的配置信息。使用 id 等命令可以访问 /etc/passwd 文件,获取全部信息。

# pw groupshow teamtwo

输出类似于以下内容:

teamtwo:*:1100:fu

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

4)使用 pw 命令的 groupmod 子命令添加新成员:

# pw groupmod teamtwo -m db

参数解释说明:

  • -m:小写形式是在原有组用户的后面附加用户,值可以是以逗号分隔的用户列表。
# pw groupshow teamtwo

输出类似于以下内容:

teamtwo:*:1100:fu,db

5)使用 id 命令查看用户的全部组信息:

% id fu

输出类似于以下内容:

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

在此示例中,用户 fufuteamtwo 组的成员。