# Users and Groups (简体中文)

相关文章

- Change username
- DeveloperWiki:UID / GID Database
- PolicyKit
- chmod

翻译状态： 本文是英文页面 Users_and_Groups 的翻译，最后翻译时间：2013-08-19，点击这里可以查看翻译后英文页面的改动。

GNU/Linux通过用户和用户组实现访问控制 —— 包括对文件访问、设备使用的控制。Linux默认的访问控制机制相对简单直接。有一些更加高级的机制，包括：ACL和LDAP Authentication。

## 概览

用户一般指使用计算机的人。本文语境中，该词指用来识别用户的用户名称，既可以是Mary或Bill这样的真名，也可以是Dragonlady、Pirate这样的昵称。重要的是，计算机中每个账户都拥有一个名称，而使用者通过这些名称访问计算机。除了人之外，一些系统服务也使用不同的用户账户运行。

处于安全原因，我们通过一些途径对用户进行限制。

一个人可能拥有多个账户，只要这些账户名称不同。但有一些用户名称是系统保留的，比如“root”。

一个或多个用户可以组成一个“用户组”。用户也能够加入已经存在的用户组，并获取该组的特权。

注意: 初学者务必谨慎使用这方面的工具，并且避免对除自己以外的其他已存在用户进行操作。

## 权限和所有者

摘自 In UNIX Everything is a File （UNIX中一切皆文件）：

  凝聚统一多种想法和概念，UNIX操作系统塑造出她的设计、用户接口、文化和演变。这些概念中，有一句话可能最为重要：”一切皆文件。“ 这句话被认为是定义UNIX的关键之一。

  根据这一设计原则，必须要有一个统一的模型，用以管理大量I/O资源的访问：文档、目录、磁盘、CD-ROM、调制解调器、键盘、打印机、显示器、终端，甚至包括进程间、网络间通信。而解决之策就是为所有这些资源提供一个抽象层，UNIX之父们称之为”文件“。所有文件通过相同的API提供访问，因此使用同一套简单的命令就可以读写磁盘、键盘、文档以及网络设备。

摘自 Extending UNIX File Abstraction for General-Purpose Networking （针对普通网络应用扩展UNIX文件抽象层）：

  UNIX及兼容系统提供一个基础而强大的抽象层——文件。很多系统服务和设备的应用程序借口，都被设计为文件或文件系统之类的东西。这赋予程序新的力量——通过文件抽象层，可以以全新的方式使用现有的、用途单一的小工具。例如cat工具，原本的用途只是读取文件并将内容输出到标准输出，但现在它可以通过特殊设备文件（通常在`/dev`目录中）读写I/O设备。在很多系统上，音频记录和播放可以通过命令简单完成：分别是"`cat /dev/audio > myfile`"以及"`cat myfile > /dev/audio`"

GNU/Linux系统中的每一个文件都被一个用户（属主）和一个用户组（属组）所有。另外，有三种类型的访问权限：读（read）、写（write）、运行（execute）。可以针对文件属主、属组设置不同的访问权限。可以通过`ls`命令的长列表格式查看文件属主、属组以及权限：

    $ ls /boot/ -l

    total 18492
    drwxr-xr-x 3 root root    12288 Aug 21 03:27 grub
    -rw-r--r-- 1 root root 12487150 Aug 29 18:24 initramfs-linux-fallback.img
    -rw-r--r-- 1 root root  2990626 Aug 29 18:23 initramfs-linux.img
    -rw-r--r-- 1 root root  3440576 Aug 26 15:17 vmlinuz-linux

第一列是文件访问权限（例如，文件`initramfs-linux.img`的权限为`-rw-r--r--`），第三列和第四列分别是属主和属组（本例中所有文件属主都是root用户，属组都是root组）。

    $ ls /media/ -l

    total 16
    drwxrwx--- 1 root vboxsf 16384 Jan 29 11:02 sf_Shared

上述例子中，`sf_Shared`目录由root用户和vboxsf组所有。使用`stat`命令也可以查看文件所有权和权限：

属主：

    $ stat -c %U /media/sf_Shared/

    root

属组：

    $ stat -c %G /media/sf_Shared/

    vboxsf

访问权限：

    $ stat -c %A /media/sf_Shared/

    drwxrwx---

访问权限由三组字符组成，分别代表属主、属组、其他人的权限。例如，`-rw-r--r--`表示属组有读写权限、但无运行权限（`rw-`），属组用户和其他用户只有读取权限（`r--`）。又如，`drwxrwx---`表示文件属主和属组用户有读、写、执行权限（`rwx`），而禁止其他用户任何访问（`---`）。第一个字符”d“代表文件类型（目录）。

通过`find`命令查找属于某个用户或某个组的文件：

    # find / -group [用户组]
    # find / -user [用户]

文件的属主、属组可以通过`chown`命令更改。文件的权限可以通过`chmod`命令修改。

详情参见：man chown、man chmod、Linux file permissions。

## 用户管理

使用`who`命令，可以查看目前已登陆的用户。

使用`useradd`命令添加用户：

    # useradd -m -g [初始组] -G [附加组] -s [登陆shell] [用户]

- `-m`：创建用户主目录`/home/[用户名]`；在自己的主目录内，即使不是root用户也可以读写文件、安装程序等等。
- `-g`：设置用户初始组的名称或数字ID；该组必须是存在的；如果没有设置该选项，`useradd`会根据`/etc/login.defs`文件中的USERGROUPS_ENAB环境变量进行设置。
- `-G`：用户要加入的附加组列表；使用逗号分隔多个组，不要添加空格；如果不设置，用户仅仅加入初始组。
- `-s`：用户默认登录shell的路径；Arch Linux的init脚本使用bash；启动过程结束后，默认启动的登录shell在此处设定；请确保使用的shell已经安装。

以典型的桌面系统为例，要添加一个名为archie的用户，并使用bash作为登录shell：

    # useradd -m -g users -s /bin/bash archie

有关`useradd`的高级用法，参见man页：

    $ man useradd

通过下列命令设置GECOS字段（用户信息，例如用户全名）：

    # chfn [用户名]

（这样将会以交互式模式启动`chfn`）

通过下列命令设置用户密码：

    # passwd [用户名]

另一个交互式界面的添加用户的工具：

    # adduser

`adduser`会询问一些常见的设置，并使用合适的默认值，调用`useradd`创建用户。该命令还会设置用户信息和密码，囊括了`chfn`和`passwd`两个命令的功能。

使用`userdel`命令删除用户：

    # userdel -r [用户名]

`-r`选项表示一并删除用户主目录和邮件。

### 用户信息存储

本地用户信息储存在`/etc/passwd`文件中。要查看系统上所有用户账户：

    $ cat /etc/passwd

一行代表一个用户，格式如下：

    account:password:UID:GID:GECOS:directory:shell

此处：

- `account`：用户名
- `password`：用户密码
- `UID`：用户的数字ID
- `GID`：用户所在主组的数字ID
- `GECOS`：可选的注释字段，通常记录用户全名
- `directory`：用户的主目录（`$HOME`）
- `shell`：用户的登陆shell（默认为`/bin/sh`）

注意: Arch Linux 使用影子密码。`passwd`文件对所有人可读，在里面存储密码（无论是否加密过）是很不安全的。在`password`字段，通常使用一个占位字符（`x`）代替。加密过的密码储存在`/etc/shadow`文件，该文件对普通用户限制访问。

## 用户组管理

`/etc/group`文件储存了系统中用户组的信息，详情参见：`man group`。

使用`groups`命令查看用户所在组的名称：

    $ groups [用户名]

若省略用户名，默认显示当前用户所在组。

`id`命令提供额外的信息，包括用户UID以及相关用户组GID：

    $ id [用户名]

查看所有组：

    $ cat /etc/group

使用`groupadd`创建新的组：

    # groupadd [组名]

使用`gpasswd`将用户添加到组：

    # gpasswd -a [用户名] [组名]

删除用户组：

    # groupdel [组名]

将用户从组中移除：

    # gpasswd -d [用户名] [组名]

如果用户已登录，必须重新登录使更改生效。

## 文件列表

警告: 不要手动编辑这些文件。有些工具可以更好的处理锁定、避免数据库错误。

文件 | 作用
--- | ---
`/etc/shadow` | 保存用户安全信息
`/etc/passwd` | 用户账户信息
`/etc/gshadow` | 保存组账号的安全信息
`/etc/group` | 定义用户所属的组
`/etc/sudoers` | 可以运行 sudo 的用户
`/home/*` | 主目录

## 群组列表

### 用户组

注意: 只要 logind 会话从登录VT启动，标准的桌面权限不需要这些组也能访问声音、3D、打印、挂载等。参阅 General Troubleshooting#Session permissions。

工作站、桌面用户会把日常使用的非root用户添加到下列附加组，以方便访问外部设备、硬件以及系统管理：

组 | 影响文件 | 作用
--- | --- | ---
audio | `/dev/audio`, `/dev/snd/*`, `/dev/rtc0` | 直接访问声音硬件(ALSA 和 OSS).
camera |  | 访问 Digital Cameras.
disk | `/dev/sda[1-9]`, `/dev/sdb[1-9]` | 直接访问不受 optical, floppy 和 storage 组控制的块设备. 除非有特殊需要, 否则不建议将一般用户添加至该组.
floppy | `/dev/fd[0-9]` | 访问软盘驱动器。
games | `/var/games` | 访问一些游戏。
locate | `/usr/bin/locate`, `/var/lib/locate`, `/var/lib/mlocate`, `/var/lib/slocate` | 使用 updatedb 命令。
lp | `/etc/cups`, `/var/log/cups`, `/var/cache/cups`, `/var/spool/cups` | 访问打印设备，管理打印任务。
network |  | 改变网络设置的权限，比如使用 Networkmanager 的权限.
networkmanager |  | 通过 Networkmanager 连接无线网的权限。这个组在默认的Arch设置里没有，需要手动添加。
optical | `/dev/sr[0-9]`, `/dev/sg[0-9]` | 访问光学设备，比如CD，DVD。
power |  | 使用 Pm-utils (挂起、休眠...) 和电源管理控制。
scanner | `/var/lock/sane` | 访问扫描仪硬件。
storage |  | 访问可移动储存器，例如 USB 硬盘、flash 存储器、MP3 播放器等；用户可以通过 D-Bus 挂载设备。
sys |  | 管理 CUPS 中的打印机.
users |  | 标准用户组.
uucp | `/dev/ttyS[0-9]`, `/dev/tts/[0-9]` | 串口和 USB 设备，例如猫、手柄 RS-232/串口。
video | `/dev/fb/0`, `/dev/misc/agpgart` | 访问视频捕获和硬件加速设备。例如framebuffer (X 不属于这个组也能使用).
wheel |  | 管理组，通常用于　sudo　和 su 命令权限。systemd 会允许非　root 的 wheel 组用户启动服务。[1]

### 系统组

下列组系统使用，一般不被 Arch 用户使用：

组 | 影响文件 | 作用
--- | --- | ---
avahi |  |
bin | `/usr/bin/*` | 以只读权限访问 `/usr/bin/` 中的二进制文件.
clamav | `/var/lib/clamav/*`, `/var/log/clamav/*` | Clam AntiVirus 使用.
daemon |  |
dbus | `/var/run/dbus/*` |
ftp | `/srv/ftp` | FTP 服务器，例如 Proftpd
gdm | X 认证目录 (ServAuthDir) | GDM 组.
hal | `/var/run/hald`, `/var/cache/hald` |
http |  |
kmem | `/dev/port`, `/dev/mem`, `/dev/kmem` |
log | `/var/log/*` | 访问 `/var/log` 中的日志.
mail | `/usr/bin/mail` |
mem |  |
mpd | `/var/lib/mpd/*`, `/var/log/mpd/*`, `/var/run/mpd/*`, 可选的音乐目录 | MPD 组.
nobody |  | 无权限的组。
ntp | `/var/lib/ntp/*` | NTPd 组.
policykit |  | PolicyKit 组.
root | `/*` | 完全的系统管理和控制 (root, admin)
smmsp |  | sendmail 组.
systemd-journal | `/var/log/journal/*` | 访问完整系统日志，不在此组中的用户仅能访问自己生成的信息。
tty | `/dev/tty`, `/dev/vcc`, `/dev/vc`, `/dev/ptmx` | 访问 `/dev/ACMx`
vboxsf | 虚拟系统的共享目录 | VirtualBox使用.

### 程序专用组

如下组中的成员可以执行特定程序：

组 | 影响文件 | 作用
--- | --- | ---
adbusers | `/dev/`中的设备节点 | 访问 Android 调试桥。
cdemu | `/dev/vhba_ctl` | 使用 cdemu 模拟驱动.
kvm | 用户空间软件可以访问 `/dev/kvm` 接口 | 使用 KVM 的硬件虚拟化。
thinkpad | `/dev/misc/nvram` | ThinkPad 用户访问 tpb 等工具。
vboxusers | `/dev/vboxdrv` | 使用Virtualbox软件
vmware |  | 使用 VMware 软件。

### 过时的组

如下组目前已经没有任何作用:

组 | 作用
--- | ---
rfkill | 不再使用! 控制无线设备的电源 (可能被 rfkill 使用).
stb-admin | 不再使用! 曾经用来控制 system-tools-backends 的访问。

Category:

- Security (简体中文)