《文件权限看不懂先别 chmod 777:用 ls -l、umask、ACL 三步管好权限》
新手在 Linux 上遇到“Permission denied”时,第一反应往往是 chmod 777,问题是解决了,隐患也埋下了:任何用户都能改这个文件,Web 服务被攻破后攻击者顺手就能改脚本、偷配置。本文用三步讲清权限到底怎么算,以及不用 777 也能把事办成。
第一步:读懂 ls -l 的十个字符。执行 ls -l /etc/nginx/nginx.conf,开头会看到类似 -rw-r--r-- 的十个字符。第一位是类型,- 是普通文件,d 是目录,l 是软链接;后面九位每三位一组,依次是属主、属组、其他人的权限,r 读、w 写、x 执行,- 表示没有。数字写法是把 rwx 换算成 4、2、1 再相加:rwx 是 7,rw- 是 6,r-- 是 4。所以 644 就是属主可读写、组和其他人只读,755 是属主可读写执行、其余人可读执行。记住一个原则:文件一般不需要执行位,目录必须有执行位——没有 x,你连 cd 进目录、列出里面文件名的资格都没有,这就是很多人把目录设成 644 后“文件明明可读却打不开”的原因。定位问题先看三样:ls -l 看权限位,ls -ld 目录看上级目录权限,id 用户名看当前用户属于哪个组。权限是按“属主→属组→其他人”顺序匹配的,一旦匹配到一组就不再往下看,所以把用户加进属组却还用其他人身份判断,是常见的误判。
第二步:umask 决定新建文件的默认权限。新建文件默认是 666 减去 umask,新建目录默认是 777 减去 umask。系统默认 umask 通常是 022,于是文件默认 644、目录默认 755,这正是“新建文件别人能读、不能改”的来源。如果你发现新上传的配置文件组内同事改不了,先查 umask,再决定是在当前 shell 里临时 umask 002,还是在部署脚本里显式 chmod,而不是事后到处补 777。需要提醒的是,umask 只能做减法,不能给文件加上默认没有的执行位;脚本需要执行权限时,仍要显式 chmod +x。把 umask 写进个人 shell 配置前,先确认它不会影响系统服务或共享目录,否则一台机器上所有新文件都会悄悄变宽松。
第三步:多人协作别硬凑组,用 ACL 精细授权。两个人要改同一个目录、又不想把目录属组改来改去时,ACL 是比 777 体面的办法。setfacl -m u:zhangsan:rw- 目录只给张三读写权,getfacl 目录可以随时查看这些额外规则,setfacl -d -m u:zhangsan:rw- 目录还能让新建文件自动继承这条规则。权限收回时用 setfacl -x u:zhangsan 目录删掉单条即可,不用动其他人的权限。收尾自查清单:先 ls -l 确认权限位和属主属组,再 namei -l 文件路径从根目录一路看下来——任何一级父目录缺 x 都会挡住访问;最后用目标用户身份实测一次 sudo -u 用户名 cat 文件,能读才算真通。记住顺序:看清权限、算对 umask、协作上 ACL,777 永远是最后也不该选的那条路。
- 点赞
- 收藏
- 关注作者
评论(0)