Linux 文件权限分为 权限位 (chmod) 和 属主属组 (chown/chgrp),两个概念要区分开。
一、基础概念
1. 文件权限字符含义
执行 ls -l filename 看到类似:
plaintext
-rwxr-xr-- 1 root docker 123 test.sh
第一位:文件类型
-普通文件,d目录,l软链接后面 9 位分 3 组:所有者 (user)、所属组 (group)、其他用户 (other)
plaintext
u g o
r w x r - x r - -
表格
数字权限 = 各组权限数值相加
例:
rwxr‑xr‑
u: r+w+x = 7
g: r+‑+x =5
o: r+‑+‑ =4
最终权限:754
二、chmod:修改文件 / 目录权限(改 rwx,不改所有者)
格式:
chmod [选项] 权限 文件/目录
两种写法:数字模式 / 符号模式
1)数字模式(最常用)
bash
chmod 755 test.sh
# u=7(rwx), g=5(r‑x), o=5(r‑x)
chmod 644 file.txt
# u=6(rw‑),g=4(r‑‑),o=4(r‑‑),普通文本默认
常见权限参考
644:普通文件,所有者读写,其他人只读(日志、配置文件)755:程序 / 脚本、目录,所有者读写执行,其他人读执行700:私密文件,仅自己可读写执行777:全部开放,生产环境尽量不要用,有安全风险
2)符号模式 u g o a
uuser 所有者;ggroup 组;oother 其他人;aall 全部+增加权限,-移除权限,=设置权限
bash
# 给所有者增加执行权限
chmod u+x test.sh
# 去掉其他用户写权限
chmod o-w file.txt
# 给全部用户增加执行
chmod a+x run.sh
# 设置组权限为只读
chmod g=r file.txt
递归修改目录权限 -R
-R递归,目录 + 目录下所有文件一起改
bash
chmod -R 755 /opt/app/
⚠️注意:目录必须要有 x 权限才能进入访问;很多人递归把目录下所有文件设置 777,会带来安全隐患。
三、chown:修改【所有者 + 所属组】
chmod 改的是 rwx 权限;chown 改是谁拥有这个文件
格式:
bash
# 修改所有者
chown 用户名 文件
# 修改所有者:组
chown user:group file
# 只修改组
chown :group file
示例
bash
# 把app.log属主改成nginx用户
chown nginx:nginx app.log
# 递归修改整个目录属主属组
chown -R nginx:nginx /var/www/html
只有 root 可以修改文件属主;普通用户不能把自己的文件转给别人。
四、chgrp:只修改所属组(用的少,chown 可以替代)
bash
chgrp docker test.txt
五、重要坑点
目录和文件 x 权限意义不一样
文件 x:代表可以运行这个程序脚本
目录 x:代表可以 cd 进入目录,没有 x 就算有 r 也无法读取目录内文件
-R递归慎用:不要随便chmod -R 777 /xxx,会造成权限泄露,部分系统文件损坏suid/sgid/sticky 特殊权限(了解)
chmod u+s filesuid,执行时使用文件所有者权限chmod +t /tmp粘滞位,典型 /tmp 目录,用户只能删自己的文件
umask:新建文件 / 目录默认权限掩码,控制新建文件默认权限
六、实操小案例
场景:写一个 shell 脚本需要执行
bash
# 创建脚本
vim deploy.sh
# 增加执行权限
chmod +x deploy.sh
# 归属给普通用户app
chown app:app deploy.sh
# 运行
./deploy.sh
场景:网站目录,nginx 读取,不允许其他人写
bash
chown -R nginx:nginx /data/www
chmod -R 755 /data/www
find /data/www -type f -exec chmod 644 {} \;
# 文件644,目录755,分开设置,避免普通文件也带上执行权限
小技巧:
stat 文件可以看详细权限、uid gid。
本文原创作者:易君召,详见:https://www.yijunzhao.cn/authors/yijunzhao,转载请注明出处。
原文链接
欢迎访问 小易撩挨踢