04 Linux用户和权限管理、Vim命令、文件管理
04 Linux用户和权限管理、Vim命令、文件管理
1、Linux安全模型
资源分派:
- Authentication:认证,验证用户身份
- Authorization:授权,不同的用户设置不同权限
- Accouting:审计,事后行为
在Linux中,当用户登录成功时,系统会自动分配令牌token,包括:用户标识和组成员等信息
3A认证:
又称AAA认证,是一套针对网络设备的网络访问控制策略安全模型
#用于审计的登录日志
#rocky 8.6
cat /var/log/secure
tail /var/log/auth.log
1.1 用户
Linux系统中,每个用户通过User id(UID)来唯一标识的
| 用户类型 | 用户名 | 用户ID(UID) | 作用 |
|---|---|---|---|
| 超级管理员 | root(可改) | 0 | 超级管理员用 |
| 普通用户-系统用户 | 自定义 | 1-499(CentOS6以前),1-999(CentOS7以后) | 给后台程序使用,比如nginx,MySQL等 |
| 普通用户-登录用户 | 自定义 | 500+(CentOS6以前),1000+(CentOS7以后) | 给用户进行交互式登录 |
1.2 用户组(批量管理用户的通用权限)
Linux中可以将一个或多个用户加入用户组中,组就是包含0个或是多个用户的集合,用户组是通过Group ID(GID)来表示的
| 组类型 | 组名 | 组ID(GID) | 作用 |
|---|---|---|---|
| 超级管理员组 | root | 0 | 超级管理员用 |
| 普通用户组-系统组 | 自定义 | 1-499(CentOS6以前),1-999(CentOS7以后) | 给后台用户使用 |
| 普通用户组-普通组 | 自定义 | 500+(CentOS6以前),1000+(CentOS7以后) | 给登录用户使用 |
1.3 用户和组的关系
- 一个用户至少有一个组,也可以有多个组
- 一个组至少有0个用户,也可以有多个用户
- 用户的主要组(primary group):又称私有组,一个用户必须属于且只有一个主组,创建用户时,默认会创建与其同名的组作为主组
- 用户的附加组(supplementary group):又称辅助组,一个用户可以属于0个或多个附加组
- 使用组,可以对用户进行批量管理,你比如对一个组授权,则该组下所有的用户能集成这个组的权限
2、用户和组的配置文件
2.1 用户和组的主要配置文件
- /etc/passwd:用户及其属性信息(名称、UID、主组ID等)【必须掌握】
- /etc/shadow:用户密码及其相关属性
- /etc/group:组及其属性信息
- /etc/gshowdow:组密码及其相关属性

grep命令查看用户or用户组【某些命令就不用记忆了】
grep XX(部分字母) /etc/passwd(具体的文件)
2.2 文件操作
vipw&vigr
#vipw|vigr
#编辑/etc/passwd,/etc/group/,/etc/shadow,/etc/gshadow
#vipw 默认编辑/etc/passwd文件
#vigr 默认编辑/etc/group文件
pwck&grpck
#pwck [options] [passwd [shadow]]
#对用户相关配置文件进行检查,默认检查文件为/etc/passwd
-q|--quiet #只报告错误,忽略警告
-r|--read-only #显示错误和警告,但不改变文件
-R|--root CHEROOT_DIR #chroot到的目录
-s|--sort #通过UID排序项目
#grpck [option][group [gshadow]]
#对用户组相关配置文件进行检查,默认检查文件为/etc/shadow,/etc/gshadow
-r|--read-only #显示错误和警告,但不改变文件
-R|--root CHROOT_DIR #chroot到的目录
-s|--sort #通过UID排序项目
getent
getent passwd|shadow|group|gshadow uname[......]
#根据用户名查看配置项
3、用户和组管理命令【增删改查】
用户管理命令:
- useradd
- usermod【基本不用】
- userdel
组帐号维护命令:
- groupadd
- groupmod
- groupdel
3.1 用户创建
#创建用户之前可以先建组,确保组ID是已知的
useradd -u 336 -g mysql -s /sbin/nologin -d /data/mysql -M -r mysql
-b, --base-dir BASE_DIR # 如果未指定 -d HOME_DIR,则系统的默认基本目录。如果未指定此选项,useradd 将使用 /etc/default/useradd 中的 HOME 变量指定的基本目录,或默认使用 /home。
-c, --comment COMMENT # 加上备注文字。任何文本字符串。它通常是对登录名的简短描述,目前用作用户全名的字段。
-d, --home HOME_DIR # 将使用 HOME_DIR 作为用户登录目录的值来创建新用户。
-D, --defaults # 变更预设值。
-e, --expiredate EXPIRE_DATE # 用户帐户将被禁用的日期。 日期以 YYYY-MM-DD 格式指定。
-f, --inactive INACTIVE # 密码过期后到帐户被永久禁用的天数。
-g, --gid GROUP # 用户初始登录组的组名或编号。组名必须存在。组号必须引用已经存在的组。
-G, --groups GROUP1[,GROUP2,...[,GROUPN]]] # 用户也是其成员的补充组列表。每个组用逗号隔开,中间没有空格。
-h, --help # 显示帮助信息并退出。
-k, --skel SKEL_DIR # 骨架目录,其中包含要在用户的主目录中复制的文件和目录,当主目录由 useradd 创建时。
-K, --key KEY=VALUE # 覆盖 /etc/login.defs 默认值(UID_MIN、UID_MAX、UMASK、PASS_MAX_DAYS 等)。
-l, --no-log-init # 不要将用户添加到 lastlog 和 faillog 数据库。
-m, --create-home # 如果用户的主目录不存在,则创建它。
-M # 不要创建用户的主目录,即使 /etc/login.defs (CREATE_HOME) 中的系统范围设置设置为 yes。
-N, --no-user-group # 不要创建与用户同名的组,而是将用户添加到由 -g 选项或 /etc/default/useradd 中的 GROUP 变量指定的组中。
-o, --non-unique # 允许创建具有重复(非唯一)UID 的用户帐户。 此选项仅在与 -o 选项结合使用时有效。
-p, --password PASSWORD # crypt(3) 返回的加密密码。 默认是禁用密码。
-r, --system # 创建一个系统帐户。
-s, --shell SHELL # 用户登录 shell 的名称。
-u, --uid UID # 用户 ID 的数值。
-U, --user-group # 创建一个与用户同名的组,并将用户添加到该组。
-Z, --selinux-user SEUSER # 用户登录的 SELinux 用户。 默认情况下将此字段留空,这会导致系统选择默认的 SELinux 用户。
#Ubuntu中默认创建
useradd tom
#没有创建家目录
#useradd命令,不同的系统,默认的创建模板不同
cat /etc/default/useradd
#家目录模板【修改此目录后,新创建的用户家目录中的内容会发生改变】
/etc/skel/
新建用户的相关文件
- /etc/default/useradd
- /etc/skel/*
- /etc/login.defs
#批量创建用户
newusers user.txt
cat user.txt
u1:123456:1024:1024::/home/u1:/bin/bash
u2:123456:1025:1025::/home/u2:/bin/bash
3.2 用户信息修改
usermod [OPTIONS] LOGIN
-d #修改家目录
-g #修改组
-L #锁定用户帐号
-s #修改shell
-U #解锁用户帐号
-u #修改UID
-l #新的登录名称
#把登录名tom改成jerry
usermod -c “tom to jerry” -l jerry tom
3.3 删除用户
userdel [OPTIONS] LOGIN
#常见选项
-f|--force #强制删除,哪怕用户正在登录状态
-r|--remove #删除家目录和邮件目录
3.4 修改密码
passwd
#设置用户下次必须更改密码
passwd -e USER
3.5 修改用户密码策略
change USER
3.6 创建组
groupadd [OPTIONS] GROUP
3.7 修改组
groupmod
3.8 删除组
groupdel
#常见选项
-f|--force #强制删除,即使是用户的主组也强制删除组,但会导致无主组的用户不可用无法登录
删除组:如果该组下有用户将组作为主组,则不能删除
删除用户,会把与其同ID的主组也给删了,前提是该组下没有其它用户
3.9 更改组成员和密码
gpasswd命令,可以更改组密码,也可以修改附加组的成员关系
组没有密码的情况下,加组只能由root来操作
gpasswd [OPTION] GROUP
#常见选项
-a #向组中添加用户
-d #从组中移除用户
-r #删除组密码
-R #向其成员限制访问组
-M #批量加组
-A #批量设置组管理员
3.10 更改和查看组成员
groupmens可以管理附加组的成员关系
groupmems [options][action]
-g #更改为指定组(只有root)
-a #指定用户加入组
-d #从组中删除成员
-p #从组中清除所有成员
-l #显示组成员列表
4、文件权限管理
4.1 Linux中的权限体系
三种角色:
| 角色 | 英文表示 | 字符表示 |
|---|---|---|
| 属主:所有者 | owner|OWNER|user | u |
| 属组:属于哪个组 | group|GROUP | g |
| 其他用户:不是所有者,也不在属组中的用户 | other|OTHER | o |
三种权限:
| 权限 | 英文表示 | 字符表示 | 八进制表示 |
|---|---|---|---|
| 读权限 | read|Readable | r | 4 |
| 写权限 | write|Writable | w | 2 |
| 执行权限 | execute|eXcutable | x | 1 |
4.2 文件所有者和属组属性操作
4.2.1 设置文件的所有者chown【用户归属】
chown [OPTION]...[OWNER]:[:[GROUP]]FILE...
#用法说明
OWNER #只修改所有者
OWNER:GROUP #同时修改所有者和属组
:GROUP #只修改数组,冒号也可用.替换
-R #递归操作
#下列选项配合-R使用
-H #如果参数是指向目录的软链接,则之修改指向的目录,不改变目录里面文件的属主属组
-L #更改所有遇到的符号链接指向的目录
-P #不更改符号链接指向的目录
4.3 文件权限
注意:
- 用户的最终权限,是从左向右进行顺序匹配,即,所有者,所属组,其他人,一旦匹配权限立即生效,不再向右查看其权限
- r和w权限对root用户无效,对没有读写权限的文件,root用户也可读可写
- 只要所有者,所属组或other三者之一有x权限,root就可以执行
修改文件权限chmod【后续过程中基本上都会用到】
| 字符表示 | 二进制表示 | 八进制表示 | 备注 |
|---|---|---|---|
| --- | 000 | 0 | 无任何权限 |
| --x | 001 | 1 | 可执行 |
| -w- | 010 | 2 | 可写 |
| -wx | 011 | 3 | 可写可执行 |
| r-- | 100 | 4 | 可读 |
| r-x | 101 | 5 | 可读可执行 |
| rw- | 110 | 6 | 可读可写 |
| rwx | 111 | 7 | 可读可写可执行 |
| 字符表示 | 八进制数字表示 | 备注 |
|---|---|---|
| rw-r----- | 640 | 属主可读写,属组可读,其他用户无任何权限 |
| rw-r--r-- | 644 | 属主可读写,属组可读,其他用户可读 |
| rwxr-xr-x | 755 | 属主可读写,可执行,属组可读可执行,其它用户可读可执行 |
4.4 新建文件和目录的默认权限
在Linux中,新建文件或目录,都有一个默认权限:umask【掩码】
umask值间接影响新建文件和新建目录的权限:
- 新建文件:666-umask,按位对应相减,如果所得结果某位存在执行(奇数)权限,则该位+1
- 新建目录:777-umask
非特权用户umask默认是002
root的umask默认是022
持久保存umask
- 全局设置:/etc/bashrc,/etc/bash.bashrc(ubuntu)
- 用户设置:~/.bashrc
4.5 Linux文件系统上的特殊权限
在Linux中,除了rwx这三种常见的权限之外,还有三个特殊权限,分别是SUID,SGID,Sticky;这三个特殊权限独立于rwx权限体系
特殊权限:
-
SUID:作用于二进制可执行文件上,用户将继承此程序所有者的权限
-
SGID:作用于二进制可执行文件上,用户将继承此程序所有组的权限
- 作用于目录上,此目录中新建的文件的所属组将自动从此目录继承
-
STICKY:作用于目录上,此目录中的文件只能由所有者自己来删除
| 权限 | 字符表示 | 八进制表示 | 备注 |
|---|---|---|---|
| SUID | s | 4 | 如果原属主没有可执行权限,再加SUID权限,则显示为S |
| SGID | s | 2 | 如果原属组没有可执行权限,再加SGID权限,则显示为S |
| STICKY | t | 1 | 如果other没有可执行权限,再加STICKT权限,则显示为T |
4.5.1 特殊权限SUID
前提:进程有属主和数组;文件有属主和属组
- 任何一个可执行程序文件能不能启动为进程,取决于发起者对程序文件是否拥有执行权限
- 启动为进程之后,其进程的属主为发起者,进程的属组为发起者所属的组
- 进程访问文件时的权限,取决于进程的发起者
二进制的可执行文件上SUID权限功能:
- 任何一个可执行程序文件能不能启动为进程:屈居于发起者对程序文件是否拥有执行权限
- 启动为进城之后,其进程的属主为原程序文件的属主
- SUID只对二进制可执行程序有效
- SUID设置在目录上无意义
SUID权限设定:
chomd u+s FILE... #添加权限
chmod 4xxx FILE #添加权限
chmod u-s FILE... #删除权限
意义:普通用户可调用部分命令,以root用户的身份对某些文件进行调整(个人理解)
4.5.2 特殊权限SGID
二进制的可执行文件上SGID权限功能:
- 任何一个可执行程序文件能不能启动为进程:取决于发起者对程序文件是否拥有执行权限
- 启动为进程之后,其进程的属组为原程序文件的属组
SGID权限设定:
chmod g+s FILE...
chmod 2xxx FILE
chomd g-s FILE...
目录上的SGID权限功能:
默认情况下,用户创建文件时,其属组为此用户所属的主组,一旦某目录被设定了SGID,则对此目录有写权限的用户在此目录中创建的文件所属的组为此目录的属组,通常用于创建一个协作目录
SGID权限设定:
chmod g+s DIR...
chmod 2xxx DIR
chmod g-s DIR...
4.5.3 特殊权限Sticky位
具有写权限的目录通常用户可以删除该目录中的任何文件,无论该文件的权限或拥有权
在目录设置Sticky位,只有文件的所有者或root可以删除该文件
sticky设置在文件上无意义
Sticky权限设定:
chmod o+t DIR...
chmod 1xxx DIR
chmod o-t DIR...
4.5.4 特殊权限数字法
| 字符表示 | 二进制表示 | 八进制表示 | 备注 |
|---|---|---|---|
| --------- | 000 | 0 | 无任何特殊权限 |
| --------t | 001 | 1 | Sticky |
| -----s--- | 010 | 2 | SGID |
| -----s--t | 011 | 3 | SGID,Sticky |
| --s------ | 100 | 4 | SUID |
| --s-----t | 101 | 5 | SUID,SGID |
| --s---s-- | 110 | 6 | SUID,SGID |
| --s--s--t | 111 | 7 | SUID,SGID,Sticky |
权限位映射
SUID:user,占据属主的执行权限位
s:属主拥有x权限
S:属主没有x权限
SGID:group,占据属组的执行权限位
s:group拥有x权限
S:group没有x权限
Sticky:other,占据other的执行权限位
t:other拥有x权限
T:other没有x权限
4.5.5 设定文件特殊属性
某些文件可能会出现无法删除的情况,可参考下列命令
chattr [-pRVF] [-v version] files...
#常用选项
-p #设置文件项目编号
-R #递归执行
-V #显示过程,并输出chattr版本
-f #不输出错误信息
-v #设置版本
#操作符
+attribute #添加该属性
-attribute #去掉该属性
=attribute #仅有该属性
#常用属性
e #文件系统自带的
a #对文件:可追加内容,不可被删除,不可被修改,不可被重命名;对目录,可新建,修改文件,但不可删除文件
A #不更新atime,节省IO
c #文件会被压缩保存
i #对文件:不可被删除不可被修改不可重命名;对目录:可修改查看目录中的文件,补课新建文件,不可删除文件
s #彻底删除文件,用0填充原来的数据块
u #防止误删除,这里是指原来存储该文件的块不会被新的数据覆盖
#例如:
chattr +i nihao.txt
#使得该文件不可被删除,不可被修改,不可重命名
chattr -i nihao.txt
#使得该文件可以被删除,可以被修改,可以重命名
显示文件特殊属性
lsattr
4.6 访问控制列表ACL
4.6.1 ACL权限功能
rwx权限体系中,仅仅只能将用户分成三种角色,如果要对单独用户设置额外的权限,则无法完成;
而ACL可以单独对指定的用户设定各不相同的权限;提供颗粒度更细的权限控制;
CentOS7默认创建的xfs和ext4文件系统具有ACL功能
ACL生效顺序
所有者,自定义用户,所属组,自定义组,其他人
4.6.2 ACL相关命令
apt install acl
#使用setfacl可设置ACL权限
#使用getfacl可查看设置的ACL权限
setfacl
#常用选项
-m #修改ACL权限
-M #从文件读取规则
-x #删除文件acl权限
-X #从文件读取规则并删除文件acl规则
-b #删除文件所有acl权限
-k #删除默认acl规则
--set=acl #用新规则替换旧规则,会删除原有ACL项,用心的替代,一定要包含UGO的设置,不像-m一样只有ACL
--set-file=file #从文件读取新规则
--mask #重新计算mask值
-n #不重新计算mask值
-d #在目录上设置默认acl
-R #递归执行
-L #将ACL应用在软链接指向的目标文件上,与-R一起使用
-P #将ACL不应用在软链接指向的目标文件上,与-R一起使用
mask权限
- mask只影响除所有者和other的之外的人和组的最大权限
- mask需要与用户的权限进行逻辑与运算后,才能变成有限的权限(Effective Permission)
- 用户或组的设置必须存在于mask权限设定范围内才会生效
对于脚本程序来讲,必须先要有读权限,才能执行。
5、管理体系
5.1 Selinux
| 系统类别 | 安全管理环境 | 备注 | 一般情况下使用 |
|---|---|---|---|
| Rocky Linux | selinux | 管理的较紧 | 禁用 |
| Ubuntu | apparmor | 管理的较松 | 禁用 |
selinux开启的情况下新建的文件或文件夹,在权限列表的显示当中会有如下的“.”的显示。

关闭selinux之后,新建的文件或文件夹,就没有这个小点点了,但以前新建的文件或文件夹依然存在
#查看selinux是否开启
getenforce
#临时设置selinux开启(1)或关闭(0)
setenforce 1
#永久开启或禁用selinux
vim /etc/selinx/config
SELINUX=disabled
保存,重启生效
5.2 Firewall-防火墙,网络管理相关
#通过服务管理命令关闭防火墙
#禁用服务
systemctl disable firewalld
6、Vim常用命令
#进入编辑模式
i #当前光标的位置进行插入
a #当前光标的位置的后一个位置进行插入
u #撤销之前的操作
#退出编辑模式
Esc
vim nihao.txt +6 #从该文件的第六行开始编辑
vim nihao.txt +/sag/ #从关键字sag所在行开始编辑
#进入vim之后
/bash #搜索bash
#当前命令下,可用/向下搜索,可用?向上搜索
:set cul #增加辅助线,快速判断光标所在行
:set nu #增加行号,快速判断位置
#以分屏的形式同时打开两个文件
vimdiff passwd /etc/hosts
#全部退出
:qall
#范围内容的编辑【可以直接平移到sed命令当中】
#在命令行模式下进行
:
#起始位置,结束位置 动作
#位置的判定:
行号 3,7 #从第3行到第7行
#常见的动作
d #删除
y #复制
p #粘贴
u #撤销
s #替换,格式如下:s/要查找的内容/替换为的内容/修饰符
#s/str/STR/空 -每行只替换第一个匹配的内容
#s/str/STR/g -替换全部匹配的内容
#cp /etc/passwd /root
#vim passwd
#例如:
:5,12 s/nologin/NOLOGIN/ #将第五行到第十二行每行的nologin替换为NOLOGIN
#锚定符号
^ #行首
$ #行尾
gg #首行
G #尾行
:6 #第6行
dd #删除光标所在行
dG #删除光标所在行到尾行
dgg #删除光标所在行到首行
5dd #向下删除5行【包括光标所在行】
6.1 常用属性设置-vimrc
根据自身的习惯对vim进行设置,一次性设置即可,为方便自身以后的工作,建议保存成单独的文件,作为模板直接导入到自己的工作环境中
vimrc在/etc目录下
.vimrc一般在家目录下隐藏,需要自己编辑
7、文件管理
7.1 文件切割
cut命令
cat passwd | cut -d: -f3,4 #将passwd文件中的第3列和第4列文字显示出来
cut -d 分隔符 -f列 #获取部分内容
7.2 排序命令
sort命令
sort -u xx.txt #去除重复行
sort -r xx.txt #降序排列,默认升序
sort -n xx.txt #以数字排序,默认按字符排序
-o xxx.txt #将结果放到新的文件当中去
7.3 统计命令
uniq命令
uniq -ci xx.txt #统计文档内容不要求大小写
sort | uniq
7.4 文件查找
-
实时查找
- 慢
- find
-
离线查找-不是最新的数据-需要数据库的支持
- 快
- locate
7.4.1 locate命令
yum install mlocate
apt install plocate
7.4.2 find命令
#常规find命令,可用find xxx | grep xxx代替
find 路径 -name 名字
-type
-empty
-xxx
find / -name "ni*.txt" #在/目录下查找ni*.txt的文件
find / -type d
#如果不指定查询的目录,默认是当前目录下开始查询
find ./ -size 10k #查找9k~10k以下的文件
find ./ -size -10k #查找10k以下的文件
find ./ -size +10k #查找10k以上的文件
find ./ -name "ni*.txt" -print0 #不换行输出,常用于配合xargs
find ./ -name "ni*.txt" -exec cp {} {}-bak \; #在当前目录下查询到符合ni*.txt的文件后,执行cp命令,拷贝并在所有的文件后加上后缀-bak
-ok #ok表明每一个程序执行后都需要人为确定
find ./ -name "ni*.txt" | xargs rm -f #在当前目录上查询到符合ni*.txt的文件后,强行删除查询到的文件
7.5 过滤信息-grep
#以复制过来的passwd文件为基准进行实验
grep -i user passwd #对passwd不区分大小写的信息过滤
grep -in user passwd #对passwd不区分大小写的信息过滤并且显示行号
#grep的多条件可使用-E来组合条件
grep "条件a|条件b"
grep -Ev #一般情况下用来检查配置
7.6 打包命令
tar [OPTION] [FILE]
#压缩包
tar zcvf 压缩包名 待压缩的文件
#看压缩包
tar tvf 压缩包名
#解压压缩包
tar xf 压缩包名
#解压到其他的目录下
tar xf 压缩包名 -C 其他目录
#使用unzip命令解压到指定目录
unzip -d 压缩包名 其他目录
浙公网安备 33010602011771号