1.前言
Linux系统是一个多用户多任务的分时操作系统,任何一个要使用系统资源的用户,都必须首先向系统管理员申请一个账号,然后以这个账号的身份进入系统。
用户的账号一方面可以帮助系统管理员对使用系统的用户进行跟踪,并控制他们对系统资源的访问;另一方面也可以帮助用户组织文件,并为用户提供安全性保护。
2.用户和组基本概念
(1)用户
Linux中每个用户是通过 User Id(UID)来唯一标识的
- 管理员:root, 0
- 普通用户:1-60000 自动分配
- 系统用户:1-499 (CentOS 6以前), 1-999 (CentOS 7以后) 对守护进程获取资源进行权限分配
- 登录用户:500+ (CentOS6以前), 1000+(CentOS7以后) 给用户进行交互式登录使用
(2)用户组
Linux中可以将一个或多个用户加入用户组中,用户组是通过 Group ID(GID) 来唯一标识的。
- 管理员组:root, 0
- 普通组:
- 系统组:1-499(CentOS 6以前), 1-999(CentOS7以后), 对守护进程获取资源进行权限分配
- 普通组:500+(CentOS 6以前), 1000+(CentOS7以后), 给用户使用
(3)用户和组的关系
- 用户的主要组(primary group):用户必须属于一个且只有一个主组,默认创建用户时会自动创建
和用户名同名的组,做为用户的主要组,由于此组中只有一个用户,又称为私有组 - 用户的附加组(supplementary group): 一个用户可以属于零个或多个辅助组,附加组
[root@c7-1 ~]#id root
uid=0(root) gid=0(root) groups=0(root)
[root@c7-1 ~]#id postfix
uid=89(postfix) gid=89(postfix) groups=89(postfix),12(mail)
(4)安全上下文
Linux安全上下文Context:运行中的程序,即进程 (process),以进程发起者的身份运行,进程所能够访问资源的权限取决于进程的运行者的身份。
比如:分别以 root 和 syhj 的身份查看 /etc/shadow ,得到的结果是不同的,资源能否能被访问,是由运行者的身份决定,非程序本身。
[syhj@c7-1 ~]$cat /etc/shadow #以普通用户无法查看
cat: /etc/shadow: Permission denied
[syhj@c7-1 ~]$exit
logout
[root@c7-1 ~]#cat /etc/shadow #使用root用户可以查看
root:$6$ufFy7VbEzzynvaVy$k9l1PFr84cUOzyd2mDrCnORqMeJKePO117oaiybpQ9t4rmuGOyIztHx29agMWxD5iXmQSKwi9YLoJo8lgc4fL.::0:99999:7:::
bin:*:17834:0:99999:7:::
daemon:*:17834:0:99999:7:::
......
3.用户和组配置文件
(1)主要配置文件
文件 | 含义 |
---|---|
/etc/passwd | 用户及其属性信息(名称、UID、主组ID等) |
/etc/shadow | 用户密码及其相关属性 |
/etc/group | 组及其属性信息 |
/etc/gshadow | 组密码及其相关属性 |
(2)passwd文件格式
/etc/passwd 一共 7 个字段,下面是每个字段的含义
字段 | 含义 |
---|---|
login name | 登录用户名 (syhj) |
passwd | 密码 (x) |
UID | 用户身份编号 (1000) |
GID | 登录默认所在组编号 (1000) |
GECOS | 用户全名或注释 |
home directory | 用户主目录 (/home/wang) |
shell | 用户默认使用shell (/bin/bash) |
[root@c7-1 ~]#cat /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
......
tcpdump:x:72:72::/:/sbin/nologin
syhj:x:1000:1000:syhj:/home/syhj:/bin/bash
(3)shadow文件格式
- 登录用户名
- 用户密码:一般用sha512加密
- 从1970年1月1日起到密码最近一次被更改的时间
- 密码再过几天可以被变更(0表示随时可被变更)
- 密码再过几天必须被变更(99999表示永不过期)
- 密码过期前几天系统提醒用户(默认为一周)
- 密码过期几天后帐号会被锁定
- 从1970年1月1日算起,多少天后帐号失效
[root@c7-1 ~]#cat /etc/shadow
root:$6$ufFy7VbEzzynvaVy$k9l1PFr84cUOzyd2mDrCnORqMeJKePO117oaiybpQ9t4rmuGOyIztHx29agMWxD5iXmQSKwi9YLoJo8lgc4fL.::0:99999:7:::
bin:*:17834:0:99999:7:::
daemon:*:17834:0:99999:7:::
adm:*:17834:0:99999:7:::
......
postfix:!!:18831::::::
tcpdump:!!:18831::::::
syhj:$6$eBhaaWvbAN6lE7Wm$i8ZeqhGG7mw7Dn6VL8CHcAxGuxvQtDXFOtqrqI.qXWFgOiEwacnemDmd2MiCTCLGR714HmGzhqU7ry4xMbYYb1::0:99999:7:::
#更改密码加密算法
[root@c7-1 ~]#authconfig --passalgo=sha256 --update
#生成随机密码
[root@c7-1 ~]#tr -dc '[:alnum:]' < /dev/urandom | head -c 12
(4)group文件格式
- 群组名称:群组名称
- 群组密码:通常不需要设定,密码是被记录在 /etc/gshadow
- GID:群组的 ID
- 以当前组为附加组的用户列表(分隔符为逗号)
[root@c7-1 ~]#cat /etc/group
root:x:0:
bin:x:1:
daemon:x:2:
......
postfix:x:89:
tcpdump:x:72:
syhj:x:1000:syhj
(5)gshadow文件格式
- 群组名称:群组名称同,同 /etc/group 文件中的组名相对应
- 群组密码:对于大多数用户来说,通常不设置组密码,因此该字段常为空,但有时为 “!”,指的是该群组没有组密码,也不设有群组管理员
- 组管理员列表:组管理员的列表,更改组密码和成员
- 以当前组为附加组的用户列表:多个用户间用逗号分隔
[root@c7-1 ~]#cat /etc/gshadow
root:::
bin:::
daemon:::
......
postfix:!::
tcpdump:!::
syhj:!!::syhj
4.用户和组命令管理
用户命令管理 | 组命令管理 |
---|---|
useradd | groupadd |
usermod | groupmod |
userdel | groupdel |
(1)useradd
useradd 命令可以创建新的Linux用户
格式:
useradd [选项] 用户名
参数 | 含义 |
---|---|
-u | 指定用户的 UID 号,要求该 UID 号码未被使用 |
-d | 指定用户的宿主目录(当与 -M 一起使用时失效) |
-e | 指定用户的账号失效时间,可使用 YYYY-MM-DD 的日期格式 |
-g | 指定用户的基本组名(或使用 GID 号) |
-G | 指定用户的附加组名(或使用 GID 号) |
-M | 不建立宿主目录,即使 /etc/login.defs 系统配置中已设定要建立宿主目录 |
-s | 指定用户的登录 shell |
-r | 创建系统用户 CentOS 6之前: ID<500,CentOS 7以后: ID<1000 |
-c | "COMMENT“ 用户的注释信息 |
新建用户的相关文件:
- /etc/default/useradd
- /etc/skel/*
- /etc/login.defs
#创建用户zc,家目录为 /home/zc
useradd -d /home/zc zc
#新建一个用户gem,该用户的登录Shell是/bin/sh,它属于group用户组,同时又属于adm和root用户组,其中group用户组是其主组
useradd -s /bin/sh -g group –G adm,root gem
#创建用户admin,家目录为/admin,主组为wheel,附加组为root
useradd -d /admin -g /wheel -G root admin
#添加系统用户apache,UID为48,所属主组为apache,shell为/sbin/nologin,家目录为/var/www,描述为Apache
useradd -r -u 48 -g apache -s /sbin/nologin -d /var/www -c "Apache" apache
(2)usermod
usermod 命令用来修改用户属性
格式:
usermod [选项] 用户名
参数 | 含义 |
---|---|
-u | 指定新的 UID |
-g | 指定新的主组 |
-e YYYY-MM-DD | 指明用户账号过期日期 |
-d HOME | 新家目录不会自动创建,若要创建新家目录并移动原家数据,同时使用-m选项 |
-G | 新附加组,原来的附加组将会被覆盖;若想保留原有,则要同时使用-a选项 |
-s | 新的默认SHELL |
-l login_name | 更改用户账号的登录名称 |
-L | 锁定用户账户,在/etc/shadow 密码栏的增加 ! |
-U | 解锁用户账户,将 /etc/shadow 密码栏的 ! 拿掉 |
#将用户sam 的登录 Shell 修改为 ksh,主目录改为 /home/z,用户组改为 developer
usermod -s /bin/ksh -d /home/z -g developer sam
#修改 kk 用户的家目录到 /opt 下
useradd kk
mv /home/kk /opt
usermod -d /opt/kk kk
su - kk
(3)userdel
userdel 可删除 Linux 用户
格式:
userdel [选项] 用户名
参数 | 含义 |
---|---|
-f | 强制删除 |
-r | 删除用户家目录和邮箱 |
#删除用户sam在系统文件中(主要是/etc/passwd, /etc/shadow, /etc/group等)的记录,同时删除用户的家目录和邮箱
userdel -r sam
(4)groupadd
groupadd 实现创建组
格式:
groupadd [选项] 组名
参数 | 含义 |
---|---|
-g | 指定新用户组的组标识号(GID) |
-r | 创建系统组,CentOS 6之前: ID<500,CentOS 7以后: ID<1000 |
-o | 一般与-g选项同时使用,表示新用户组的GID可以与系统已有用户组的GID相同 |
#向系统中增加了一个新组 group1,新组的组标识号是在当前已有的最大组标识号的基础上加 1
groupadd group1
#向系统中增加了一个新组 group2,同时指定新组的组标识号是 101
groupadd -g 101 group2
#创建系统组 apache,组标识号为 48
groupadd -g 48 -r apache
(5)groupmod
groupmod 组属性修改
格式:
groupmod [选项] 组名
参数 | 含义 |
---|---|
-n | 将用户组的名字改为新名字 |
-g | 为用户组指定新的组标识号 |
-o | 与-g选项同时使用,用户组的新GID可以与系统已有用户组的GID相同 |
#将组 group2 的组标识号修改为 102
groupmod -g 102 group2
#将组 group2 的标识号改为 10000,组名修改为 group3
groupmod -g 10000 -n group3 group2
(6)groupdel
groupdel 可以删除组
格式:
groupdel [选项] 组名
参数 | 选项 |
---|---|
-f | 强制删除,即使是用户的主组也强制删除组 |
#从系统中删除组 group1
groupdel group1
5.其他常用命令
(1)id
id 命令可以查看用户的UID,GID等信息
格式:
id [OPTIONS] UserName
参数 | 含义 |
---|---|
-u | 显示 UID |
-g | 显示 GID |
-G | 显示用户所属组的 ID |
-n | 显示名称,需配合 ugG 使用 |
[root@c7-1 ~]#id root
uid=0(root) gid=0(root) groups=0(root)
[root@c7-1 ~]#id postfix
uid=89(postfix) gid=89(postfix) groups=89(postfix),12(mail)
(2)su
su: 即 switch user,可以切换用户身份,并且以指定用户的身份执行命令
格式:
su [options...] [-] [user [args...]]
参数 | 含义 |
---|---|
-l | 相当于 su - UserName |
-c | 变更为帐号为 USER 的使用者并执行指令(command)后再变回原来使用者 |
-f | 不必读启动档(如 csh.cshrc 等),仅用于 csh 或 tcsh |
-m / -p | 执行 su 时不改变环境变数 |
#变更帐号为 zc 并改变工作目录至 zc 的家目录
su - zc
#变更帐号为 root 并在执行 ls 指令后退出变回原使用者
su -c ls root
#变更帐号为 root 并传入 -f 参数给新执行的 shell
su -f root
(3)passwd
passwd 可以修改用户密码
格式:
passwd [OPTIONS] UserName
参数 | 含义 |
---|---|
-u | 解锁用户账户,允许使用 |
-l | 锁定用户账户,禁止使用 |
-d | 删除指定用户密码,仅使用用户名可以登录系统 |
-S | 查看用户账户的状态(是否被锁定) |
-f | 强制操作 |
-e | 强制用户下次登录修改密码 |
-n mindays | 指定最短使用期限 |
-x maxdays | 指定最大使用期限 |
-w warndays | 提前多少天开始警告 |
-i | 密码过期后多少天停用账户 |
–stdin | 从标准输入接收用户密码,Ubuntu无此选项 |
#修改 zc 用户的密码
passwd zc
#修改 zc 用户登录密码为 123456
echo "123456" | passwd --stdin zc
#设置 zc 用户下次登录必须修改密码
passwd -e zc
#删除 zc 用户的登录密码
passwd -d zc
#锁定 zc 用户,使其不能登录
passwd -l zc
(4)gpasswd
gpasswd命令,可以更改组密码,也可以修改附加组的成员关系
格式:
gpasswd [OPTION] GROUP
参数 | 含义 |
---|---|
-a | 将user添加至指定组中 |
-d | 从指定附加组中移除用户user |
-r | 删除密码 |
-A / -M | 设置有管理权限的用户列表 |
-R | 限制用户登入组,只有组中的成员才可以用newgrp加入该组 |
#增加组成员
[root@centos8 ~]#groupadd admins
[root@centos8 ~]#id wang
uid=1000(wang) gid=1000(wang) groups=1000(wang)
[root@centos8 ~]#gpasswd -a wang admins
Adding user wang to group admins
[root@centos8 ~]#id wang
uid=1000(wang) gid=1000(wang) groups=1000(wang),1002(admins)
[root@centos8 ~]#groups wang #查看 wang 所属的组
wang : wang admins
[root@centos8 ~]#getent group admins
admins:x:1002:wang
#删除组成员
[root@centos8 ~]#gpasswd -d wang admins
Removing user wang from group admins
[root@centos8 ~]#groups wang
wang : wang
[root@centos8 ~]#id wang
uid=1000(wang) gid=1000(wang) groups=1000(wang)
[root@centos8 ~]#getent group admins
admins:x:1002:
#将多个用户添加到一个组里
[root@c7-2 ~]#gpasswd -M user1,user2,user3 test
[root@c7-2 ~]#cat /etc/group |grep test
test:x:1003:user1,user2,user3
(5)newgrp
newgrp 命令可以临时切换主组, 如果用户本不属于此组,则需要组密码
格式:
newgrp [-] [group]
如果使用 - 选项,可以初始化用户环境
[root@centos8 ~]#gpasswd root #修改 root 组密码
Changing the password for group root
New Password:
Re-enter new password:
[root@centos8 ~]#getent gshadow root #查看 root 组
root:$6$UKK78gqOvw/Ug$exBe4gHUYzSj/Gip0YkXII8RkPca7QGVto6Ws5SFd6lhxxklCsfKqiv1qy
EQZOfGK2WbR7/I.A2.7j1SUGuB91::
[wang@centos8 ~]$newgrp root #在普通用户 wang 下切换主组
Password:
[wang@centos8 ~]$id #可以看到用户 wang 的主组变成了 root,附加组为 wang
uid=1000(wang) gid=0(root) groups=0(root),1000(wang)
[wang@centos8 ~]$getent passwd wang
wang:x:1000:1000:wangxiaochun,IT,110,119,:/home/wang:/bin/bash
[wang@centos8 ~]$touch wang1.txt
[wang@centos8 ~]$ll #创建的文件所属主组为 root
total 0
-rw-r--r-- 1 wang root 0 Dec 18 09:38 wang1.txt
(6)chage
chage 可以修改用户密码策略
格式:
chage [OPTION]... LOGIN
参数 | 含义 |
---|---|
-l | 显示密码策略 |
-d | 更改密码的时间 |
-I(–inactive) | 密码过期后的宽限期 |
-E | 帐号到期的日期,过了这天,此帐号将不可用 |
-m | 密码可更改的最小天数。为零时代表任何时候都可以更改密码 |
-M | 密码保持有效的最大天数 |
-W | 用户密码到期前,提前收到警告信息的天数 |
#可以编辑 /etc/login.defs 来设定几个参数,以后设置口令默认就按照参数设定为准
[root@c7-1 ~]#vim /etc/login.defs
......
PASS_MAX_DAYS 99999
PASS_MIN_DAYS 0
PASS_MIN_LEN 5
PASS_WARN_AGE 7
......
#显示 root 用户的密码策略
chage -l root
#设置密码 60 天后过期
chage -M 60 root
#设置密码过期后过 5 天失效
chage -I 5 root
#下一次登录强制重设密码
chage -d 0 root
#更改 zc 用户的密码策略,最小修改密码天数为 3,最迟修改密码天数为 42,用户密码到期前,提前 14 天收到警告信息,密码过期后的宽限期为 7 天,账号到期时间为 2021-09-09
chage -m 3 -M 42 -W 14 -I 7 -E 2021-09-09 zc
(7)finger
finger命令可以让使用者查询用户信息
如果系统没有这个命令需要安装:yum -y install finger
格式:
finger [options] user[@address]
参数 | 含义 |
---|---|
-s | 单行显示 |
-l | 多行显示 |
[root@c7-1 ~]#finger -s root
Login Name Tty Idle Login Time Office Office Phone Host
root root pts/0 3:08 Aug 6 08:35 (20.0.0.1)
root root pts/1 Aug 6 14:30 (20.0.0.1)
[root@c7-1 ~]#finger -l root
Login: root Name: root
Directory: /root Shell: /bin/bash
On since Fri Aug 6 08:35 (CST) on pts/0 from 20.0.0.1
3 hours 9 minutes idle
On since Fri Aug 6 14:30 (CST) on pts/1 from 20.0.0.1
No mail.
No Plan.
(8)chfn
chfn命令提供使用者更改个人用户信息
格式:
shell>> chfn
示例:
[root@centos7 ~]#chfn wang
Changing finger information for wang.
Name [wang]: wangxiaochun
Office []:it
Office Phone []: 10000
Home Phone []: 11111
(9)chsh
chsh 指定shell,相当于usermod -s
格式:
shell>> chsh
示例:
[root@centos7 ~]#getent passwd wang
wang:x:1000:1000:wangxiaochun,it,10000,11111:/home/wang:/bin/bash
[root@centos7 ~]#chsh -s /bin/csh wang
Changing shell for wang.
Shell changed.
[root@centos7 ~]#getent passwd wang
wang:x:1000:1000:wangsicong,wanda,10000,11111:/home/wang:/bin/csh
[root@centos7 ~]#usermod -s /bin/bash wang
[root@centos7 ~]#getent passwd wang
wang:x:1000:1000:wangsicong,wanda,10000,11111:/home/wang:/bin/bash
(10)users
users 命令用于显示当前登录系统的所有用户的用户列表,每个显示的用户名对应一个登录会话,如果一个用户有不止一个登录会话,那他的用户名将显示相同的次数
[root@c7-1 ~]#users
root root syhj
(11)w
w命令用于显示目前登入系统的用户信息,执行这项指令可得知目前登入系统的用户有哪些人,以及他们正在执行的程序,单独执行 w 指令会显示所有的用户,也可指定用户名称,仅显示某位用户的相关信息。
格式:
w [-fhlsuV] [用户名称]
参数 | 含义 |
---|---|
-f | 开启或关闭显示用户从何处登入系统 |
-h | 不显示各栏位的标题信息列 |
-l | 使用详细格式列表,此为预设值 |
-s | 使用简洁格式列表,不显示用户登入时间,终端机阶段作业和程序所耗费的CPU时间 |
-u | 忽略执行程序的名称,以及该程序耗费CPU时间的信息 |
[root@c7-1 ~]#w
15:06:11 up 1 day, 13:58, 3 users, load average: 0.00, 0.01, 0.05
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
root pts/0 20.0.0.1 08:35 3:28m 0.21s 0.21s -bash
root pts/1 20.0.0.1 14:30 3.00s 0.06s 0.00s w
syhj :0 :0 Thu11 ?xdm? 9:46 0.31s /usr/libexec/gnome-session-binary --session gnome-classic
(12)last
last 命令用于显示用户最近登录信息
格式:
shell>> last [options]
参数 | 含义 |
---|---|
-R | 省略 hostname 的栏位 |
-n num | 展示前 num 个 |
username | 展示 username 的登入讯息 |
tty | 限制登入讯息包含终端机代号 |
[root@c7-1 ~]#last -n 5 -a -i
root pts/1 Fri Aug 6 14:30 still logged in 20.0.0.1
root pts/0 Fri Aug 6 08:35 still logged in 20.0.0.1
root pts/0 Thu Aug 5 21:18 - 00:01 (02:43) 20.0.0.1
syhj :0 Thu Aug 5 11:06 still logged in 0.0.0.0
root pts/2 Thu Aug 5 09:06 - 00:01 (14:55) 20.0.0.1
wtmp begins Fri Jul 23 22:53:44 2021
(13)groups
groups 可查看用户组关系
格式:
groups [OPTION].[USERNAME]...
示例:
[root@c7-1 ~]#groups
root
[root@c7-1 ~]#groups root
root : root
[root@c7-1 ~]#groups syhj
syhj : syhj
(14)groupmems
groupmems 可以管理附加组的成员关系
格式:
groupmems [options] [action]
参数 | 含义 |
---|---|
-g | 更改为指定组 (只有root) |
-a | 指定用户加入组 |
-d | 从组中删除用户 |
-p | 从组中清除所有成员 |
-l | 显示组成员列表 |
#查看有哪些用户属于sales组
[root@rhel7 ~]# groupmems -g sales -l
linda lisa
#从sales组中删除lisa
[root@rhel7 ~]# groupmems -d lisa -g sales
[root@rhel7 ~]# groupmems -g sales -l
linda
#添加用户到组里
[root@rhel7 ~]# id lxj2
uid=1002(lxj2) gid=0(root) groups=0(root)
[root@rhel7 ~]# groupmems -a lxj2 -g sales
[root@rhel7 ~]# id lxj2
uid=1002(lxj2) gid=0(root) groups=0(root),1238(sales)