首先判断 Nginx + PHP-FPM 环境 Web 运行用户 / 用户组
查看 Nginx 实际运行进程:
ps aux | grep nginx | grep -v grep
root 1234 0.0 0.0 nginx: master process /usr/sbin/nginx
www 1235 0.0 0.1 nginx: worker processmaster 进程永远是 root(主进程)worker 进程的用户名,就是 Nginx 的工作用户:www-data 或 www 或 nginx
本例输出是 www
新建脚本文件 fix_perm.sh 代码如下(脚本说明见本文尾部):
#!/bin/bash
# Ubuntu 目录&文件权限一键设置脚本 by Laitai.top
# 目录:755,属主 www:www
# 普通文件:644,属主 www:www
# .sql数据库文件:644,属主 mysql:mysql
# 日志输出到 /var/log/fix_perm.log
# ========== 目标目录:根据你的实际路径修改 ==========
TARGET_DIR="/www/tbdr.cn"
LOG_FILE="/var/log/fix_perm.log"
# ==============================
# 判断目录是否存在
if [ ! -d "${TARGET_DIR}" ];then
echo "错误:目录 ${TARGET_DIR} 不存在!" | tee -a ${LOG_FILE}
exit 1
fi
# 判断root运行
if [ "$(id -u)" -ne 0 ]; then
echo "请使用 root 权限执行本脚本,bash $0" | tee -a ${LOG_FILE}
exit 1
fi
# 写入日志头部
echo "=====================================" | tee -a ${LOG_FILE}
echo "开始执行权限修复脚本,时间:$(date '+%Y-%m-%d %H:%M:%S')" | tee -a ${LOG_FILE}
echo "目标目录:${TARGET_DIR}" | tee -a ${LOG_FILE}
echo "目录 → 755 www:www" | tee -a ${LOG_FILE}
echo "普通文件 → 644 www:www" | tee -a ${LOG_FILE}
echo ".sql 文件 → 644 mysql:mysql" | tee -a ${LOG_FILE}
echo "=====================================" | tee -a ${LOG_FILE}
# 1. 所有目录递归 755
echo "[1] 设置所有目录权限755" | tee -a ${LOG_FILE}
find "${TARGET_DIR}" -type d -exec chmod 755 {} \; 2>>${LOG_FILE}
# 2. 所有文件递归 644
echo "[2] 设置所有普通文件权限644" | tee -a ${LOG_FILE}
find "${TARGET_DIR}" -type f -exec chmod 644 {} \; 2>>${LOG_FILE}
# 3. 全部目录和文件先统一属主 www:www
echo "[3] 统一全部目录文件属主为 www:www" | tee -a ${LOG_FILE}
chown -R www:www "${TARGET_DIR}" 2>>${LOG_FILE}
# 4. 单独修改 .sql 文件属主为 mysql:mysql,权限保持644
echo "[4] 修改 .sql 文件属主为 mysql:mysql" | tee -a ${LOG_FILE}
find "${TARGET_DIR}" -type f -iname "*.sql" -exec chown mysql:mysql {} \; 2>>${LOG_FILE}
echo "✅ 权限设置完成!时间:$(date '+%Y-%m-%d %H:%M:%S')" | tee -a ${LOG_FILE}
echo "查看目录权限样例:" | tee -a ${LOG_FILE}
ls -ld "${TARGET_DIR}" | tee -a ${LOG_FILE}
echo "查看sql文件样例:" | tee -a ${LOG_FILE}
find "${TARGET_DIR}" -type f -iname "*.sql" | head -3 | xargs ls -l 2>/dev/null | tee -a ${LOG_FILE}
echo "=====================================" | tee -a ${LOG_FILE}
脚本需要 root 执行,实际操作时把脚本里的 TARGET_DIR="/var/www/tbdr.cn" 修改成你要处理的目录。
注意:不要直接在 / 根目录执行!
# 添加执行权限
chmod +x fix_perm.sh
# 运行脚本
./fix_perm.sh
如果你的环境 web 用户是www-data,记得把脚本里www:www全部替换为www-data:www-data。
日志路径:/var/log/fix_perm.logtee 同时输出到屏幕 + 日志文件;命令错误信息(stderr)追加写入日志,屏幕不刷屏错误
每次运行会追加日志,不会覆盖旧记录;如需清空日志:> /var/log/fix_perm.log
