permission denied (publickey) 是因 git 以 www 用户执行时缺少对应 ssh 密钥及配置;需切换至 www 用户生成 ed25519 密钥、添加公钥到远程平台、显式指定 sshcommand 路径并确保环境与工作目录正确。

Git拉取报错 Permission denied (publickey) 怎么办
这是宝塔面板里用 Git 拉代码最常遇到的权限问题,根本原因不是宝塔本身限制,而是 Git 通过 SSH 协议连接远程仓库时,系统找不到可用的私钥,或密钥没被正确加载。宝塔默认以 www 用户运行站点命令(比如计划任务、WebHook 脚本),但该用户通常没有 ~/.ssh 目录,也未配置 SSH agent。
为什么不能直接用 root 的密钥
因为宝塔执行 Git 命令时默认不切换到 root,而是在站点根目录下以 www 用户身份调用 shell(例如通过「网站」→「设置」→「Shell」或「计划任务」)。即使你把密钥放在 /root/.ssh/,www 用户也无权读取,且 SSH 默认不会跨用户查找密钥。
-
www用户家目录通常是/www,不是/root - SSH 客户端只在当前用户家目录的
.ssh/下找密钥,除非显式指定-i - 宝塔的「Shell」界面和计划任务脚本默认不启动 SSH agent,所以
ssh-add加载无效
在宝塔中正确配置 SSH 密钥的三步实操
核心是:让 www 用户拥有自己的密钥对,并确保 Git 命令能自动使用它。不需要改宝塔源码,也不用开密码登录。
- 用终端登录服务器,切换到
www用户:sudo -u www -s - 生成密钥对(不要设密码,否则自动拉取会卡住):
ssh-keygen -t ed25519 -C "www@your-server" -f /www/.ssh/id_ed25519 - 把生成的公钥内容(
cat /www/.ssh/id_ed25519.pub)完整复制,粘贴到 GitHub/GitLab 的 SSH Keys 设置页 - 测试连通性:
ssh -T git@github.com(注意必须在www用户下执行) - 在宝塔「Shell」或脚本中拉代码时,显式指定密钥路径更稳妥:
git clone -o origin git@github.com:user/repo.git --config core.sshCommand="ssh -i /www/.ssh/id_ed25519"
计划任务里拉代码失败的常见坑
很多用户把 Git 命令写进宝塔计划任务后仍失败,不是密钥问题,而是环境缺失:
- 计划任务默认不加载
~/.bashrc或~/.profile,所以PATH可能不含git,建议写绝对路径:/usr/bin/git pull - 工作目录没指定,
git不知道该在哪操作,必须加cd /www/wwwroot/your-site && - 如果用 WebHook 触发脚本,确保脚本开头有
#!/bin/bash,且用sudo -u www包裹关键命令 - Git 配置需对
www用户生效:sudo -u www git config --global user.name "www"和sudo -u www git config --global user.email "www@localhost"
最关键的细节是:所有操作都得在 www 用户上下文里完成,包括生成密钥、测试连接、配置 Git。漏掉任何一步,都会回到 Permission denied (publickey)。











