WebHook触发后git pull权限被拒绝,根本原因是宝塔默认以www用户执行脚本,而仓库由root等其他用户初始化,导致www无权读取私钥或访问目录;需统一用www用户生成SSH密钥、克隆仓库、设置目录权限,并在脚本中显式指定GIT_SSH_COMMAND和绝对路径调用git。

WebHook 触发后 git pull 权限被拒绝?先确认执行用户
宝塔面板的 WebHook 脚本默认由 www 用户执行,而你的 Git 仓库很可能用 root 或其他用户初始化(比如用宝塔终端手动 git clone 过),导致 www 用户无权读取私钥或访问仓库目录。常见报错是:Permission denied (publickey) 或 fatal: Could not read from remote repository。
实操建议:
- 统一用
www用户操作:在宝塔终端切换用户后克隆仓库:sudo -u www git clone git@github.com:user/repo.git /www/wwwroot/example.com
- 确保
www用户有独立的 SSH key:生成时指定路径,避免覆盖 root 的~/.ssh/id_rsa,例如:sudo -u www ssh-keygen -t ed25519 -C "www@example.com" -f /www/.ssh/id_ed25519
- 把公钥(
/www/.ssh/id_ed25519.pub)添加到 GitHub/GitLab 的 Deploy Keys 中,并勾选「Allow write access」(仅需拉取可不勾) - 检查仓库目录权限:
sudo chown -R www:www /www/wwwroot/example.com
WebHook 脚本里为什么不能直接写 cd + git pull?
WebHook 执行时的工作目录不固定,cd 命令可能失效;且未设置 GIT_SSH_COMMAND 时,git 默认仍会尝试用当前用户的 ~/.ssh/config 或默认密钥,而不是你为 www 配的密钥。
实操建议:
- 脚本中用绝对路径调用
git,并显式指定 SSH 命令:sudo -u www /usr/bin/git --git-dir=/www/wwwroot/example.com/.git --work-tree=/www/wwwroot/example.com pull origin main
- 强制使用指定密钥:
sudo -u www GIT_SSH_COMMAND="ssh -i /www/.ssh/id_ed25519 -o StrictHostKeyChecking=no" /usr/bin/git --git-dir=/www/wwwroot/example.com/.git --work-tree=/www/wwwroot/example.com pull origin main
- 加
2>&1重定向错误输出,方便在宝塔 WebHook 日志里排查:... pull origin main 2>&1
GitHub WebHook 配置里 Payload URL 和 Secret 怎么填?
宝塔 WebHook 插件监听的是 /hook 接口,不是根路径;Secret 是用于校验请求来源合法性,不是密码,别和 Git 密钥混淆。
实操建议:
- Payload URL 填:
http://your-domain.com/hook?access_key=xxx(xxx是你在宝塔 WebHook 插件里设置的「访问密钥」,不是 GitHub 的 token) - Content type 选
application/json(GitHub 默认) - Secret 填宝塔插件里「密钥」字段的值(可留空,但建议设一个简单字符串如
webhook2024,并在脚本里做校验) - 只勾选
Just the push event,避免其他事件触发无效拉取
拉取后 PHP/Node.js 项目不生效?别忘了重启服务
代码更新了,但 PHP-FPM 进程或 Node.js 服务还在用旧代码内存,尤其 Laravel、ThinkPHP 等有缓存机制,或 PM2 管理的进程不会自动 reload。
实操建议:
- PHP 项目加缓存清理:
sudo -u www php /www/wwwroot/example.com/artisan config:clear 2>&1
- Node.js 项目用 PM2 的话,推荐用
pm2 reload而非restart(减少中断):sudo -u www pm2 reload app-name --update-env
- 如果用宝塔内置的 Node.js 管理器,脚本末尾加:
bash /www/server/panel/plugin/nodejs/nodejs.sh restart example.com
- 所有命令后都加
&& echo "done",方便看日志是否执行到底
www 用户拿不到有效 SSH 凭据,或者没权限读写目标目录,整个流程就静默失败。调试时优先看宝塔 WebHook 页面底部的「执行日志」,比看 GitHub 的 delivery logs 更直接。


















