Linux 的用户与用户组

Linux 的用户与用户组

前言

结构化存储

组数据存放在目录 /etc/ 中, 并以多个文件存储, 分别为:

  1. passwd: 用户信息, 公共读
  2. shadow: 用户密码, root 读
  3. group: 组信息, 公共读
  4. gshadow: 组密码,root 读

文件 passwd

公共读, 每个用户位于单独的行上, 并以 分号 分割, 分别为:

  • Username: 登录名
  • Password: 加密密码. x 表示正在使用 shadow 文件管理密码
  • UID: 用户 ID,
  • GID: 组 ID
  • GECOS: 历史遗留
  • Home directory: 用户主目录
  • Shell: 用户登录时自动启动的程序

例如: siweipancc:x:1000:1000:,,,:/home/siweipancc:/bin/bash

管理 Password

修改当前用户名密码执行 passwd , 用 passwd <username> 以指定用户

可选项为:

  • -l: 锁定用户密码
  • -d: 清楚用户密码

管理 GECOS

该字段为以逗号分割的 4 段式内容, 通过 finger 查询内容, 可通过 chfn 命令进入交互式修改, 可选项为:

  • -f: 真实姓名
  • -h: 家中的电话号码
  • -o: 办公室的地址
  • -p: 办公室的电话号码

管理 UID / GID

执行 id 查看 用户 id, 输出包含 组 id, 可选项为:

  • -g: 输出 有效组
  • -G: 输出 所有组
  • -u: 输出 有效的用户ID

以上可组合下列选项:

  • -n: 打印名称而不是数字
  • -r: 打印真实ID而不是有效ID

例:

1
2
3
4
5
6
7
8
id # uid=1000(siweipancc) gid=1000(siweipancc) groups=1000(siweipancc),4(adm),20(dialout),24(cdrom),25(floppy),27(sudo),29(audio),30(dip),44(video),46(plugdev),116(netdev)
id -u # 1000
id -g # 1000
id -G # 1000 4 20 24 25 27 29 30 44 46 116
id -un # siweipancc
id -ur # 1000
id -gn # siweipancc
id -gr # 1000

管理 Shell

默认使用 /bin/bash, 置空将使用 /bin/sh , 如果指向错误将导致无法登录.

管理用户

在线文档

使用 useradd 新建用户

  1. -d: 指定用户登入时的启始目录
  2. -D: 变更预设值
  3. -e: 指定帐号的有效期限
  4. -f: 指定在密码过期后多少天即关闭该帐号
  5. -g: 指定用户所属的群组
  6. -G: 指定用户所属的附加群组
  7. -m: 自动建立用户的登入目录
  8. -M: 不要自动建立用户的登入目录
  9. -n: 取消建立以用户名称为名的群组
  10. -r: 建立系统帐号
  11. -s: 指定用户登入后所使用的shell
  12. -u: 指定用户id

使用 userdel 删除用户, 可选:

  • -r:同时删除用户目录及文件

例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 建议完成以下内容再阅读
root@siweipancc-GZ:/tmp# useradd testman
root@siweipancc-GZ:/tmp# passwd testman
root@siweipancc-GZ:/tmp# id testman
uid=1001(testman) gid=1001(testman) groups=1001(testman)
root@siweipancc-GZ:/tmp# cat /etc/passwd | grep 'testman'
testman:x:1001:1001::/home/testman:/bin/sh
root@siweipancc-GZ:/tmp# cat /etc/shadow | grep 'testman'
testman:$y$j9T$0DzFbh9/XNR6OVewcXz0F/$GsgYzI/.ammnsvvHYr8XOIj4LpjOl9Bup0Ny5IBABo9:19834:0:99999:7:::
root@siweipancc-GZ:/tmp# cat /etc/group | grep 'testman'
root@siweipancc-GZ:/tmp# cat /etc/gshadow | grep 'testman'
testman:!::
testman:x:1001:
root@siweipancc-GZ:/tmp# userdel -r testman

文件 shadow

root 读, 每个用户位于单独的行上, 并以 分号 分割, 分别为:

  • 登录名
  • 加密密码: 使用 crypt(3) 库函数或md5哈希算法对密码进行加密, 如果值为 ! 或 *. 则帐户被锁定. 不允许用户登录,如果值为 !! 则为密码以前从未设置过, 无法登录
  • 上次更改密码的日期: 以天数表示, 计算基底为: 1970-1-1
  • 可以更改密码之前的天数: 可以更改密码之前必须经过的最短天数
  • 需要更改密码之前的天数: 必须更改密码之前必须经过的天数
  • 密码更改前警告的天数: 密码到期前警告用户即将到期的天数
  • 密码过期未登录天数限制: 密码过期后帐户被禁用之前的天数
  • 帐户被禁用的日期: 以天数表示, 计算基底为: 1970-1-1
  • 保留字段

例: binlog:$1$.QKDPc5E$SWlkjRWexrXYgc98F.:12825:0:120:5:20:13096:

  • 登录名 binlog
  • 密码最后更改时间为 2005 年 2 月 11 日
  • 更改密码没有最短时间限制
  • 密码必须每 120 天更改一次
  • 用户将在必须更改密码前 5 天收到警告
  • 密码过期 20 天后. 如果未尝试登录. 帐户将被禁用
  • 该帐户将于 2005 年 11 月 9 日到期

文件 group

公共读, 每个组位于单独的行上, 并以 分号 分割, 格式 Group name : Password : UID : GID : GECOS : Home directory : Shell 分别为:

  • 组名
  • 组密码: 加密密码. x 表示正在使用 gshadow 文件管理密码
  • GID: 组 ID
  • 成员列表: 属于该组的用户的逗号分隔列表

管理组

使用 groupmod [ops] <group> 管理组, 可选:

  • -n <new name>: 修改 组名
  • -g <new gid>: 修改 组 ID

使用 groupadd [ops] <group> 增加组, 可选:

  1. -g: 指定新建工作组的id
  2. -r: 创建系统工作组, 系统工作组的组ID小于500
  3. -K: 覆盖配置文件 /ect/login.defs
  4. -o: 允许添加组ID号不唯一的工作组

使用 groupdel [ops] <group> 删除组

使用 newgrp 对于初始数据:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
root@siweipancc-GZ:/etc# id siweipancc
uid=1000(siweipancc) gid=1000(siweipancc) groups=1000(siweipancc),4(adm),20(dialout),24(cdrom),25(floppy),27(sudo),29(audio),30(dip),44(video),46(plugdev),116(netdev)
root@siweipancc-GZ:/etc# cat group | grep 'siweipancc'
adm:x:4:syslog,siweipancc
dialout:x:20:siweipancc
cdrom:x:24:siweipancc
floppy:x:25:siweipancc
sudo:x:27:siweipancc
audio:x:29:siweipancc
dip:x:30:siweipancc
video:x:44:siweipancc
plugdev:x:46:siweipancc
netdev:x:116:siweipancc
siweipancc:x:1000:

对组名跟 id 进行修改

1
2
3
4
5
6
root@siweipancc-GZ:/etc# groupmod -n gpancc siweipancc
root@siweipancc-GZ:/etc# groupmod -g 1200 gpancc
root@siweipancc-GZ:/etc# id siweipancc
uid=1000(siweipancc) gid=1200(gpancc) groups=1200(gpancc),4(adm),20(dialout),24(cdrom),25(floppy),27(sudo),29(audio),30(dip),44(video),46(plugdev),116(netdev)
root@siweipancc-GZ:/etc# cat group | grep 'gpancc'
gpancc:x:1200:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
root@siweipancc-GZ:/etc# id siweipancc
uid=1000(siweipancc) gid=1000(siweipancc) groups=1000(siweipancc),4(adm),20(dialout),24(cdrom),25(floppy),27(sudo),29(audio),30(dip),44(video),46(plugdev),116(netdev)
root@siweipancc-GZ:/etc# cat group | grep 'siweipancc'
adm:x:4:syslog,siweipancc
dialout:x:20:siweipancc
cdrom:x:24:siweipancc
floppy:x:25:siweipancc
sudo:x:27:siweipancc
audio:x:29:siweipancc
dip:x:30:siweipancc
video:x:44:siweipancc
plugdev:x:46:siweipancc
netdev:x:116:siweipancc
root@siweipancc-GZ:/etc# cat group | grep 'gpancc'
gpancc:x:1200:
root@siweipancc-GZ:/etc# groups siweipancc
siweipancc : gpancc adm dialout cdrom floppy sudo audio dip video plugdev netdev

文件 gshadow

root 读, 每个组位于单独的行上, 并以 分号 分割, 分别为:

  • 组名称
  • 加密密码
  • 组管理员: 以逗号分隔, 用 gpasswd 添加删除人员
  • 组成员: 以逗号分隔

管理组密码

使用 gpasswd <groupname> 进入交互模式

管理成员

使用 gpasswd [ops] <groupname> 命令, 可选:

  1. -a添加用户到组;
  2. -d从组删除用户;
  3. -A指定管理员;
  4. -M指定组成员和-A的用途差不多;
  5. -r删除密码;
  6. -R限制用户登入组,只有组中的成员才可以用 newgrp 加入该组。

额外

GECOS 字段含义

GECOS 代表通用电气综合运营主管. 贝尔实验室在最初的 UNIX 实现中使用了该字段. 实验室有许多不同的计算机. 其中一台运行 GECOS. 该字段用于存储 UNIX 系统向 GECOS 系统发送批处理和打印作业时的信息.

GECOS 字段部分无法修改

编辑文件 nano /etc/login.defs ,CTRL + w 输入 CHFN 定位到 CHFN_RESTRICT 行, 修改 为 frwh, CTRL + s, CTRL + x 保存并退出, 使用 finger 查询结果

切换用户密码的存储路径

使用 pwconv/etc/passwd 的密码迁移到 /etc/shadow(建议) 使用 pwunconv 逆转该过程(不建议)

切换组密码的存储路径

使用 grpconv/etc/group 的密码迁移到 /etc/gshadow(建议) 使用 grpunconv 逆转该过程(不建议)

使当前用户暂时加入组

使用 newgrp <groupname> 输入对应的组密码之后可以暂时该组权限与标记读取与修改文件等. 当该用户被使用 -r 标记删除时, 这些更改不会被删除.