文件权限管理
chmod - 修改文件/目录权限
chmod 是Linux系统中修改文件/目录权限的核心命令,通过调整所有者(u)、组(g)、其他用户(o)的读(r)、写(w)、执行(x)权限,实现对文件访问的权限控制,需文件所有者或root权限执行。
权限基础
Linux权限分三类对象、三种操作:
1. 对象: u (user,文件所有者)、 g (group,所属组)、 o (others,其他用户)、 a (all,所有对象,默认)。
2. 操作: r (读,数字4)、 w (写,数字2)、 x (执行,数字1)、 - (无权限,数字0)。
3. 表示形式:
- 符号型:如 rwxr-xr--
- 数字型:如 754 ( 7=4+2+1 , 5=4+1 , 4=4 )。
基础语法
chmod有符号模式和数字模式两种使用方式,语法分别为:
# 符号模式
chmod [对象][操作符][权限] 文件/目录
# 数字模式
chmod 数字权限 文件/目录
操作符: + (添加权限)、 - (移除权限)、 = (设置权限,覆盖原有)。
核心用法
1.符号模式(灵活调整,推荐)
示例 作用
chmod u+x test.sh 给文件所有者添加执行权限
chmod g-w print.py 移除所属组对print.py的写权限
chmod o=r file.txt 给其他用户仅设置读权限(覆盖原有)
chmod a+x dir/ 给所有用户添加对目录的执行权限(目录需执行权限才能进入)
chmod ug=rw,o=r file 给所有者和组设置读+写权限,给其他用户设置读权限
2. 数字模式(简洁高效,常用)
将三类对象的权限换算为数字总和(r=4、w=2、x=1),直接赋值:
数字权限 对应符号权限 示例 作用
755 rwxr-xr-x chmod 755 test.sh 所有者读+写+执行,组和其他读+执行
644 rw-r--r-- chmod 644 file.txt 所有者读+写,组和其他仅读
777 rwxrwxrwx chmod 777 temp/ 所有用户拥有全部权限(慎用,安全风险)
700 rwx------ chmod 700 secret/ 仅所有者可访问,其他用户无任何权限
3.递归修改目录权限
通过 -R 选项可递归修改目录及内部所有文件/子目录的权限:
chmod -R 755 project/ # 递归设置project目录下所有内容为755权限
chmod -R g+w docs/ # 递归给所属组添加docs目录及内容的写权限
特殊权限(进阶
chmod还支持设置SUID、SGID、粘滞位(Sticky Bit)等特殊权限:
1. SUID(4):用户执行文件时,临时获得文件所有者的权限,示例: chmod 4755 passwd 。
2. SGID(2):用户执行文件时,临时获得文件所属组的权限;目录中新建文件继承目录的组,示例: chmod 2775 dev/ 。
3. 粘滞位(1):仅文件所有者/root可删除目录内的文件,示例: chmod 1777 /tmp/ (系统默认/tmp权限)。
chown - 修改文件/目录的所有者和所属组
chown 是Linux系统中修改文件/目录的所有者和所属组的核心命令,通过调整文件的属主(user)和属组(group),实现权限的归属管理,仅root用户或文件的原始所有者可执行(修改属组也可通过 chgrp ,但 chown 可一站式操作)。
基础语法
chown [选项] [新所有者][:[新所属组]] 文件/目录
格式说明:
仅改所有者: chown 用户名 文件
仅改所属组: chown :组名 文件 (或 chown .组名 文件 )
同时改所有者和所属组: chown 用户名:组名 文件
核心选项
选项 全称/作用 示例
选项 -R --recursive :递归修改目录及内部所有文件/子目录的所有者/所属组 chown -R test1:dev /data
选项 -c --changes :仅显示实际被修改的文件信息(忽略未变化的文件) chown -c test2 file.txt
选项 -v --verbose :显示所有操作的详细过程(包括未变化的文件) chown -v test1:test1 print.py
选项 -f --silent/--quiet :静默模式,忽略错误信息(如文件不存在、权限不足) chown -f test3 nonfile.txt
选项 -h --no-dereference :仅修改符号链接本身的权限,不影响链接指向的原文件 chown -h test1:test1 link.txt
典型用法
仅修改文件所有者
chown test1 print.py # 将print.py的所有者改为test1
仅修改文件所属组
chown :dev print.py # 将print.py的所属组改为dev
# 等价于 chgrp dev print.py
同时修改所有者和所属组
chown test2:test1 print.py # 所有者改为test2,所属组改为test1
递归修改目录权限
chown -R test1:dev /project # 递归将/project目录及所有内容的所有者设为test1,所属组设为dev
修改符号链接的属主/属组
chown -h test1:test1 link_to_py # 仅修改链接文件本身,不影响原文件
注意事项
1. 普通用户无法将文件的所有者改为其他用户,仅root可实现跨用户修改。
2. 修改目录的属主/属组时,若需同步修改内部所有内容,必须加 -R 选项,否则仅修改目录本身。
3. 对符号链接操作时,不加 -h 会修改链接指向的原文件,而非链接本身,需谨慎使用。
chgrp - 专门修改文件/目录所属组
chgrp 是Linux中专门修改文件/目录所属组的命令,作用是将文件的属组(group)变更为指定组,与 chown :组名 功能一致,但更专注于“仅改属组”场景,需文件所有者或root权限执行
基础语法
chgrp [选项] 目标组名 文件/目录
核心逻辑:仅调整文件的“所属组”,不改变所有者(user)和常规rwx权限,新属组需已存在(可通过 cat /etc/group 确认)
核心选项
选项 全称/作用 示例
选项 -R --recursive :递归修改目录及内部所有文件/子目录的所属组 chgrp -R dev /project
选项 -c --changes :仅显示实际被修改的文件信息(忽略未变化的文件) chgrp -c test1 print.py
选项 -v --verbose :显示所有操作的详细过程(包括未变化的文件,比 -c 更详细) chgrp -v test1 file.txt
选项 -f --silent/--quiet :静默模式,忽略错误信息(如组不存在、权限不足) chgrp -f nonexist_group test.sh
选项 -h --no-dereference :仅修改符号链接本身的所属组,不影响链接指向的原文件 chgrp -h test1 link_to_py
典型用法
修改单个文件的所属组
chgrp test1 print.py # 将print.py的所属组改为test1(test1组需已存在)
2. 递归修改目录及内容的所属组
chgrp -R dev /data # 递归将/data目录及内部所有文件/子目录的所属组改为dev
3. 修改符号链接的所属组(不影响原文件)
chgrp -h test1 link_file # 仅改链接文件本身的属组,原文件属组不变
4. 显示修改过程(验证操作)
chgrp -v test1 *.txt # 批量修改当前目录下所有.txt文件的属组,并显示每个文件的操作结果
与chown的区别(关键)
命令 功能范围 改属组的写法对比
chgrp 仅修改所属组(专一) chgrp 组名 文件
chown 可修改所有者+所属组(全能) chown :组名 文件 (仅改属组)
简单说: chgrp 组名 文件 = chown :组名 文件 ,前者更直观,后者可一站式改所有者+属组。
注意事项
1. 普通用户仅能将文件的属组改为自己所属的组(主组或附加组),root可改为任意存在的组。
2. 修改目录属组时,若不加 -R ,仅目录本身的属组变更,内部文件/子目录属组不变。
3. 若目标组不存在,会报错“invalid group”,需先用 groupadd 创建组再操作。
chattr - 设置文件/目录特殊属性
chattr 是Linux中设置文件/目录特殊属性的命令,这些属性独立于常规rwx权限,能实现防删除、防修改、仅追加等高级权限控制,需root权限执行,主要针对ext2/ext3/ext4/xfs等文件系统生效。
基础语法
chattr [±=][属性] 文件/目录
+ :添加属性
- :移除属性
= :设置属性(覆盖原有所有特殊属性)
属性:单个字母代表不同特殊属性(如 i 、 a )
核心属性(常用)
属性 作用 适用对象
属性 i 不可修改属性:文件/目录无法被删除、修改、重命名,也不能创建/删除子文件 文件、目录
属性 a 仅追加属性:文件只能被追加内容(如日志),无法修改/删除;目录仅能新建文件 文件、目录
属性 s 安全删除:文件删除时,数据块会被零填充覆盖,防止数据恢复 文件
属性 u 不可删除:文件删除后,数据块会被保留,可通过 lsattr 恢复 文件
属性 d 不被dump备份:dump备份工具会忽略该文件/目录 文件、目录
属性 R 递归设置:仅配合 -R 使用,对目录及子内容递归应用属性 目录(需加 -R )
典型用法
1. 给文件添加不可修改属性(防误删/篡改)
chattr +i print.py # 让print.py无法被修改、删除、重命名
解除: chattr -i print.py
2. 给日志文件添加仅追加属性
chattr +a /var/log/messages # 仅能向日志文件追加内容,无法修改历史内容
解除: chattr -a /var/log/messages
3. 递归给目录设置仅追加属性
chattr -R +a /data/logs # /data/logs目录仅能新建文件,无法删除/修改已有文件
4. 覆盖设置文件属性(仅保留 a 属性)
chattr =a test.txt # 移除test.txt所有特殊属性,仅保留a属性
5.查看特殊属性:lsattr
需配合 lsattr 命令查看文件/目录的特殊属性:
lsattr print.py # 查看print.py的特殊属性
lsattr -R /data # 递归查看/data目录及子内容的特殊属性
注意事项
1. 即使是root用户,也需先移除 i / a 属性,才能修改/删除对应文件。
2. a 属性对目录生效时,仅限制删除/修改文件,不限制新建文件; i 属性对目录生效时,完全禁止所有修改操作。
3. 部分文件系统(如FAT32)不支持 chattr 的特殊属性,仅主流Linux文件系统(ext4、xfs)兼容。