Linux递归修改权限需区分目录(755)和文件(644),脚本单独加执行权;启用SGID(chmod g+s)确保组继承,配合umask 002和粘滞位(+t)防误删,操作前务必用find -print预览路径。

Linux 递归修改目录权限不能只靠 chmod -R 一把梭,否则文件被设成可执行、配置被误改写、Web 服务拒绝解析都是常见后果。真正安全的做法是区分目录和文件分别处理,并配合 SGID 实现新建内容的组继承。
分类型递归设置权限(最稳妥)
直接 chmod -R 755 /path 会把 .log、.conf、.txt 全部变成可执行,既不安全也不符合实际需求。正确方式是用 find 按类型精准控制:
- 给所有目录设 755(确保可进入、可列出):
find /path -type d -exec chmod 755 {} \; - 给所有普通文件设 644(仅读写,无执行):
find /path -type f -exec chmod 644 {} \; - 若需保留脚本可执行性,单独加权:
find /path -name "*.sh" -type f -exec chmod +x {} \;
或更严谨地筛选真正可执行项:find /path -type f -exec file {} \; | grep "executable\|ELF\|shell script" | cut -d: -f1 | xargs chmod +x
让新文件自动继承所属组(SGID)
默认情况下,用户在共享目录里新建的子目录或文件,属组仍是其登录主组,不是项目组。要强制继承父目录的组,必须闭环完成四步:
-
设属组:先用
chown :devteam /shared(注意冒号开头,不写用户名)指定目标组 -
开 SGID:再运行
chmod 2770 /shared或chmod g+s /shared;验证是否生效看ls -ld /shared输出中组权限位是否为小写 s(如drwxrws---) -
加组并重登录:用
usermod -aG devteam user加入组,用户需重新登录或执行newgrp devteam -
配 umask 002:确保新建文件有组写权限(
664)而非644,可在/etc/profile或~/.bashrc中设umask 002
补充加固:防误删与 ACL 继承
多人协作时,仅 SGID 不够——别人仍能删你建的文件。可叠加粘滞位(Sticky Bit):
- 启用:
chmod +t /shared或chmod 12770 /shared - 验证:
ls -ld /shared显示末位为 t(如drwxrws--t),表示只有文件所有者、目录所有者或 root 能删除 - 如需更细粒度控制(比如允许某组对新文件有写权),可用默认 ACL:
setfacl -d -m g:devteam:rwx /shared
注意:该设置只影响之后新建的项,已有内容需单独赋权;用getfacl /shared查看,setfacl -d -b /shared清除
操作前必做校验
路径错一位,可能把整个 /var 卷进去。每次递归操作前务必:
- 用
readlink -f /your/path确认绝对路径是否准确 - 先用
-print预览范围:find $(readlink -f /your/path) -type d -print | head -5 - 确认无误后再把
-print替换为-exec chmod ... {} \;
不复杂但容易忽略。


















