Linux基础-文件权限

作者:

在

文件管理前置基础知识

image-20260715194729459

image-20260715195027375

浏览器本质

浏览器不管怎么变都是用的chrome的开源内核,然后套皮,内核都一样的所以就用edge或者chrome就行了


命令行与操作系统系统调用交互的本质

image-20260715200935250


image-20260715201201126

==总结==

Linux交互本质

image-20260715201645272


image-20260715202527575

命令行与shell

命令行和脚本并非两个割裂的工具,而是同一个Shell语言在时间维度上的前后衔接:

  • 命令行 = 实时调试(Debugging)平台:
    当你面对一个复杂任务(比如批量重命名、日志过滤)时,你不会直接去写一个几十行的脚本——因为那样效率太低,且一旦报错难以定位。你的第一反应是在命令行里逐条敲击指令,实时观察每一条的输出结果。这个过程中,你其实是在利用命令行的即时反馈机制,对参数、管道、正则表达式进行现场调试。发现不对,立刻按上箭头修改重试,直到这一条指令的输出完全符合预期。
  • 脚本 = 调试结果的固化(Solidification):
    当你在命令行中成功调试出那几条关键的指令后,你按 Ctrl+C 清屏,然后输入 vim script.sh。你把刚才在命令行中验证通过的指令逐条粘贴进去,并加上必要的 if 判断或 for 循环。这个动作就是固化——把你通过调试获得的、正确的“单条指令碎片”,组装成一个永久保存的、可重复执行的“自动化流程”。

定义“调试”和“固化”在Linux交互中的角色

环节 核心动作 本质意义
调试(命令行) 手敲 → 看输出 → 改参数 → 再看输出 利用交互式的试错环境,将不确定的语法和参数调整为确定正确的状态
固化(脚本) 复制粘贴 → 保存 → 赋予执行权限 → 定时/触发执行 将调试成功的瞬时操作,转化为持久的文本资产,脱离人工干预

总结(结合调试与固化)

命令行是Shell语言的“调试器”——它提供即时反馈,让你在现场反复测试、修正单条指令的逻辑和参数,直到结果无误。

Shell脚本是命令行调试成果的“固化容器”——它将你在命令行中反复调试通过的指令集合,以文本文件的形式永久保存,并赋予自动化执行的能力(如定时任务、开机自启)。

两者的协作流程:在命令行中调试 → 确认指令正确 → 粘贴进脚本固化 → 重复使用无需再调试。命令行是“草稿纸”,脚本是“正式出版文档”。

==总结==:

image-20260724082714340

image-20260724082836232


VMware 软件

image-20260715221200542


image-20260715221312554


虚拟机网络连接模式

image-20260716135722236

VMware软件创造虚拟机和ISO(镜像源文件)关系






VMware 提供”硬件舞台”,ISO 提供”系统剧本”。







  1. ISO在VMware里的挂载什么意思 ?

挂载 ISO 就是把那个 .iso文件虚拟成一张光盘,塞进虚拟机的光驱(CD/DVD)里。

挂载成功的标志(两个复选框必须同时满足):

​ ✅ “已连接” — 相当于光盘已经塞进光驱里了。

​ ✅ “启动时连接” — 相当于开机时光驱是通电可读的。

如果只设了ISO路径但没勾这俩,虚拟机开机时根本不知道光驱里有盘,就会直接跳过光驱去尝试网络启动。

  1. 启动顺序决定了先读谁

虚拟机的 BIOS 里有个启动顺序(Boot Order),告诉它开机先检查哪个设备:

光驱(CD-ROM)→ 硬盘(Hard Disk)→ 网卡(Network)

  • 顺序正常 → 先读光驱,发现有ISO → 开始安装系统。
  • 光驱没盘或没连接 → 跳转到硬盘(空的)→ 跳转到网卡(找不到PXE服务器)→ 最终报错 “Operating System not found”。

你之前所有问题的根源,就是光驱被跳过了,所以一路走到网卡然后失败。


虚拟机快照

快照的创建

在创建快照的时候,一定要关机了以后再拍摄快照,不要在开机的状态下创建快照。

关机命令:

poweroff

创建快照:

在上方点击虚拟机,找到快照,拍摄快照,然后起个名字,最后点击拍摄快照。我们的快照就创建好了

image-20260716213223221

image-20260716213358944

快照的使用

如果我们想要回复到某一个快照的时候,我们还是在上方虚拟机,快照,然后选择恢复到快照即可。

image-20260716213542400

远程管理Linux服务器

通过电脑远程连接服务器进行管理,所以我们在后续学习的时候,为了方便,全部使用远程连接。

Linux 远程连接命令行工具有很多:







首先查看虚拟机的IP地址,也就是 Linux 服务器的 IP 地址,登录进虚拟机之后输入ip address可以查看

image-20260716213930883

这边可以看到本次安装的 RockyLinux 操作系统获取到的IP地址是 192.168.88.103 每个人装的虚拟机获取的 IP 地址可能是不一样的,需要仔细看清楚。

在连接之前,我们需要在 RockyLinux 上设置一下,让它允许通过 root 用户远程连接进来

[root@localhost ~]# echo "PermitRootLogin yes" >> /etc/ssh/sshd_config
[root@localhost ~]# systemctl restart sshd

image-20260717091113617

image-20260717091221855

两个网卡功能

网卡全程作用判断标准通信标准
lo环回网卡(Loopback)检验本机 TCP/IP 协议栈是否完整、内核网络功能是否正常ping 127.0.0.1 通 → 内核网络模块 OK仅限于本机内部,不经过任何物理线路
ens160物理网卡(或虚拟物理网卡)提供本机与外部的网络通信能力(连接局域网、路由器、互联网)ping 网关 通→ 网卡驱动、IP配置、物理链路 OK本机 ↔ 外部世界(其他电脑、路由器、互联网)

MobaXterm

MobaXterm = 黑框框(命令行) + 文件管理器(可视化),让你在 Windows 上操作 Linux 服务器时,既有“键盘侠”的功力,又有“鼠标党”的便利。虚拟机本身还是那个纯命令行的 Linux,但你的操作体验已经从“纯盲打”升级成了“半图形化”。


==总结==

远程操作 Linux 服务器,本质上是基于 TCP/IP 网络,通过 SSH 协议(Secure Shell)建立一条加密的命令行通道,利用 IP 地址在互联网中定位到目标主机,利用 端口号(SSH 默认是 22)找到主机上对应的 SSH 服务进程,最后以用户名和密码(或密钥)作为身份凭证,完成远程登录和操作的过程。

需要注意的是:SSH 和 HTTP/HTTPS 是平级关系,它们都是运行在 TCP/IP 协议之上的应用层协议,只是分工不同——SSH(端口 22)负责加密的远程命令行交互,HTTP/HTTPS(端口 80/443)负责网页数据传输。它们是“兄弟”关系,而非“父子”关系。因此,“SSH 是基于 HTTP 的”这种说法是错误的。

至于“同 IP 不同端口对应不同功能”的理解,完全正确。一台服务器只有一个 IP 地址,但可以开放多个端口,每个端口背后运行着不同的服务(如 22→SSH,80→Web,3306→MySQL),通过指定不同端口号,就能访问同一台服务器上的不同功能。

Linux命令行

初识shell

Shell 是系统的用户界面,提供了用户与内核进行交互操作的一种接口。它接收用户输入的命令并把它送入内核去执行。实际上 Shell 是一个命令解释器,它解释用户输入的命令并且把用户的意图传达给内核。(可以理解为用户与内核之间的翻译官角色)

image-20260717102302355

我们可以使用 Shell 实现对Linux系统的大部分管理,例如:

  • 文件管理
  • 用户管理
  • 权限管理
  • 磁盘管理
  • 软件管理
  • 网络管理

使用 Shell 的两种方式

  • 交互式命令行
    默认等待用户输入命令,输入一行回车后执行一行命令
    适合少量的工作
  • Shell 脚本
    将需要执行的命令和逻辑判断语句都写入一个文件后执行该文件
    适合完成复杂,重复性工作

==总结==:我们用的就是bashshell,首个命令都是应用程序,后面是参数


文件系统管理

讲解以课件为核心,重点:

​ ● linux系统路径特点,相对路径和绝对路径

​ ● 文件系统操作命令

image-20260717190604804

创建文件项目先都放在以/root目录的路径下

image-20260717191430002

==总结==:~ 代表/root目录


常用命令

Linux 常见命令比较多,这边只列出初学者最常用的部分命令,大家可以根据命令有意去进行练习。

注意 Linux 会准确的识别出命令的大小写,所以大家需要注意大小写的问题。命令选项和参数之间是用空格进行分隔,请大家在输入的时候注意不要缺失空格。

学习 Linux 最重要的就是以下三个方面

  1. 命令的积累
  2. 原理的掌握
  3. 大量的实战

命令大全

分类命令**(*低频)**核心作用最高频参数工作中最典型的实例
基础操作ls列出当前目录内容-alh 由三个分开的参数组合成 -a 就是参数als -alh # 以人类可读大小显示当前目录所有文件详情
cd切换目录cd /var/log/ # 切换到日志目录 ; cd .. # 回到上级目录 ; cd # 直接回家目录
pwd显示当前路径pwd # 输出如 /home/user/project,确认自己在哪
clear清屏clear # 或直接按 Ctrl+L,让屏幕变干净
echo打印输出内容-eecho “Hello Linux” # 输出字符串 ,echo $PATH # 查看环境变量值
poweroff关机poweroff # 关闭服务器(虚拟机里常用)
reboot重启reboot # 重启服务器
whoami查看当前用户名whoami # 输出 root 或普通用户名
history查看历史命令-c 数字history 10 #显示最近执行过的10条命令
help查看内置命令帮助help cd # 查看 cd 命令的用法(针对bash内置命令)
man查看命令手册man ls # 打开ls的完整手册,按 q 退出
文件系统管理touch创建空文件/更新时间戳touch app.log # 创建一个空日志文件
mkdir创建目录-pmkdir -p project/src/main # 一次性创建多级目录
cp复制文件/目录-r -icp -r /etc/nginx/ ./backup/ # 递归复制整个nginx目录到当前目录下的backup
mv移动/重命名文件-imv app.log app_old.log # 重命名日志文件mv app.log /tmp/ # 移动文件到/tmp
rm删除文件/目录-r -f -rfrm -rf /tmp/cache/ # 强制删除cache目录(此操作不可恢复!)rm app.log # 删除单个文件
cat查看完整文件内容-ncat -n /etc/hosts # 显示hosts文件内容并带行号
tail查看文件尾部-f -ntail -f /var/log/nginx/access.log # 极高频:实时滚动查看nginx访问日志
less(*)分页查看文件,极快加载超大文件less /var/log/messages # 分页查看系统日志,按空格翻页,按/搜索
head(*)查看文件头部-nhead -n 3 /etc/passwd # 查看passwd文件前3行
grep搜索文本内容-v -E -Agrep “ERROR” app.log # 在日志中找所有ERROR行grep -v “^#” /etc/nginx/nginx.conf # 排除注释行看有效配置
unzip解压 .zip 文件-dunzip web.zip -d /var/www/html/ # 解压到指定目录
zip压缩成.zip文件-rzip -r mydir.zip myfolder/ # 递归压缩myfolder文件为mydir.zip文件
tar打包/解压 .tar.gz-czvf -xzvf -tftar -czvf backup.tar.gz /var/log/ # 打包压缩日志目录tar -xzvf backup.tar.gz # 解压tar -xzvf backup.tar.gz -C /root/backup #解压到指定目录
文本编辑vim / vi终端文本编辑器vim /etc/hosts # 打开配置文件按 i 编辑 → 按 Esc → 输入 :wq 保存退出放弃修改按 :q!
nano(*)简单文本编辑器nano ~/.bashrc # 用nano编辑环境变量文件底部有快捷键提示:^X退出,^O保存
文件下载curl发送HTTP请求/下载-O -o -Lcurl -O https://example.com/file.zip # 下载并保持原名curl -L -o nginx.tar.gz https://nginx.org/download/nginx-1.24.0.tar.gz # 跟随重定向下载并指定文件名
wget下载文件-O -c -qwget https://example.com/bigfile.iso # 最直接下载wget -c https://example.com/bigfile.iso # 断点续传(下载中断后继续)
环境变量alias给命令起别名-palias ll=’ls -lh’ # 以后输入ll等价于ls -lhalias rm=’rm -i’ # 让rm删除前先确认which ll # 可以反向查看ll的构成
key=value [cmd]临时增加环境变量
PATH可执行文件搜索路径echo $PATH # 查看当前PATH路径export PATH=$PATH:/opt/myapp/bin # 临时添加新路径到PATH
bashrc等用户环境配置文件vim ~/.bashrc # 编辑用户环境配置source ~/.bashrc # 让配置立即生效
/usr/bin系统命令存放目录which ls # 查看ls命令实际位置,通常输出 /usr/bin/ls
export变量给子进程# 导出为环境变量export MY_NAME=”张三”# 现在子shell就能看到了bash -c ‘echo $MY_NAME’ # 输出:张三
source在当前脚本执行命令常用于让 ~/.bashrc 中配置立即执行
which查看命令完整路径which ll
whereis查看命令位置whereis ip

==总结==:

  1. 参数就学固定组合就行,不用管小的遇到了问 ai
  2. man有用,查看命令手册,手册是详细介绍内容的,介绍查看的是什么
# 为了让别名永久生效,可以将修改别名的命令写入 bashrc 文件,这个文件中的命令会在每次登陆命令行的时候执行
[root@localhost ~]# echo "alias wl='ip address'" >> /.bashrc

在 Linux shell 中,>> 是追加重定向操作符,用于将命令的输出(标准输出)追加到指定文件的末尾,而不会覆盖原有内容

日常使用中,>> 非常常见,尤其是需要保留历史记录时,用它就对了

image-20260717194313651

==注意==: /.bashrc是当前用户交互式 Bash Shell 的首选永久配置阵地。把别名、环境变量、函数写在这里,每次打开终端都会自动加载,且无需 sudo权限,只影响你自己。

  1. 文件操作
  • 蓝色就是文件夹 ;白色就是文件
  • 在project文件夹里创建文件,项目

image-20260717195503457

image-20260717200141030

  1. 复制文件

image-20260717200029148

  1. 复制文件到别的文件夹

image-20260717200627865

image-20260717200716035

==注意==:-r可以递归复制,而linux快捷键直接把要复制的文件夹和里面的嵌套的都复制的,linux需要递归复制

  1. 一次创建多个目录(文件夹)

image-20260717201122379

image-20260717201215914

[root@localhost ~]# mkdir /home/dir{1,2}
  1. mv (移动和重命名文件,目录)

image-20260717201759656

  1. cat 查看文件/程序详细内容

image-20260717202147741

  1. head和tail,tail非常重要

image-20260717202927285

image-20260717203002714

  1. grep过滤和文件结合

image-20260717203606726

  1. wget和curl

image-20260717204400776

image-20260717204455328

image-20260717204559685

配置golang语言环境

  1. linux压缩与解压
  • 解压
  1. 为什么要“先建目录,再解压”?(3大好处)

image-20260717220931029

  1. linux系统压缩文件zip压缩在linux,zip -r 自己命名的压缩包(名字自己命名) project(想要压缩的文件夹)

image-20260717222336697

image-20260717222543309

压缩也把指定的文件目录压缩进去了,不只有文件

  1. tar工具解压缩

tar -xzvf 包名 -C 目标目录 → 解压到指定目标目录(-C 必须大写)

tar -xzvf 包名.tar.gz -C 目标目录








image-20260717233911951

压缩也是一样的方式

解压成功

image-20260717234013652


文本编辑

在 Linux 中只掌握文本查看是远远不够的,我们还需要掌握编辑文本文件。

Linux 上也有图形化的文本编辑器,类似于 Windows 的记事本,但是很多时候我们只能用命令行来管理 Linux 操作系统,所以必须要掌握命令行的文本编辑器软件。

目前常见的命令行文本编辑器

  • vim:具有程序编辑的能力,可以主动的以字体颜色辨别语法的正确性,方便程序设计。

什么是Vim

Vim 是从 vi 发展出来的一个文本编辑器。代码补完、编译及错误跳转等方便编程的功能特别丰富,在程序员中被广泛使用。 Vim 是一个纯命令行文本编辑器,很多文本编辑的功能都是通过键盘快捷键的方式完成,所以我们需要记住常用的键位。

image-20260718131446522

编辑模式







环境变量

定义

什么是环境变量

变量名 = 值

PATH = /usr/bin:/usr/local/bin

可以通过env命令查看所有的环境变量

最重要的环境变量

# 1. PATH —— 最重要!决定命令去哪找
echo $PATH
# /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin

# 2. HOME —— 当前用户的家目录
echo $HOME     # /home/july

临时和永久设置环境变量

export MY_NAME="July"
echo $MY_NAME    # July

# 关掉终端就消失了!

永久设置

# 编辑 ~/.bashrc 或 ~/.bash_profile
echo 'export MY_NAME="July"' >> ~/.bashrc
source ~/.bashrc   # 让修改立即生效

理解Path变量的增加

export PATH=$PATH:/opt/my-tools/bin
# 注意:是追加,不是覆盖!

查看环境变量

image-20260718175323201

==总结环境变量==(绝对正确):

image-20260718183235589

image-20260718183747788

文件基本属性与文件查找

文件时间

[root@localhost ~]# export LANG="en_US.UTF-8"
[root@localhost ~]# stat anaconda-ks.cfg
  File: anaconda-ks.cfg
  Size: 822             Blocks: 8          IO Block: 4096   regular file
Device: fd00h/64768d    Inode: 101570610   Links: 1
Access: (0600/-rw-------)  Uid: (    0/    root)   Gid: (    0/    root)
Context: system_u:object_r:admin_home_t:s0
Access: 2026-06-28 18:41:04.558360924 +0800
Modify: 2026-06-17 15:42:50.534899118 +0800
Change: 2026-06-17 15:42:50.534899118 +0800
 Birth: 2026-06-17 15:42:50.471875635 +0800

时间格式解释: 2026-06-17 15:42:50.534899118 +0800(年-月-日 时-分-秒.纳秒 +时区偏移)UTC+8是东八区北京时间

image-20260718133418797

image-20260718133431285

文件类型

ls -al查看的文件信息,现阶段只需要知道:

​ ● -代表普通文件(文本文档,二进制文件,压缩文件,电影,图片等等)

​ ● d代表目录即可

file也可以查看一个文件类型

文件查找

# 根据名称查找
find /root -name test.txt # 查找/root目录下所有名称为test.txt的文件
# 查找后处理
find / -name learvim.txt -exec ls -alh {} ;  # 查找/目录下所有名字为learvim.txt文件,并ls -alh查看信息
#{}代表占位, 是命令截至符

==总结==:

image-20260718185317629

  1. image-20260718185343848

用户权限管理

在创建虚拟机时,系统根据你输入的【用户名】在 /etc/passwd 中分配并写死了一个唯一的 UID 数字(通常第一个普通用户为 1000)。而【密码】仅仅是被加密后存进 /etc/shadow 用于登录校验,它【完全不参与】UID 数字的生成和决定。

image-20260718134812021

  1. “定死”的真实含义(计算机系的严谨表述) UID 一旦分配,默认永久固定:在 /etc/passwd 里,moonbit:x:1000:1000这一行写死了 1000。除非你用 usermod -u 2000 moonbit手动修改,否则永远不会变。

  2. Root 视角:虚拟机安装时的“默认规则”对 Root 不适用 你在虚拟机里如果全程用 Root,那么安装时 Linux 遵循的是这条铁律:

  • Root 用户根本不需要“分配”UID:Root 的 UID 0 是写在 Linux 内核源码里的(#define ROOT_UID 0)。只要系统存在,Root 就存在,永远占用 UID=0。
  • 你安装时输入的那个普通用户名(比如 moonbit)如果存在,系统才会从 1000 开始排。但如果你在安装时直接启用 Root 登录,或者安装后删掉了普通用户,你的整个系统只有一个超级用户(Root)。

​ 在你的机器上:不存在“第一个普通用户分配 1000”这个概念。系统启动后,内核直接识别 UID=0 为最高权限,所有的 /home/用户 名 目录都不存在,只有 /root 是唯一的家目录。

  1. Root 视角:登录流程链在你这里“省略了校验”
    既然你“这边都是 root”,登录流程会变成:

“虚拟机启动后,你以 Root(用户名 root,UID=0)登录。系统直接将UID=0写入当前 Shell 进程的 PCB,完全不需要去 /etc/passwd里查询分配(因为 0 是硬编码),也不需要校验普通用户的身份。自此,该 Shell 启动的所有子进程都继承这个UID=0。由于你已经是最高权限,你执行命令时完全不需要 sudo——直接 vim /etc/passwd 就能改,直接rm -rf /就能把系统删光(千万小心)。”


用户和用户组查看

image-20260720090347275

image-20260720090438571

传统运维和云计算云原生

从管理对象和运维逻辑两个角度:

1. 管理对象的差异

  • 传统运维(管理服务器):管理的是“物理实体/虚拟机”。关注的是硬件状态(CPU温度、磁盘坏道、电源冗余)、操作系统版本、内核参数、以及中间件(如Nginx、MySQL)的安装路径和配置文件。服务器本身是“资产”,IP地址是固定的,主机名是有业务含义的。
  • 云原生管理(管理程序):管理的是“工作负载(Workload)”。关注的是Pod的数量、服务的副本数、容器镜像的版本标签、以及服务之间的依赖关系(服务网格)。服务器被抽象为“资源池”,IP是临时分配的(甚至Pod重启就会变),管理员不关心这台机器是Intel还是AMD,只关心它提供的计算、内存和存储容量是否充足。

2. 运维逻辑(应对故障)的差异





3 部署与变更的差异(附带补充,便于理解)

  • 传统运维:部署是“状态修改”。用脚本(Shell/Ansible)在现有服务器上拷贝代码、修改配置、重启进程。环境具有“累积性”,这台机器跑了3年,上面装过什么遗留包,谁也说不清。
  • 云原生管理:部署是“镜像替换”。服务器本身是纯净的(只装容器运行时),每次发布只是把旧版本的镜像下线,拉取新镜像启动新Pod。环境是“一次性”的,没有历史包袱,回滚就是瞬间切回旧镜像版本。

==总结==:

传统运维把服务器当成“需要精心照顾的病人”,目的是让应用程序住得安稳;云原生管理把服务器当成“流水线上的标准零件”,目的是让应用程序在零件坏了时能瞬间换到新零件上继续运行,且全程无感知。


Linux系统提权管理(sudo)标准操作规范:

在标准的Linux系统中,普通用户默认是可以“读取”/etc目录下大部分文件的(如/etc/passwd),但默认是绝对“无法写入”或“创建文件”的。

如果你现在连 ls /etc 都报错(Permission denied),说明你的系统权限被人为加固或误修改了。我们分三种情况来排查:

1. 你想“修改”配置文件(最常见情况)

比如你想改 /etc/hosts 或 /etc/ssh/sshd_config。 结论:这不是“访问不了”,而是“没有写权限”。

  • 原因:/etc 目录及其下的系统级配置文件,所有权默认属于 root:root,普通用户只有读(r–)权限,没有写(-w-)权限。
  • 解决方案:必须使用 sudo 提权。

2. 用户提权

1. 核心管理路径

使用 /etc/sudoers.d/ 目录下的独立文件管理授权规则,而非直接修改主配置文件 /etc/sudoers。独立文件便于规则分类、回滚及删除,且修改后即时生效,无需重启服务。

2. 文件命名规范

/etc/sudoers.d/ 目录下的文件名不得包含点号(.)或波浪号(~),且不能有后缀名(如 .conf)。

  • 错误示例:mygroup.conf、rule.txt(系统会忽略此类文件)
  • 正确示例:mygroup、20_devops(建议使用数字前缀增强可读性)

3. 授权规则语法(组级别)

在规则文件中,使用百分号(%)前缀表示组。









4. 规则编辑要求

必须使用 visudo 命令编辑规则文件,以进行语法校验,防止因格式错误导致整个 sudo 机制失效。

bash

visudo -f /etc/sudoers.d/文件名

5. 用户与组的管理策略









6. 权限生效机制

通过 usermod 修改组信息后,当前已建立的 SSH 会话不会自动加载新的组身份。

  • 操作要求:用户需执行 exit 退出当前会话并重新登录,或新建 SSH 连接,新的组权限及对应的 sudo 规则才会生效。

文件权限管理

U/G/O权限模型

基础信息

[root@localhost ~]# ls -al anaconda-ks.cfg.bak
-rwxrwxrwx. 1 root root 838 Jun 28 19:03 anaconda-ks.cfg.bak

img

==重点关注rwx,acl权限,属主和数组==

image-20260720103517382

ls -alh hello.c查看文件基本信息

rwx对文件和目录的影响

权限对文件的含义对目录的含义
r (读)能看文件内容(cat)能看目录里有啥文件名(ls)
w (写)能修改文件内容能新建/删除/重命名文件
x (执行)能当作程序运行能进入该目录(cd)

rwx的数字表达

rwx每个位可以看作二进制位

rwx=111=4+2+1=7
r-x=101=4+0+1=5
---=000=0

因此有时会有人说r=4,w=2,x=1就是上述二进制转换成10进制的含义

默认情况下,新建的目录权限为755(rwxr-xr-x)自己全权,其他人可读可执行,新建的文件是644(rw-r–r–)自己可读写,其他人只读

chown修改文件属主和属组

基本语法

chown [选项] 新属主:新属组 目标

-R: 处理指定目录以及其子目录下的所有文件(递归执行,一定要确认目录是不是目标目录,否则容易P0!!!否则容易P0!!!否则容易P0!!!)

命令格式作用示例
chown user file只改属主chown nginx index.html
chown :group file只改属组chown :www-data index.html
chown user:group file同时改属主和属组chown nginx:www-data index.html
chown user: file改属主,属组改成属主的默认组chown nginx: index.html

将目录下的所有文件拥有者设置为user01,允许使用的组设置为it

[root@localhost ~]# chown -R user01:it dir/*  # 注意,dir/*是匹配dir目录下所有文件,不包括dir
[root@localhost ~]# chown -R user01:it dir/   # 包括dir自己

==总结==:

一切以文件为中心

image-20260720125351482

image-20260720125436541

image-20260720125624243

image-20260720125651177

image-20260720125717308


image-20260720125748892

image-20260720125807710

image-20260720125825765


image-20260720125843531

image-20260720125904439


chmod修改权限

基本语法

chmod [选项] 权限模式 目标文件/目录

两种写法

写法示例
数字法chmod 755 script.sh
符号法chmod u+x script.sh
chmod u+x    file    # 属主加执行权限
chmod g-w    file    # 属组去掉写权限
chmod o+r    file    # 其他人加读权限
chmod a+x    file    # 所有人(u+g+o)加执行权限

示例见课件

#递归改整个目录
chmod -R 755 /app
# 高危操作,一定要确保/app是你需要改的范围

其余示例见课件


文件ACL访问控制列表

背景

前面我们讲了传统的 u/g/o 权限模型,它有一个致命缺陷:只能管三类人。

生产环境里,我们经常遇到这样的需求:”让张三临时看一眼日志,但别动别的”,传统模型做不到,这时候就该 ACL 出场了。

所以u/g/o一般是通用的权限管理,而临时授权或者特批权限就需要acl来完成

两个核心命令

getfacl    # 查看ACL
setfacl    # 设置ACL
命令含义示例
setfacl -m u:用户名:权限 目标给用户加ACLsetfacl -m u:zhangsan:rw- file
setfacl -m g:组名:权限 目标给组加ACLsetfacl -m g:devops:r-x /data/
setfacl -x u:用户名 目标删除特定用户的ACLsetfacl -x u:zhangsan file
setfacl -b 目标删除所有ACLsetfacl -b file(恢复纯传统权限)
setfacl -R 目标递归设置ACLsetfacl -R -m u:zhangsan:r– /app/logs/
getfacl 目标查看ACLgetfacl /app/logs/

案例

​ 1. 创建sre-team组,创建sre-pjw用户归属sre-team

​ 2. 配置sre-pjw密码,切换至sre-pjw

​ 3. 用root用户创建/home/sre-pjw/hello.c,写上c的hello world

​ 4. 用root撤销hello.c other用户的r权限

​ 5. 登陆至sre-pjw用户尝试读取hello.c,提示无权限

​ 6. 返回root,使用acl给sre-pjw临时开放可读权限

​ 7. 登录sre-pjw尝试查看sre-team

==案例流程是对的,包含权限管理和acl单个文件设定==

[root@localhost project]# getfacl hello.c
# file: hello.c
# owner: root
# group: root
user::rw-
group::r--
other::---

[root@localhost project]# setfacl -m u:sre-pjw:r hello.c
[root@localhost project]# getfacl hello.c
# file: hello.c
# owner: root
# group: root
user::rw-
user:sre-pjw:r--
group::r--
mask::r--
other::---

==注意==:

image-20260720160008408

acl权限继承

我希望/project后续创建的所有文件,都自动给sre-pjw读权限:使用d参数,针对目录设置默认acl规则

# 设置默认ACL:未来新建的文件自动给zhangsan读权限
[root@localhost ~]# setfacl -m d:u:sre-pjw:rwx /project/
[root@localhost ~]# getfacl /project/
getfacl: Removing leading '/' from absolute path names
# file: project/
# owner: root
# group: root
user::rwx
group::r-x
other::r-x
default:user::rwx
default:user:sre-pjw:rwx
default:group::r-x
default:mask::rwx
default:other::r-x
# 输出会多一行:
# default:user:sre-pjw:rwx   ← 这个就是默认策略

# 示例创建新的hello.py
[root@localhost ~]# touch /project/hello.py
[root@localhost ~]# ls -al /project/
总用量 0
drwxr-xr-x+  2 root root  37  7月  5 17:10 .
dr-xr-xr-x. 19 root root 250  7月  5 16:43 ..
-rw-r--r--.  1 root root   0  7月  5 16:43 hello.c
-rw-rw-r--+  1 root root   0  7月  5 17:10 hello.py

# 查看hello.py
[root@localhost ~]# getfacl hello.py
# file: hello.py
# owner: root
# group: root
user::rw-
group::r--
other::r--

# sre-pjw用户是可以正常创建的
[sre-pjw@localhost ~]$ echo "print(1)" > /project/hello.py
[sre-pjw@localhost ~]$ cat /project/hello.py
print(1)
#sre-zhangsan用户创建
[root@localhost ~]# useradd sre-zhangsan -G sre-team
# sre-zhangsan用户是无法创建的
[sre-zhangsan@localhost ~]$ echo "aaa" > /project/hello.py
-bash: /project/hello.py: 权限不够

mask权限

mask 权限,指的是用户或群组能拥有的最大 ACL 权限,也就是说,给用户或群组设定的 ACL 权限不能超过 mask 规定的权限范围,超出部分做无效处理。

比如下方示例,mask::rw- 所有所有用户和组的最大权限就是rw,不会有x,getfacl的输出已经提示了,只有#effective:rw-,仅rw生效

[root@192 project]# getfacl hello.py
# file: hello.py
# owner: root
# group: root
user::rw-
user:sre-pjw:rwx                #effective:rw-
group::r-x                      #effective:r--
mask::rw-
other::r--

image-20260720185119031

修改mask为rwx,再观察acl信息

可以观察发现,确实不存在 #effective提示了

[root@192 project]# setfacl -m m::rwx hello.py
[root@192 project]# getfacl hello.py
# file: hello.py
# owner: root
# group: root
user::rw-
user:sre-pjw:rwx
group::r-x
mask::rwx
other::r--

需要注意,如果改变属组常规权限,mask会随之改变,因此chmod会影响mask。日常运维操作,如果chmod改变了,要注意acl规则是否需要手动调整

下图对比上图,如果g-x后,mask也减了x,对于sre-pjw,x权限就没了

[root@192 project]# chmod g-x hello.py
[root@192 project]# getfacl hello.py
# file: hello.py
# owner: root
# group: root
user::rw-
user:sre-pjw:rwx                #effective:rw-
group::r-x                      #effective:r--
mask::rw-   
other::r--

image-20260720185809341

==总结==:

image-20260720190105673

特殊权限SUID/SGID/STICKY

suid

使用场景:让执行这个文件的用户,暂时获得文件属主的身份权限

经典案例:/usr/bin/passwd

[root@192 project]# ls -al /usr/bin/passwd
-rwsr-xr-x. 1 root root 32656  5月 15  2022 /usr/bin/passwd
#  ^
#  这个s就是SUID,属主是root
没有SUID有SUID
普通用户执行 passwd → 以普通用户身份运行 → 无法修改 /etc/shadow(属主root,权限600)普通用户执行 passwd → 以root身份运行 → 可以修改 /etc/shadow

使用注意事项:

​ 1. 只对二进制文件有效

​ 2. 谁拥有这个文件,执行者就变成谁

​ 3. 没x权限,SUID位加上也没用

修改方式

chmod u+s /project/hello.py
chmod 4755 /project/hello.py # 前面的 4 = SUID

sgid

在该目录下新建的文件/目录,自动继承该目录的属组,而不是创建者的主组。

文件上的SGID(不太常用)

目录上的SGID(常用)

经典案例:创建了一个/data/sre-team-share目录,我想让所有用户再此目录下创建的文件和目录都属于sre-team组

使用root用户测试

[root@192 ~]# ls -al
...
-rw-r--r--.  1 root root     0  7月  5 17:09 hello.py
drwxr-x---.  2 root root     6  7月  1 17:04 project
...

[root@192 ~]# cd /data/sre-team-share/
[root@192 sre-team-share]# mkdir root-test
[root@192 sre-team-share]# chown :sre-team root-test
[root@192 sre-team-share]# touch root-hello.txt
[root@192 sre-team-share]# ls -al
总用量 0
drwxr-sr-x. 3 root sre-team 45  7月  7 21:32 .
drwxr-xr-x. 3 root root     28  7月  7 21:27 ..
-rw-r--r--. 1 root sre-team  0  7月  7 21:32 root-hello.txt  #文件属于sre-team
drwxr-sr-x. 2 root sre-team  6  7月  7 21:31 root-test #目录属于sre-team

修改方式

chmod g+s file
chmod 2755 dir(前面的 2 = SGID)

sticky

即使有目录的写权限,也只能删除/重命名属于自己的文件

[root@192 sre-team-share]# ls -ld /tmp
drwxrwxrwt. 11 root root 4096  7月  7 21:31 /tmp
#        ^ 标识sticky

修改方式

chmod 1777 /tmp/ (前面的 1 = Sticky Bit)

注意:sticky对root不生效!!!

这是默认正文标识符号

chattr文件属性

与U/G/O和ACL都不同,chattr是作用于文件或文件目录的,与用户无关,只要设置了规则,所有用户都一样对待。

示例:某一个重要文件,任何人不得删除

# 1. 创建一个测试文件
echo "hello" > test.txt
chmod 777 test.txt   # 所有人都能读写执行

# 2. 加上 i 属性(不可变)
chattr +i test.txt

# 查看属性
[root@192 ~]# lsattr test.txt
----i----------------- test.txt

# 3. 即使你是root,也动不了它
echo "world" >> test.txt
# 报错: bash: test.txt: Operation not permitted

rm -f test.txt
# 报错: rm: cannot remove 'test.txt': Operation not permitted

# 4. 必须先把i属性去掉
chattr -i test.txt
# 现在才能正常操作

重点:chattr 的权限检查在 UGO/ACL 之后执行,因此用户权限不管多大,都得遵守chattr属性

只需要记住两个核心参数

​ ● -i 不可变(重要的数据文件)

​ ● -a 仅追加,不能修改和删除(日志文件)

umask权限

umask 是 Linux 给新文件/目录设置默认权限时的“减分项”或“遮罩”。它决定了“默认情况下,新建的文件/目录应该去掉哪些权限”。

基础计算公式如下

文件默认权限 = 666 - umask
目录默认权限 = 777 - umask

查看当前用于默认umask

[root@192 ~]# umask # 后面跟上3为数字就是设置umask
0022

# 第一个0忽略
umask = 0 2 2
        │ │ │
        │ │ └── 其他人(other):减掉 2(写权限 w)
        │ └──── 属组(group):减掉 2(写权限 w)
        └────── 属主(user):不减(0)

所以:
  属主(user):不减任何权限 → rwx
  属组(group):减掉 w → r-x(即 rx)
  其他人(other):减掉 w → r-x(即 rx)

创建文件和文件夹测试

[root@192 ~]# touch umask-file
[root@192 ~]# mkdir umask-dir
[root@192 ~]# ls -al
...
drwxr-xr-x.  2 root root     6  7月  7 21:56 umask-dir
-rw-r--r--.  1 root root     0  7月  7 21:56 umask-file
...

umask修改后再当前shell立即生效,重启后失效,如果想重启保持,需要写入配置文件

[root@localhost ~]# vim /etc/profile
+ umask 002
[root@localhost ~]# source /etc/profile        # 立即在当前shell中生效

课件中的脚本含义:“不是系统用户(普通用户)”并且“主组名 = 用户名(用户有自己的私有组)”给umask给002,否则给022

文件权限分析

ls -al (u/g/o属主属组权限,特殊标志位,u[s] g[s] o[t])

1.这个文件本身

2.父级目录中上述权限(目录对于普通用户,rwx限制了ls,touch,rm,cd等操作)

getfacl,查看此文件的acl列表

lsattr 查看此文件的特殊属性标志