最安全的递归权限修改是分两步:先用 find -type d 设目录为755,再用 find -type f 设文件为644;需可执行文件时按后缀或 file 命令筛选;chown -R 应慎用,推荐 chown -R user: 保留原属组;操作前务必用 readlink -f 校验路径。

chmod -R 会误伤不该改的文件
直接用 chmod -R 755 /path 是最常见也最危险的操作——它不区分目录和文件,把所有东西都设成可执行,导致脚本被意外执行、配置文件被 chmod 成可写、甚至 Web 服务器拒绝服务(比如 PHP 脚本因权限过宽被 Apache 拒绝解析)。
真正安全的做法是「分两步」:先改目录(需要 x 权限才能进入),再改文件(通常不需要 x)。
-
find /path -type d -exec chmod 755 {} \;—— 只对目录设755 -
find /path -type f -exec chmod 644 {} \;—— 只对普通文件设644
需要保留某些文件的可执行权限怎么办
上面的 644 会把所有文件(包括 shell 脚本、二进制)都变成不可执行,运行时报 Permission denied。这时候得加条件筛选。
常用判断方式是按后缀或文件头:
- 给所有
.sh文件加执行权:find /path -name "*.sh" -exec chmod +x {} \; - 只给真正可执行的文件加 x(跳过文本/配置类):
find /path -type f -exec file {} \; | grep "executable\|ELF\|shell script" | cut -d: -f1 | xargs chmod +x
chown -R 和 chmod -R 一样危险
chown -R 不仅改属主,还会把所有子项的属组一并覆盖,常导致 Web 目录下 PHP 进程无法写入上传目录(比如把 www-data:www-data 强制改成 user:user)。
更稳妥的是指定属主+保留原属组,或用 : 显式留空属组:
- 只改属主,不动属组:
chown -R user: /path(注意冒号后的空) - 只改属组:
chown -R :groupname /path - 彻底重置属主属组(慎用):
chown -R user:group /path
递归修改前必须确认路径是否带尾部斜杠
这是最容易手抖出事的地方。/var/www/html/ 和 /var/www/html 在 find 或 chmod -R 下行为一致,但如果你中间用了 cp -r、rsync 或脚本拼接路径,少一个 / 可能导致父目录被卷入。
建议统一用绝对路径 + readlink -f 校验:
- 先跑:
readlink -f /your/path看输出是否符合预期 - 再加
-print预览:find $(readlink -f /your/path) -type d -print | head -5 - 确认无误后再把
-print换成-exec chmod ... \;
路径多一层校验,比修权限后查日志省两小时。

















