用户基本概述
什么是用户
用户指的是能够正常登录linux或windows系统,比如:登录QQ的用户、登录华为的用户等等
为什么需要用户
- 系统上的每一个进程(运行的程序),都需要一个特定的用户运行
- 通常在公司是使用普通用户管理服务器,因为
root权限过大,容易造成故障
用户有哪些分类
- 系统对用户有一个约定
| 用户UID | |
|---|---|
| 0 | 超级管理员,最高权限,有着极强的破坏能力 |
| 1~200 | 系统用户,用来运行系统自带的进程,默认已创建 |
| 201~999 | 系统用户,用来运行用户安装的进程,所以此类用户无需登录系统 |
| 1000+ | 普通用户,正常可以登录系统的用户,权限比较小,能执行的任务有限 |
查询用户ID信息
- 使用
id命令查询当前登录用户的信息
# id # 查看当前所登录的用户信息
uid=0(root) gid=0(root) 组=0(root)
# id www # 查看其他用户的信息
uid=666(www) gid=666(www) 组=666(www)
用户相关配置环境
- 当我们创建一个新的用户,系统会将用户的信息存放在
/etc/passwd中,而密码单独存储在/etc/shadow中,也就是说这两个文件非常的重要,不要轻易删除与修改
passwd文件
/etc/passwd配置文件解释如下图,或者使用命令man passwd获取帮助

shadow文件
/etc/shadow配置文件解释如下图,或者使用命令man shadow获取帮助

用户相关命令
添加用户useradd
若想要添加linux系统普通用户,可以使用useradd命令,使用root账户登录linux之后就可以添加系统普通用户了
| 选项 | 功能描述 |
|---|---|
| -u | 指定要创建用户的UID,不允许冲突 |
| -g | 指定要创建用户基本组 |
| -G | 指定要创建用户附加组,逗号隔开可添加多个附加组 |
| -d | 指定要创建用户家目录 |
| -s | 指定要创建用户的bash shell |
| -c | 指定要创建用户的注释信息 |
| -M | 给创建的用户不创建家目录 |
| -r | 创建系统账户,默认无家目录 |
添加用户示例1
- 创建
blue用户- 用户ID为
6969 - 基本组为
ops,附加组dev - 注释信息
2000 new student,登录shell:/bin/bash
- 用户ID为
groupadd ops
groupadd dev
useradd -u 6969 -g ops -G dev -c "2000 new student" -s /bin/bash/ bule
添加用户示例2
- 创建一个
mysql系统用户- 该用户不需要家目录
- 该用户不需要登录系统
useradd -r mysql -M -s /sbin/nologin
修改用户usermod
若要修改linux系统普通用户,可以使用usermod命令,使用root账号登录linux系统之后就可以修改系统普通用户了。
| 选项 | 功能描述 |
|---|---|
| -u | 指定要修改用户的UID |
| -g | 指定要修改用户基本组 |
| -G | 指定要修改用户附加组,逗号隔开可添加多个附加组,覆盖原有的附加组 |
| -d | 指定要修改用户家目录 |
| -s | 指定要修改用户的bash shell |
| -c | 指定要修改用户的注释信息 |
| -l | 指定要修改用户的登录名 |
| -L | 指定要锁定的用户 |
| -U | 指定要解锁的用户 |
修改用户示例1
- 修改
blue用户uid为5008,- 基本组为
network,附加组为ops,dev,sa - 注释信息为
student,登录名称为new_bule
groupadd network
usermod blue -c "student" -g network -G ops,dev,sa -l new_bule
修改用户示例2
- 修改
new_blue用户- 为
new_blue配置密码 - 锁定该用户,然后测试远程连接登录
- 解锁该用户然后再次测试远程连接登录
awk -F : '$3>=1000 {print $1}' /etc/passwd | sed -r 's#(.*)#userdel -r \1#g' | bash
- 为
echo "123" | passwd --stdin new_blue
usermod -L new_blue
usermod -U new_blue
删除用户userdel
若想要删除linux系统普通用户,可以使用userdel命令,使用root账号登录linux系统之后就可以删除系统普通用户了
删除用户示例1
- 删除
new_bule用户- 连同家目录一起删除
userdel -r new_blue
删除用户示例2
- 批量删除系统中此前创建过的所有无用的用户
- 使用
awk提取无用的用户名称 - 使用
sed拼接删除用户的命令 - 调用
userdel命令,连同家目录一起全部删除
- 使用
awk -F : '$3>=1000 {print $1}' /etc/passwd | sed 's/^/userdel -r /' | bash
设定密码passwd
- 创建用户后,如需要使用该用户进行远程登录系统则需要为用户设定密码,设定密码使用
passwd- 普通用户只允许变更自己的密码,无法修改其他人密码,并且密码长度必须8位字符
- 管理员用户允许修改任何人的密码,无论密码长度多长或多短
- 注意:为普通用户设定密码,普通用户才可以正常登录系统
- 普通用户不可以变更系统的状态;(权限不够)
- 如果将软件|系统的权限分配给该普通用户,普通用户才可以变更相应配置状态
交互设定密码
- 通过交互方式为用户设定密码
password # 给当前用户修改密码
passwd root # 给root用户修改密码
passwd blue # 给blue用户修改密码,普通用户只能修改自己的
非交互设定密码
- 非交互设定简单密码
echo "123" | passwd --stdin root
- 非交互式设定随机密码
yum install expect
echo $(mkpasswd -l 10 -d 2 -c 2 -C 2 -s 4) | tee pass.txt | passwd --stdin blue
系统创建用户流程
- 系统在创建用户时,会参考如下两个配置文件
/etc/login.defs/etc/default/useradd
- 如果在创建用户时指定了参数则会覆盖系统默认的配置,如果没有指定参数则遵循默认配置建立用户
/etc/login.defs
/etc/login.defs主要定义了创建用户时UID划分规则,密码加密类型,是否创建家目录等
grep -Ev "^#|^$" /etc/login.defs
MAIL_DIR /var/spool/mail
PASS_MAX_DAYS 99999
PASS_MIN_DAYS 0
PASS_MIN_LEN 5
PASS_WARN_AGE 7
UID_MIN 1000
UID_MAX 60000
SYS_UID_MIN 201
SYS_UID_MAX 999
GID_MIN 1000
GID_MAX 60000
SYS_GID_MIN 201
SYS_GID_MAX 999
CREATE_HOME yes
UMASK 077
USERGROUPS_ENAB yes
ENCRYPT_METHOD SHA512
/etc/default/useradd
/etc/default/useradd主要定义- 创建家目录位置
- 默认用户的
shell类型 - 默认从哪个位置拷贝环境变量
- 是否创建用户同名邮箱等
cat /etc/default/useradd
# useradd defaults file
GROUP=100
HOME=/home # 把用户的家目录建在/home
INACTIVE=-1 # 是否启用账号过期停权,-1表示不启用
EXPIRE= # 账号终止日期,不设置表示不启用
SHELL=/bin/bash # 新用户默认所用的shell类型
SKEL=/etc/skel # 配置新用户家目录的默认文件存放路径
CREATE_MAIL_SPOOL=yes # 创建mail文件
用户环境变量丢失案例
当我们不小心在当前用户家目录下执行rm -rf .*后,再次登录系统会发现提示符变成了-bash-4.1$,那是因为我们删除了当前用户的环境变量造成的现象,通过如下方式则可恢复
-bash-4.1$ cp -a /etc/skel/.bash* ./
-bash-4.1$ exit
默认linux创建用户,会从/etc/skel目录中拷贝对应的环境变量,由/etc/default/useradd配置文件定义,所以只需从该目录中拷贝相应的环境变量文件即可恢复故障
用户组基本概述
什么是用户组
- 组是一种逻辑层面的定义
- 逻辑上将多个用户归纳至一个组,当我们对组操作,其实就相当于对组中的所有用户进行操作
组有几种类别
- 对于用户来说,组分为如下几类
- 默认组:创建用户不指定组,则默认创建与用户同名的组
- 基本组:用户有且只能有一个基本组,创建时可通过
-g指定(亲爹) - 附加组:用户可以有多个附加组,创建时通过
-G指定(干爹)
group文件
/etc/group配置文件解释如下:
gshadow文件
/etc/gshadow配置文件解释如下:

用户组相关命令
添加组groupadd
若想要添加linux用户组,可以使用groupadd命令,使用root账号登录linux系统之后就可以添加用户组了
| 选项 | 功能描述 |
|---|---|
| -f | 如果组已经存在,会提示成功创建的状态 |
| -g | 为新组设置GID,若GID已经存在会提示GID已经存在 |
| -r | 创建一个系统组 |
添加组示例1
- 添加一个
salary的组- 为组设定
gid为10000
- 为组设定
groupadd salary -g 10000
tail -1 /etc/group
salary:x:10000:
添加组示例2
- 添加一个
salary_2的组- 添加为系统组
groupadd -r salary_2
tail -1 /etc/group
salary_2:x:988:
修改组groupmod
若想要修改linux用户组,可以使用groupmod命令,使用root账号登录linux系统之后就可以修改用户组了
| 选项 | 功能描述 |
|---|---|
| -f | 如果组已经存在,会提示成功创建的状态 |
| -g | 为新组设置GID,若GID已经存在会提示GID已经存在 |
| -r | 创建一个系统组 |
| -n | 改名为新的组 |
修改组示例1
- 修改
salary用户组组名为system
groupmod -n system salary
tail -1 /etc/group
system:x:10000:
修改组示例2
- 修改
system用户组GID为5000
groupmod system -g 5000
tail -1 /etc/group
system:x:5000:
删除组groupdel
若想要删除linux用户组,可以使用groupdel命令,使用root账号登录linux系统之后就可以删除用户组了
删除组示例1
- 删除
salary_2系统用户组
groupdel salary_2
删除组示例2
- 创建
tom用户,设置基本组为system,然后测试删除system组
useradd tom -g system
groupdel system
groudel:cannot remove the primary group of user 'tom'
# 如果组中存在用户是无法删除该组的,必须先删除用户后再删除组
userdel -r tom # -r选项表示在删除用户的同时删除用户的家目录。
groupdel system
用户与用户组场景
- 1.创建
dev与ops两个组 - 2.创建
bob用户,设定基本组为dev,密码为123 - 3.创建
alice用户,设定基本组为ops,密码为123 - 4.创建
/opt/resource文件,然后修改属组为ops、权限为664 - 5.测试发现
alice用户可以读写,而bob用户仅可以查看 - 6.现在希望
bob也能够对文件进行读写,如何快速实现(为bob添加ops附加组)
-
创建组与用户
groupadd dev groupadd ops useradd bob -g dev useradd alice -g ops -
为用户设定登录密码
echo "123" | passwd --stdin bob echo "123" | passwd --stdin alice -
建立文件,然后分配好权限
echo "data" > /opt/resource chgrp ops /opt/resource chmod 664 /opt/resource -
使用
ops组的alice用户测试读和写权限,没有任何问题echo "alice-data" >> /opt/resource cat /opt/resource data alice-data -
使用
dev组的bob用户测试读和写权限,发现只有读权限,没有写权限echo "bob-data" >> /opt/resource -bash: /opt/resource:权限不够 cat /opt/resource data alice-data -
为
bob用户添加ops附加组,这样bob用户就能借助ops组权限,实现读写操作usermod bob -G ops id bob uid=1002(bob) gid=2020(dev) groups=2020(dev),2021(ops) -
再次测试,发现
bob用户能借助ops组实现读和写操作echo "bob-data" >> /opt/resource cat /opt/resource data alice-data bob-data
普通用户无权限如何提权
往往公司的服务器对外都是禁止root用户直接登录,所有我们通常使用的都是普通用户,那么问题来了,当我们使用普通用户执行/sbin目录下的命令时,会发现没有权限,这种情况会造成无法正常管理服务器,那如何才能不使用root用户直接登录系统,同时又保证普通用户能完成日常工作呢?
- 我们可以使用如下两种方式:
su、sudosu switch user身份切换,使用普通用户登录,然后使用su命令切换到root- 优点:简单
- 缺点:需要知道
root密码
sudo提权,当需要使用root权限进行提权,而无需切换至root用户- 优点:安全、方便
- 缺点:需要预先定义规则,较为复杂
su命令身份切换
- 使用
su命令可以实现身份的快速切换
su切换身份
su - username切换身份【属于登录式shell】su username切换身份【属于非登录式shell】
-
普通用户使用
su切换到root用户,需要输入root超级管理员密码[test@wordpress ~]$ su - root 密码: [root@wordpress ~]# pwd /root -
以某个用户的身份执行某个服务,使用命令
su -c username[root@wordpress ~]# su - test -c 'ls ~ -a' . .. .bash_history .bash_logout .bash_profile .bashrc
Shell登录分类
- 登录
shell:需要输入用户名和密码才能进入 - 非登录
shell:不需要输入用户名和密码就能进入shell,比如运行bash会开启一个新的会话 - 登录式
shell与非登录式shell,它们最大的区别就在于加载的环境变量不一样- 登录式
shell配置文件加载顺序:/etc/profile->/etc/profile.d/*.sh->~/.bash_profile->~/.bashrc->/etc/bashrc - 非登录式
shell配置文件加载顺序:/.bashrc->/etc/bashrc->/etc/profile.d/*.sh
- 登录式
环境变量配置文件
profile类文件:设定环境变量,登录前运行的脚本和命令bashrc类文件:设定本地变量,定义命令别名- 用户配置文件:
~/.bash_profile~/.bashrc
- 全局环境变量:
/etc/profile/etc/profile.d/*.sh/etc/bashrc
sudo命令提权
sudo的由来
su命令在用户身份切换时,需要拿到root管理员密码,在多人协作时,如果当中某个用户不小心泄露了root密码,那系统会变得非常不安全,为了改进这个问题,从而就有了sudo
其实sudo就是给某个普通用户埋下了浩克hulk的种子,当需要执行一些特权操作时,进行发怒,获取最高权限,但正常情况下还是普通用户,仍然会收到系统的约束以及限制
sudo快速起步
- 快速配置
sudo方式- 将用户加入
wheel组,默认wheel组有sudo权限
usermod xxx -G wheel
- 将用户加入
-
切换到普通用户身份
su - xxx -
普通用户正常情况下无法删除
/opt目录rm -rf /opt/ rm:cannot remove /opt:Permission denied -
使用
sudo提权,然后输入普通用户密码,会发现能正常删除无权限的/opt目录
sudo rm -rf /opt/ -
后期可以通过审计日志查看普通用户提权都执行了什么操作
tail -f /var/log/secure
sudo权限分配
- 通过快速提权的方式,我们会发现通过
sudo什么操作都可以执行,能否有办法限制仅开启某个命令的使用权限,其他命令不允许 - 实现架构图如下
- 用户-->组-->命令集
-
创建用户,并为用户设定对应的密码
useradd ops1 useradd ops2 useradd dev1 useradd dev2 echo "1" | passwd --stdin ops1 echo "2" | passwd --stdin ops2 echo "1" | passwd --stdin dev1 echo "1" | passwd --stdin dev2 -
在
/etc/sudoers文件中配置规则visudo # vim /etc/sudoers # 使用sudo定义的逻辑分组,则个和系统group没关系 User_Alias OPS = ops1,ops2 User_Alias DEV = dev1,dev2 # 将相同命令逻辑上划分为一个命令集 Cmnd_Alias NETWORKING = /sbin/ifconfig,/bin/ping Cmnd_Alias SOFTWARE = /bin/rpm,/usr/bin/yum Cmnd_Alias SERVICES = /sbin/service,/usr/bin/systemctl start Cmnd_Alias STORAGE = /bin/mount,/bin/umount Cmnd_Alias DELEGATING = /bin/chown,/bin/chmod,/bin/chgrp Cmnd_Alias PROCESSES = /bin/nice,/bin/kill,/usr/bin/kill,/usr/bin/killall # 进行权限划分,为OPS/DEV组分配对应的命令集名称 OPS ALL=(ALL) NETWORKING,SOFTWARE,SERVICES,STORAGE,DELEGATING,PROCESSES DEV ALL=(ALL) SOFTWARE,PROCESSES -
然后登录对应的用户检查相应的
sudo权限# 检查ops1用户sudo权限 sudo -l password for osp1: user ops1 may run the following commands on wordpress: (ALL) /sbin/ifconfig,/bin/ping,/bin/rpm,/usr/bin/yum,/sbin/service,/usr/bin/systemctl start,/bin/mount,/bin/umount,/bin/chown,/bin/chmod,/bin/chgrp,/bin/nice,/bin/kill,/usr/bin/kill,/usr/bin/killall
sudo执行流程
sudo命令执行流程如下- 普通用户执行
sudo命令时,会检查/var/db/sudo是否存在时间戳缓存 - 如果存在则不需要输入密码,否则需要输入用户与密码
- 输入密码会检测该用户是否有该权限
- 如果有则执行,否则报错退出
- 普通用户执行

sudo不支持系统内置命令
sudo相关练习
-
授予
jack用户能通过sudo执行ls,sed,awk命令权限
jack All=(ALL) /bin/ls,/bin/sed,/bin/awk -
授予
alice用户sudo执行linux所有命令并且不用输入密码
alice ALL=(ALL) NOPASSWD:ALL -
授权
blue用户,sudo执行passwd命令修改任何用户的密码,但唯独不能修改root用户的密码
blue ALL=(ALL) /bin/passwd [a-z]*,!/bin/passwd root
留言