permission denied 多因权限或路径错误:目标目录属主非当前用户,应改用部署用户并加入对应组;同步路径末尾加/表示同步内容;避免sudo rsync和线上git操作。

用 rsync 同步时提示 Permission denied 怎么办
多数报错其实卡在权限或路径上,不是代码问题。线上服务器的部署目录(比如 /var/www/html)通常属于 www-data 或 nginx 用户,而你用普通用户 ssh 登录后直接 rsync 写入会失败。
实操建议:
立即学习“PHP免费学习笔记(深入)”;
- 先确认目标目录属主:
ls -ld /var/www/html,如果显示root:www-data,普通用户无法写入 - 改用部署专用用户(如
deploy),并将其加入www-data组:usermod -aG www-data deploy - 同步命令加
-e "ssh -p 2222"指定端口,避免默认 22 被拦截;路径末尾加斜杠/(rsync -av ./src/ user@host:/var/www/html/)表示“同步内容”,不加则同步整个src目录 - 别用
sudo rsync——远程端不会继承本地 sudo 权限,反而更易出错
git pull 在线上执行总卡住或报 error: Your local changes would be overwritten
这是典型「线上不该当开发环境」导致的问题。线上目录如果被手动改过(比如调试时 touch 过文件、改过配置),再 git pull 就会拒绝覆盖。
实操建议:
立即学习“PHP免费学习笔记(深入)”;
- 线上只保留
git clone出来的 bare 仓库 + 一个work-tree,用钩子自动检出(推荐) - 临时救急:进目录运行
git reset --hard && git clean -fd清掉所有未跟踪和修改文件(⚠️ 配置文件会被删!务必先备份.env、config.php等) - 永远不要在线上直接
git checkout或git commit——版本管理必须在本地完成 - 用
git status看清楚哪些文件「红色」(未跟踪)、「绿色」(已暂存),比盲目pull安全得多
PHP 文件传上去就 500,但本地正常
常见原因不是语法错误,而是环境差异:线上 PHP 版本低、扩展没开、文件权限不对、或 opcache 缓存了旧字节码。
实操建议:
立即学习“PHP免费学习笔记(深入)”;
- 立刻查错误日志:
tail -f /var/log/php*/error.log或tail -f /var/log/apache2/error.log,比浏览器 500 有用十倍 - 检查 PHP 版本和扩展:
php -v、php -m | grep pdo,尤其注意mbstring、curl、json是否启用 - 文件权限要严格:代码文件
644,目录755,storage和bootstrap/cache(Laravel)这类可写目录得设为775并属组正确 - 清空 opcache:
php -r "opcache_reset();",或重启 php-fpm:sudo systemctl restart php*-fpm
怎么避免每次上线都手抖输错命令
人工同步本质不可靠,真正省心的方式是把「本地 → 线上」这个动作固化成脚本或流程,而不是依赖记忆。
实操建议:
立即学习“PHP免费学习笔记(深入)”;
- 写个简易
deploy.sh,封装rsync命令 + 权限修复 + 服务重载,加上set -e让任一命令失败就中止 - 用
scp替代rsync仅适用于小项目(无增量、无排除),命令更简单:scp -r -p ./src/* user@host:/var/www/html/ - 哪怕不用 CI/CD,也至少用
git archive打包发布:git archive --format=zip HEAD | ssh user@host 'cd /var/www/html && unzip -o /dev/stdin',天然排除 .git 和本地忽略文件 - 所有操作前先
whoami && pwd确认当前用户和路径——90% 的「同步到错目录」源于此
最麻烦的往往不是技术点,而是线上环境没做最小化隔离:比如没禁用 display_errors 导致敏感路径泄露,或者 .env 文件权限是 644 被 Web 直接访问。部署不是复制粘贴,是验证每层契约是否成立。











