GitHub Hosts 更新工具(仅限中国用户),安全更新系统hosts文件,保留原有非GitHub条目,仅替换GitHub相关地址。支持备份恢复和风险提示。用于解决GitHub访问问题。
不能,webhook需绕过shell限制:用sudo切换用户、显式设path/home、ssh免密或https token,并加错误拦截与日志。

WebHook 能否直接触发 git pull?不能,必须绕过交互式 Shell 限制
宝塔面板的 WebHook 功能本身不提供完整 Shell 环境,直接写 git pull 会卡在「需要输入密码」或「无法读取 SSH key」——因为 WebHook 进程默认以 www 用户运行,且无 TTY、无 SSH agent、HOME 目录也不对。真实部署必须用免密 + 显式指定用户 + 环境变量补全的方式执行。
- 必须用
sudo -u your_project_user切换到能访问仓库的用户(不能是www) - Git 必须配置为 SSH 免密(
ssh-add -l在目标用户下能列出 key)或使用 HTTPS + token(推荐https://token@github.com/...) - 脚本开头需手动设置
PATH和HOME,否则找不到git或读不到.gitconfig - WebHook 请求体默认是 JSON,宝塔只支持 POST,需用
curl -X POST模拟触发时注意加-H "Content-Type: application/json"
如何写一个安全可用的自动拉取脚本?关键三步:权限、路径、错误拦截
脚本不能裸跑,否则一次失败就导致后续所有更新静默失败。必须检查 Git 状态、校验分支、捕获退出码。
#!/bin/bash # /www/deploy/pull.sh export PATH="/usr/local/bin:/usr/bin:/bin" export HOME="/home/deploy" <p>cd /www/wwwroot/your-site.com || exit 1</p><h1>防止多人同时 push 导致冲突</h1><p>if [ -f .git/index.lock ]; then echo "git index locked, exit" >&2 exit 1 fi</p><h1>强制切换到预期分支(避免本地 HEAD 分离)</h1><p>git checkout main 2>/dev/null || exit 1 git pull origin main --ff-only 2>&1 RESULT=$?</p><p>if [ $RESULT -ne 0 ]; then echo "git pull failed with code $RESULT" >&2 exit $RESULT fi</p><h1>可选:重载 PHP-FPM 或重启 Node 服务</h1><h1>systemctl reload php-fpm-81</h1><p></p>
- 脚本必须
chmod +x /www/deploy/pull.sh,且属主为deploy(非www) -
--ff-only是硬性要求,避免意外 merge 导致线上代码混乱 - 不要在脚本里做
composer install或npm build,这些应由 CI 完成;WebHook 只负责「同步已构建好的产物」 - 日志建议重定向到
/www/deploy/pull.log,方便排查 WebHook 是否真被调用
宝塔 WebHook 配置里哪些字段最容易填错?
宝塔 WebHook 页面看着简单,但三个字段一错就完全不触发:
-
请求 URL填的是你自己的接收端,不是 GitHub 的地址 —— 宝塔这地方是「你主动去请求谁」,不是「别人请求你」;所以这里留空或填内网通知地址(如企业微信机器人),真正的触发靠外部调用 - 真正要用的是「自定义脚本」:勾选后,在下方文本框里填
sudo -u deploy /www/deploy/pull.sh,并确保www用户在/etc/sudoers中有免密权限:www ALL=(deploy) NOPASSWD: /www/deploy/pull.sh -
请求方式必须选POST,GET 不会传 body,而 GitHub/GitLab 的 WebHook 默认发 JSON body - 如果用 GitHub,Secret 建议开启,但宝塔 WebHook 不校验它 —— 所以真实生产环境应在 Nginx 层加 IP 白名单或用反向代理加鉴权
为什么 GitHub WebHook 测试成功但没拉代码?排查顺序看这四点
最常卡在环境不一致:你在终端手动执行脚本能成功,但 WebHook 就不行。
- 先查
sudo -u www bash -c 'echo $HOME; id',确认 WebHook 进程看到的HOME是/www,不是/home/deploy - 用
tail -f /var/log/secure看 sudo 是否被拒绝(常见于未加 NOPASSWD) - 检查
/www/deploy/pull.log有没有输出,没有说明脚本根本没运行,问题出在宝塔 WebHook 触发逻辑或权限配置 - GitHub WebHook 的「Recent Deliveries」里点开失败记录,看响应状态码:404 是 URL 错,500 是脚本崩溃,200 但没效果,说明脚本执行了但内部出错(比如
cd失败)
WebHook 自动部署不是开关一开就完事,本质是把「人手工执行的一串命令」变成「无上下文、无交互、无错误反馈」的机器行为。每一步缺失的环境变量、每一处没捕获的退出码,都会让整个流程静默失效。多打日志,少信「应该没问题」。










