文件管理前置基础知识




浏览器本质
浏览器不管怎么变都是用的chrome的开源内核,然后套皮,内核都一样的所以就用edge或者chrome就行了
命令行与操作系统系统调用交互的本质




==总结==
Linux交互本质




命令行与shell
命令行和脚本并非两个割裂的工具,而是同一个Shell语言在时间维度上的前后衔接:
- 命令行 = 实时调试(Debugging)平台:
当你面对一个复杂任务(比如批量重命名、日志过滤)时,你不会直接去写一个几十行的脚本——因为那样效率太低,且一旦报错难以定位。你的第一反应是在命令行里逐条敲击指令,实时观察每一条的输出结果。这个过程中,你其实是在利用命令行的即时反馈机制,对参数、管道、正则表达式进行现场调试。发现不对,立刻按上箭头修改重试,直到这一条指令的输出完全符合预期。 - 脚本 = 调试结果的固化(Solidification):
当你在命令行中成功调试出那几条关键的指令后,你按Ctrl+C清屏,然后输入vim script.sh。你把刚才在命令行中验证通过的指令逐条粘贴进去,并加上必要的if判断或for循环。这个动作就是固化——把你通过调试获得的、正确的“单条指令碎片”,组装成一个永久保存的、可重复执行的“自动化流程”。
定义“调试”和“固化”在Linux交互中的角色
| 环节 | 核心动作 | 本质意义 |
|---|---|---|
| 调试(命令行) | 手敲 → 看输出 → 改参数 → 再看输出 | 利用交互式的试错环境,将不确定的语法和参数调整为确定正确的状态 |
| 固化(脚本) | 复制粘贴 → 保存 → 赋予执行权限 → 定时/触发执行 | 将调试成功的瞬时操作,转化为持久的文本资产,脱离人工干预 |
总结(结合调试与固化)
命令行是Shell语言的“调试器”——它提供即时反馈,让你在现场反复测试、修正单条指令的逻辑和参数,直到结果无误。
Shell脚本是命令行调试成果的“固化容器”——它将你在命令行中反复调试通过的指令集合,以文本文件的形式永久保存,并赋予自动化执行的能力(如定时任务、开机自启)。
两者的协作流程:在命令行中调试 → 确认指令正确 → 粘贴进脚本固化 → 重复使用无需再调试。命令行是“草稿纸”,脚本是“正式出版文档”。
==总结==:




VMware 软件




虚拟机网络连接模式


VMware软件创造虚拟机和ISO(镜像源文件)关系
VMware 提供”硬件舞台”,ISO 提供”系统剧本”。
- ISO在VMware里的挂载什么意思 ?
挂载 ISO 就是把那个 .iso文件虚拟成一张光盘,塞进虚拟机的光驱(CD/DVD)里。
挂载成功的标志(两个复选框必须同时满足):
✅ “已连接” — 相当于光盘已经塞进光驱里了。
✅ “启动时连接” — 相当于开机时光驱是通电可读的。
如果只设了ISO路径但没勾这俩,虚拟机开机时根本不知道光驱里有盘,就会直接跳过光驱去尝试网络启动。
- 启动顺序决定了先读谁
虚拟机的 BIOS 里有个启动顺序(Boot Order),告诉它开机先检查哪个设备:
光驱(CD-ROM)→ 硬盘(Hard Disk)→ 网卡(Network)
- 顺序正常 → 先读光驱,发现有ISO → 开始安装系统。
- 光驱没盘或没连接 → 跳转到硬盘(空的)→ 跳转到网卡(找不到PXE服务器)→ 最终报错 “Operating System not found”。
你之前所有问题的根源,就是光驱被跳过了,所以一路走到网卡然后失败。
虚拟机快照
快照的创建
在创建快照的时候,一定要关机了以后再拍摄快照,不要在开机的状态下创建快照。
关机命令:
poweroff
创建快照:
在上方点击虚拟机,找到快照,拍摄快照,然后起个名字,最后点击拍摄快照。我们的快照就创建好了




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


远程管理Linux服务器
通过电脑远程连接服务器进行管理,所以我们在后续学习的时候,为了方便,全部使用远程连接。
Linux 远程连接命令行工具有很多:
首先查看虚拟机的IP地址,也就是 Linux 服务器的 IP 地址,登录进虚拟机之后输入ip address可以查看


这边可以看到本次安装的 RockyLinux 操作系统获取到的IP地址是 192.168.88.103 每个人装的虚拟机获取的 IP 地址可能是不一样的,需要仔细看清楚。
在连接之前,我们需要在 RockyLinux 上设置一下,让它允许通过 root 用户远程连接进来
[root@localhost ~]# echo "PermitRootLogin yes" >> /etc/ssh/sshd_config
[root@localhost ~]# systemctl restart sshd




两个网卡功能
| 网卡 | 全程 | 作用 | 判断标准 | 通信标准 |
|---|---|---|---|---|
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 是一个命令解释器,它解释用户输入的命令并且把用户的意图传达给内核。(可以理解为用户与内核之间的翻译官角色)


我们可以使用 Shell 实现对Linux系统的大部分管理,例如:
- 文件管理
- 用户管理
- 权限管理
- 磁盘管理
- 软件管理
- 网络管理
使用 Shell 的两种方式
- 交互式命令行
默认等待用户输入命令,输入一行回车后执行一行命令
适合少量的工作 - Shell 脚本
将需要执行的命令和逻辑判断语句都写入一个文件后执行该文件
适合完成复杂,重复性工作
==总结==:我们用的就是bashshell,首个命令都是应用程序,后面是参数
文件系统管理
讲解以课件为核心,重点:
● linux系统路径特点,相对路径和绝对路径
● 文件系统操作命令


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


==总结==:~ 代表/root目录
常用命令
Linux 常见命令比较多,这边只列出初学者最常用的部分命令,大家可以根据命令有意去进行练习。
注意 Linux 会准确的识别出命令的大小写,所以大家需要注意大小写的问题。命令选项和参数之间是用空格进行分隔,请大家在输入的时候注意不要缺失空格。
学习 Linux 最重要的就是以下三个方面
- 命令的积累
- 原理的掌握
- 大量的实战
命令大全
| 分类 | 命令**(*低频)** | 核心作用 | 最高频参数 | 工作中最典型的实例 |
|---|---|---|---|---|
| 基础操作 | ls | 列出当前目录内容 | -alh 由三个分开的参数组合成 -a 就是参数a | ls -alh # 以人类可读大小显示当前目录所有文件详情 |
| cd | 切换目录 | cd /var/log/ # 切换到日志目录 ; cd .. # 回到上级目录 ; cd # 直接回家目录 | ||
| pwd | 显示当前路径 | pwd # 输出如 /home/user/project,确认自己在哪 | ||
| clear | 清屏 | clear # 或直接按 Ctrl+L,让屏幕变干净 | ||
| echo | 打印输出内容 | -e | echo “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 | 创建目录 | -p | mkdir -p project/src/main # 一次性创建多级目录 | |
| cp | 复制文件/目录 | -r -i | cp -r /etc/nginx/ ./backup/ # 递归复制整个nginx目录到当前目录下的backup | |
| mv | 移动/重命名文件 | -i | mv app.log app_old.log # 重命名日志文件mv app.log /tmp/ # 移动文件到/tmp | |
| rm | 删除文件/目录 | -r -f -rf | rm -rf /tmp/cache/ # 强制删除cache目录(此操作不可恢复!)rm app.log # 删除单个文件 | |
| cat | 查看完整文件内容 | -n | cat -n /etc/hosts # 显示hosts文件内容并带行号 | |
| tail | 查看文件尾部 | -f -n | tail -f /var/log/nginx/access.log # 极高频:实时滚动查看nginx访问日志 | |
| less(*) | 分页查看文件,极快加载超大文件 | less /var/log/messages # 分页查看系统日志,按空格翻页,按/搜索 | ||
| head(*) | 查看文件头部 | -n | head -n 3 /etc/passwd # 查看passwd文件前3行 | |
| grep | 搜索文本内容 | -v -E -A | grep “ERROR” app.log # 在日志中找所有ERROR行grep -v “^#” /etc/nginx/nginx.conf # 排除注释行看有效配置 | |
| unzip | 解压 .zip 文件 | -d | unzip web.zip -d /var/www/html/ # 解压到指定目录 | |
| zip | 压缩成.zip文件 | -r | zip -r mydir.zip myfolder/ # 递归压缩myfolder文件为mydir.zip文件 | |
| tar | 打包/解压 .tar.gz | -czvf -xzvf -tf | tar -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 -L | curl -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 -q | wget https://example.com/bigfile.iso # 最直接下载wget -c https://example.com/bigfile.iso # 断点续传(下载中断后继续) | |
| 环境变量 | alias | 给命令起别名 | -p | alias 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 |
==总结==:
- 参数就学固定组合就行,不用管小的遇到了问 ai
- man有用,查看命令手册,手册是详细介绍内容的,介绍查看的是什么
# 为了让别名永久生效,可以将修改别名的命令写入 bashrc 文件,这个文件中的命令会在每次登陆命令行的时候执行
[root@localhost ~]# echo "alias wl='ip address'" >> /.bashrc
在 Linux shell 中,>> 是追加重定向操作符,用于将命令的输出(标准输出)追加到指定文件的末尾,而不会覆盖原有内容
日常使用中,>> 非常常见,尤其是需要保留历史记录时,用它就对了


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




- 复制文件


- 复制文件到别的文件夹




==注意==:-r可以递归复制,而linux快捷键直接把要复制的文件夹和里面的嵌套的都复制的,linux需要递归复制
- 一次创建多个目录(文件夹)




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


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


- head和tail,tail非常重要




- grep过滤和文件结合


- wget和curl






配置golang语言环境
- linux压缩与解压
- 解压
- 为什么要“先建目录,再解压”?(3大好处)


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




压缩也把指定的文件目录压缩进去了,不只有文件
- tar工具解压缩
tar -xzvf 包名 -C 目标目录 → 解压到指定目标目录(-C 必须大写)
tar -xzvf 包名.tar.gz -C 目标目录


压缩也是一样的方式
解压成功


文本编辑
在 Linux 中只掌握文本查看是远远不够的,我们还需要掌握编辑文本文件。
Linux 上也有图形化的文本编辑器,类似于 Windows 的记事本,但是很多时候我们只能用命令行来管理 Linux 操作系统,所以必须要掌握命令行的文本编辑器软件。
目前常见的命令行文本编辑器
- vim:具有程序编辑的能力,可以主动的以字体颜色辨别语法的正确性,方便程序设计。
什么是Vim
Vim 是从 vi 发展出来的一个文本编辑器。代码补完、编译及错误跳转等方便编程的功能特别丰富,在程序员中被广泛使用。 Vim 是一个纯命令行文本编辑器,很多文本编辑的功能都是通过键盘快捷键的方式完成,所以我们需要记住常用的键位。


编辑模式
环境变量
定义
什么是环境变量
变量名 = 值
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
# 注意:是追加,不是覆盖!
查看环境变量


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




文件基本属性与文件查找
文件时间
[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是东八区北京时间




文件类型
ls -al查看的文件信息,现阶段只需要知道:
● -代表普通文件(文本文档,二进制文件,压缩文件,电影,图片等等)
● d代表目录即可
file也可以查看一个文件类型
文件查找
# 根据名称查找
find /root -name test.txt # 查找/root目录下所有名称为test.txt的文件
# 查找后处理
find / -name learvim.txt -exec ls -alh {} ; # 查找/目录下所有名字为learvim.txt文件,并ls -alh查看信息
#{}代表占位, 是命令截至符
==总结==:



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


-
“定死”的真实含义(计算机系的严谨表述) UID 一旦分配,默认永久固定:在
/etc/passwd里,moonbit:x:1000:1000这一行写死了1000。除非你用usermod -u 2000 moonbit手动修改,否则永远不会变。 -
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 是唯一的家目录。
- Root 视角:登录流程链在你这里“省略了校验”
既然你“这边都是 root”,登录流程会变成:
“虚拟机启动后,你以 Root(用户名 root,UID=0)登录。系统直接将UID=0写入当前 Shell 进程的 PCB,完全不需要去 /etc/passwd里查询分配(因为 0 是硬编码),也不需要校验普通用户的身份。自此,该 Shell 启动的所有子进程都继承这个UID=0。由于你已经是最高权限,你执行命令时完全不需要 sudo——直接 vim /etc/passwd 就能改,直接rm -rf /就能把系统删光(千万小心)。”
用户和用户组查看




传统运维和云计算云原生
从管理对象和运维逻辑两个角度:
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


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


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自己
==总结==:
一切以文件为中心




















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:用户名:权限 目标 | 给用户加ACL | setfacl -m u:zhangsan:rw- file |
| setfacl -m g:组名:权限 目标 | 给组加ACL | setfacl -m g:devops:r-x /data/ |
| setfacl -x u:用户名 目标 | 删除特定用户的ACL | setfacl -x u:zhangsan file |
| setfacl -b 目标 | 删除所有ACL | setfacl -b file(恢复纯传统权限) |
| setfacl -R 目标 | 递归设置ACL | setfacl -R -m u:zhangsan:r– /app/logs/ |
| getfacl 目标 | 查看ACL | getfacl /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::---
==注意==:


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--


修改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--


==总结==:


特殊权限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 查看此文件的特殊属性标志
