CentOS chmod批量修改全部文件权限的脚本范例
服务器里几千个文件权限乱七八糟,手动一个个改?手指会抽筋。把下面这段脚本粘进终端,一杯咖啡没喝完,整站权限就整整齐齐了。

为什么权限会乱
解压带Windows习惯的压缩包、多人共用账号、误操作复制,都会把目录带成644、可执行文件带成700。Web服务立刻报403,SSH私钥立刻被系统拒绝。与其事后救火,不如一次写死规则,以后一键还原。
先想清楚:目录与文件得分治
目录需要x位才能cd进去,文件却多数不需要执行。把两者混为一谈,要么网站打不开,要么脚本无法运行。脚本里必须分开处理,find命令的-type参数就是干这个的。
脚本正文:三行搞定,可回滚
新建fixperm.sh,把下面内容原封不动粘进去:

#!/bin/bash
先记录原始权限,万一翻车还能回滚
find /var/www -printf '%m %p\n' > /root/perm.$(date +%s).bak
目录统一755
find /var/www -type d -exec chmod 755 {} +
文件统一644,但*.sh保持750

find /var/www -type f ! -name '*.sh' -exec chmod 644 {} +
find /var/www -type f -name '*.sh' -exec chmod 750 {} +
私钥直接600,谁也别想偷看
find /var/www -name '.key' -o -name 'id_rsa' -exec chmod 600 {} +
保存后chmod +x fixperm.sh,执行前把/var/www换成你实际目录。跑完再ls -l看一眼,世界瞬间清爽。
想更狠?把脚本做成系统服务
把fixperm.sh扔进/usr/local/sbin,再写个最小化的systemd单元:
[Unit]
Description=Fix web permissions
After=network.target
[Service]
Type=oneshot
ExecStart=/usr/local/sbin/fixperm.sh
RemainAfterExit=yes
启用后每次重启自动纠偏,再也不怕同事手滑。
常见翻车点提醒
1. 不要把根目录/当路径,脚本一旦写错,系统直接原地爆炸。
先备份权限,perm.bak文件是后悔药。
有些框架要求缓存目录777,提前在白名单里用-path排除,别让脚本又给你改回755。
如果用了SELinux,chmod后还得restorecon -Rv,否则依旧403。
一条命令快速验证
跑完脚本,用find /var/www -type f -perm /u+x | grep -v '.sh'检查,只要回显为空,就说明没有偷偷摸摸的 Executable 文件混在普通文件里。
把脚本再升级:支持参数化
给脚本加个$1,就能批量处理任意路径:
TARGET=${1:-/var/www}
以后./fixperm.sh /data/mysite,想改哪就改哪,脚本复用率瞬间翻倍。
懒人版:直接复制粘贴
如果你连vim都不想开,整条命令一次性执行:
curl -sSL https://pastebin.com/raw/xxxxxx | bash -s /var/www
前提是你信得过源,最好把链接换成自己仓库,安全比方便更重要。
权限这玩意儿,平时没人理,一炸就炸全网。把脚本丢进定时任务,每周日凌晨跑一次,比任何应急手册都靠谱。记住:备份、分批、分类型,三件套永远不过时。
