Linux之用户管理

简介

Linux 系统是一个多用户多任务的分时操作系统,任何一个要使用系统资源的用户,都必须首先向系统管理员申请一个账号,然后以这个账号的身份进入系统

目录
用户基本信息 存储在 /etc/passwd
用户密码信息 存储在 /etc/shadow
用户群组基本信息 存储在 /etc/group
用户群组信息信息 存储在 /etc/gshadow
用户目录默认位于 /home/用户名
邮箱 /var/spool/mail/用户名

Linux 系统中,每个用户的 ID 细分为 2 种,分别是

  • 用户ID(User ID,简称 UID)
  • 组 ID(Group ID,简称 GID)

这与文件有拥有者和拥有群组两种属性相对应

用户

相关目录

/etc/passwd

一行记录对应着一个用户,每行记录以 : 分隔,其格式如下

1
seafile:x:1005:1005:seafile:/home/seafile:/bin/bash

含义

1
用户名:密码:UID:GID:注释信息:家目录:Shell
注释
用户名 用户的名称
密码 X表示占位符,也可以是密码
UID(用户ID) 用户识别代码
GID(组ID) 用户所属组
注释信息 可以完善用户的基本信息
家目录 系统登录用户后的工作目录
Shell 用户登录系统所使用的Shell

/etc/shadow

栗子

1
seafile:$6$YqkEsOcfKPptyhnS$YD0ym4BZ52pzcCnU....:16781:0:99999:7:::

含义如下

1
用户名:密码:上一次修改密码的时间:密码最小使用期限:最长使用期限:警告时间:帐户过期时间:保留字段
  1. 用户名:用户的名称,对应 /etc/passwd 文件中
  2. 密码:Centos6 中使用MD5加密算法,Centos7 中使用sha1的算法
    • 第一个 $ 后面加密算法类型
    • 第二个 $ 后面表示 salt 盐值
    • 第三个 $ 后面表示密码的提取码(参照加密类型)
  3. 上一次修改密码的时间:指用户上次修改密码的时间
    • 计算方法:从Linux元年 1970年01月01日0点0分 到目录所经过的秒数
  4. 密码最小使用期限:指用户修改密码后,需要到多少天后方可更改密码,0表示禁用
  5. 密码最长使用期限:指用户的密码到多少天后需要修改密码
  6. 警告时间:指用户密码到期前多少天提示用户修改密码,0空字段表示禁用此功能
  7. 帐户过期时间:批帐户在密码过期后多少天还未修改密码,将被停用

相关命令

添加用户

语法

1
useradd [选项] 用户名
选项 注释
-b, –base-dir 设置主目录的基目目
–btrfs-subvolume-home
-c, –comment 备注
-d, –home-dir 指定用户Home目录
-D, –defaults 显示或更改默认的配置
-e, –expiredate 指定帐号的的过期日期
-f, –inactive 指定在密码过期后多少天禁用帐号
-g, –gid 指定用户所属的群组
-G, –groups 指定用户所属的附加群组
-k, –skel 使用此目录作为骨架目录
-K, –key 不使用 /etc/login.defs 中的默认值
-l, –no-log-init 不记录最近登录和登录失败信息
-m, –create-home 建立Home目录
-M, –no-create-home 不创建Home目录
-N, –no-user-group 取消建立以用户名称为名的群组
-o, –non-unique 允许重复使用群组识别码
-p, –password 设置密码
-r, –system 建立系统账号
-R, –root 把根目录换成指定目录
-P, –prefix
-s, –shell 指定用户的shell,默认值为 /bin/sh
-u, –uid 指定用户ID
-U, –user-group 建立以用户名称为名的群组
-Z, –selinux-user

创建不允许登录的用户

1
useradd user01 -s /bin/nologin

创建用户并指定home目录

1
useradd user02 -d /home/user02

删除用户

语法

1
userdel [选项] [用户名]
选项 注释
-f, –force 强制执行
-r, –remove 删除用户的同时删除与用户相关的所有文件
-R, –root 把根目录换成指定目录
-P, –prefix
-Z, –selinux-user 为用户删除所有的 SELinux 用户映射

删除用户,但不删除其家目录及文件

1
userdel user01

删除用户,其家目录及文件一并删除

1
userdel -r user01

修改用户

语法

1
usermod [选项] [用户名]
选项 注释
-b, –badnames 设置主目录的基目目
-c, –comment 修改用户帐号的备注文字
-d, –home 修改用户登入时的目录
-e, –expiredate 修改帐号的有效期限
-f, –inactive 修改在密码过期后多少天即关闭该帐号
-g, –gid 修改用户所属的群组
-G, –groups 修改用户所属的附加群组
-a, –apend 把用户追加到某些组中,仅与 -G 使用
-l, –login 修改用户帐号名称
-L, –lock 锁定用户
-m, –move-home 删除HOME目录
-o, –non-unique 允许重复使用群组识别码
-p, –password 设置密码
-R, –root 把根目录换成指定目录
-P, –prefix
-s, –shell 修改用户登入后所使用的Shell
-u, –uid 修改用户ID
-U, –unlock 解锁用户
-v, –add-subuids
-V, –del-subuids
-w, –add-subgids
-W, –del-subgids
-Z, –selinux-user

更改登录目录

1
usermod -d /home/hnlinux user01

改变用户的 UID

1
usermod -u 777 user01

修改用户名xx为yy

1
usermod -l yy xx

设置密码

语法

1
passwd [选项] [用户名]
选项 注释
-a, –all
-d, –delete 删除指定帐户的密码
-e, –expire
-k, –keep-tokens 仅在过期后修改密码
-i, –inactive 过期后停止用户账号
-l, –lock 停止账号使用
-n, –mindays
-q, –quiet
-r, –repository
-R, –root 把根目录换成指定目录
-S, –status 查询用户密码的状态
-u, –unlock 解锁被指定帐户
-x, –maxdays 设置密码的有效期
–stdin 从标准输入管道读入新的密码

栗子

1
echo '密码' | passwd --stdin 用户名

批量设置

可以使用 chpasswd 命令从标准输入中读取一定格式的用户名、密码来批量更新用户的密码

1
2
echo 用户名:密码 | chpasswd
chpasswd < test.txt
选项 注释
-c, –crypt-method 指定加密方式
-e, –encrypted 输入的密码是加密后的密文
-m, –md5 当被支持的密码未被加密时,使用MD5加密代替DES加密
-R, –root
-s, –sha-rounds

生成用户名列表文件,或者自己导入

1
2
3
4
5
6
7
$ echo user{1..5} | xargs -n 1 useradd -s /bin/bash
$ tail -n 5 /etc/passwd
user1:x:1002:1002::/home/user1:/bin/bash
user2:x:1003:1003::/home/user2:/bin/bash
user3:x:1004:1004::/home/user3:/bin/bash
user4:x:1005:1005::/home/user4:/bin/bash
user5:x:1006:1006::/home/user5:/bin/bash

用户名:密码 的格式将新添加的用户写入 pwd.txt

1
2
3
4
5
6
7
$ echo user{1..5}:pwd$((RANDOM+10000000)) | tr " " "\n" >pwd.txt  # 将空格变成换行符\n
$ cat pwd.txt
user1:pwd10023079
user2:pwd10007409
user3:pwd10017693
user4:pwd10000887
user5:pwd10004436

批量设置密码

1
chpasswd <pwd.txt

0x03 用户组

每个用户都有一个用户组,系统可以对一个用户组中的所有用户进行集中管理。不同 Linux 系统对用户组的规定有所不同,如Linux下的用户属于与它同名的用户组,这个用户组在创建用户时同时创建

用户组的管理涉及用户组的添加、删除和修改。组的增加、删除和修改实际上就是对 /etc/group 文件的更新

相关目录

/etc/group

构成

1
root:x:0:

含义如下

1
组名:密码:GID:User_list
  1. 组名:组的名称,默认同名用户名
  2. 密码:组的密码
  3. GID:组的识别号
  4. User_list:该组下的用户,使用 , 隔开

/etc/gshadow

构成

1
root:$6$PLRAi/Z/svr$PRelPtvLuGJqvFG3D8fbjYHDho2RQUe93glO.::

含义如下

1
组名:密码:组管理者:User_list
  1. 组名:组名称,同步 /etc/group 文件中
  2. 密码
    • 第一个 $ 后面加密算法类型
    • 第二个 $ 后面表示 salt 盐值
    • 第三个 $ 后面表示密码的提取码(参照加密类型)
  3. 组管理者:可以对此组成员有操作权限,用逗号隔开
  4. User_list:用户的列表,使用逗号 , 隔开

相关命令

添加组

语法

1
groupadd [选项] [用户组]
选项 注释
-f, –force 强制执行
-g, –gid 指定新用户组的组标识号(GID)
-K, –key 覆盖配置文件 /ect/login.defs
-o, –non-unique 配合 -g 使用,允许重复使用群组识别码
-p, –password 设置组密码
-r, –system 创建系统账号,ID小于500
-R, –root 把根目录换成指定目录
-P, –prefix

栗子

新建组group1

1
groupadd group1

新建组group2,并指定组标识号

1
groupadd -g 998 group2

删除组

语法

1
groupdel [用户组]
选项 注释
-R, –root 把根目录换成指定目录
-P, –prefix
-f, –force 强制执行

栗子

删除组group1

1
groupdel group1

查看group1组是否删除成功

1
$ sudo more /etc/group | grep group1

通过查看 /etc/group 配置文件里面不存在group1组,说明已经被删除了

修改组

语法

1
groupmod [选项] [用户组]
选项 注释
-g, –gid 修改组ID
-o, –non-unique 允许重复使用群组识别码
-n, –new-name 将用户组的名字改为新名字

栗子

将组group2的组标识号修改为102

1
groupadd -g 998 group2

将组group2的标识号改为10000,组名修改为group3

1
groupmod –g 10000 -n group3 group2

设置组密码

语法

1
gpasswd [选项] [用户名] [组名]
选项 注释
-a, –add 用户名 组名 添加用户到组
-d, –delete 用户名 组名 把用户从组内删除
-r, –remove-password 删除组的密码
-A, –administrators 设置组的管理员列表
-M, –members 设置组的成员列表
-R, –restrict 将对组的访问权限限制为其成员

栗子

为group1组用户设置密码

1
gpasswd group1

将user01用户加入到group1组

1
gpasswd -a user01 group1

将user01用户从group1组删除

1
gpasswd -d user01 group1

移除group1用户组的组密码

1
gpasswd -r group1

0x04 扩展

用户查询相关命令

id

查询用户信息,例如用户归属那个用户组,及uid和gid等

1
id [选项]... [用户名]
选项 注释
-g, –group 显示用户所属群组的ID(GID)
-G, –groups 显示用户所属附加群组的ID
-n, –name 显示用户,所属群组或附加群组的名称
-r, –real 显示实际ID
-u, –user 显示用户ID

查询用户信息

1
2
$ id
uid=1000(pi) gid=1000(pi) groups=1000(pi),10(wheel),996(docker)

w

查看谁登录了,并且做了什么,切换的不行,从新登录的才行

1
w [选项] [用户名]
选项 注释
-f, –from 显示用户从哪登录
-h, –no-header 不打印头信息
-s, –short 短输出格式
-u, –no-current 当显示当前进程和cpu时间时忽略用户名
-i, –ip-addr 显示IP地址而不是主机名

who

查看哪些用户在登录,终端及登录时间,来源主机

1
who [选项] [用户名]
选项 注释
-a, –all 显示全面信息
-b, –boot 显示系统最近启动时间
-d, –dead 显示死掉的进程
-l, –login 显示系统登录进程
-H, –heading 带有列标题打印用户名,登录终端和登录时间
-q, –count 只显示登入系统的帐号名称和总人数
-s, –short 此参数将忽略不予处理,仅负责解决who指令其他版本的兼容性问题
-w, –mesg 显示用户的信息状态栏
-t, –time 显示系统上次锁定时间
-u, –users 显示已登录用户列表

打印用户登录信息

1
2
3
4
5
6
7
$ who -H -a
NAME LINE TIME IDLE PID COMMENT EXIT
system boot 2022-02-28 22:02
LOGIN tty1 2022-02-28 22:03 680 id=tty1
root + pts/0 2022-02-28 22:03 . 1258 (192.168.6.1)
run-level 3 2022-02-28 22:03
root + pts/1 2022-02-28 22:12 01:00 2500 (192.168.6.1)

打印系统最近启动时间

1
2
$ who -b
system boot 2022-02-28 22:02

users

显示当前登录系统的所有用户的用户列表。每个显示的用户名对应一个登录会话。如果一个用户有不止一个登录会话,那他的用户名将显示相同的次数

1
users

last

显示的用户曾经加目前登录以及退出登录列表

  • 执行 last 读取位于 /var/log/wtmp 的文件
  • 执行 lastb 读取位于 /var/log/btmp 的文件

语法

1
2
last [选项] [用户名]
lastb [选项] [用户名]
选项 注释
-a, –hostlast 将主机名/IP地址,显示在最后一列
-d, –dns 将IP地址转换成主机名称
-f, –file 指定记录文件
-i, –ip 只显示指定IP的登录情况
-n, –limit 显示列数
-R, –nohostname 不显主机名称/IP
-s, –since
-t, –until
-p, –present
-w, –fullnames
-x, –system 显示系统关闭、用户登录和退出的历史

栗子

显示近期用户或终端的登录情况

1
2
3
4
$ last
root pts/1 192.168.6.1 Mon Feb 28 22:12 still logged in
root pts/0 192.168.6.1 Mon Feb 28 22:03 still logged in
reboot system boot 3.10.0-1160.59.1 Mon Feb 28 22:02 - 23:45 (01:42)
  • 第一列:用户名 或 reboot(启动或重启操作)
  • 第二列:终端位置
    • pts/x:从SSH远程连接的用户
    • tty:直接连接到计算机或者本地连接的用户
    • system boot:表示启动或者重启操作
  • 第三列信息:登录IP/内核
    • :0:表示用户通过本地终端连接
  • 第四列:开始时间,日期格式为 date +"%a %b %d"
  • 第五列:结束时间
    • still login in:还未退出
    • down:正常关机
    • crash:强制关机
  • 第六列:持续时间

mkpasswd

mkpasswd(make password)可以随机生成字符串

1
mkpasswd [选项] 
选项 注释
-m, –method= 指定算法
-5 使用 md5crypt 加密,相当于 -m md5crypt
-S, –salt= 加盐值
-l 指定长度
-d 数字的个数
-c 小写字母个数
-C 大写字母个数
-s, –stdin 特殊字符个数
-R, –rounds= 加密循环次数
-P, –password-fd=

栗子

使用 mkpasswd 生成密码

1
2
3
4
5
mkpasswd -l 12           # 生成一个12位的密码
mkpasswd -l 12 -s 0 # 生成一个12位的密码,里面没有字符
mkpasswd -l 12 -s 0 -d 4 # 生成一个12位的密码,里面没有字符,有4个数字
mkpasswd -l 12 -s 0 -d 4 -C 5 # 生成一个12位的密码,里面没有字符,有4个数字,5个大写字母
mkpasswd -l 12 -s 0 -d 4 -c 5 # 生成一个12位的密码,里面没有字符,有4个数字,4个小写字母

给用户yang设置密码

1
passwd --stdin yang

在脚本里,给用户 yang 设置密码

1
echo "7126115683.q" | passwd --stdin yang

如果后面不加用户yang,就是直接给root设置密码