PERMISSION DENIED (PUBLICKEY).

当我尝试向 EC2 上的 Git 服务器运行 git push 时遇到了一个问题。错误信息看起来像这样:

sign_and_send_pubkey: signing failed: agent refused operation
Permission denied (publickey).
fatal: Could not read from remote repository.

我在修复时参考了这些资料:

  • <http://stackoverflow.com/questions/13363553/git-error-host-key-verification-failed-when-connecting-to-remote-repository>
  • <https://chenhuachao.com/2016/05/26/ssh%E5%87%BA%E9%94%99-sign-and-send-pubkey-signing-failed-agent-refused-operation/>

设置 SSH 客户端

首先确保 .ssh 目录存在,并且权限安全:

mkdir -p ~/.ssh
chmod 700 ~/.ssh

如果失败原因与主机密钥验证有关,请把远程主机加入 known_hosts。以 GitHub 为例:

ssh-keyscan -t rsa github.com >> ~/.ssh/known_hosts
chmod 600 ~/.ssh/known_hosts

如果是你自己的 Git 服务器,请将 github.com 替换为服务器的域名或 IP 地址。

接下来,如果还没有 SSH 密钥,就生成一个:

ssh-keygen -t rsa -C "user.email"

这通常会创建:

~/.ssh/id_rsa
~/.ssh/id_rsa.pub

将公钥添加到接收 Git 连接的远程账户中。对于 GitHub,把 id_rsa.pub 的内容添加到 GitHub 个人资料中的 SSH keys 列表。对于自托管 Git 服务器,把公钥添加到远程用户的 ~/.ssh/authorized_keys 文件,或者使用:

ssh-copy-id -i ~/.ssh/id_rsa.pub USERNAME@SERVERNAME

配置 SSH 使用该密钥

编辑你的 SSH 配置:

vim ~/.ssh/config

添加一个类似这样的主机条目:

Host SERVERNAME
  HostName ip-or-domain-of-server
  User USERNAME
  PubkeyAuthentication yes
  IdentityFile ~/.ssh/id_rsa

然后确保配置文件拥有正确权限:

chmod 600 ~/.ssh/config

启动 SSH Agent

当 SSH agent 没有正确运行,或者密钥尚未加载时,可能会出现 sign_and_send_pubkey: signing failed: agent refused operation 这条信息。启动 agent 并添加密钥:

eval "$(ssh-agent -s)"
ssh-add ~/.ssh/id_rsa

可以用下面的命令检查已加载哪些密钥:

ssh-add -l

测试连接

在再次尝试 git push 之前,先直接测试 SSH:

ssh -T git@github.com

对于自托管 Git 服务器,请使用已配置的主机:

ssh -T SERVERNAME

如果连接正常,再次尝试 Git 命令:

git push

如果仍然失败,请检查 Git 远程 URL 使用的是 SSH 而不是 HTTPS:

git remote -v

SSH 远程地址通常类似下面其中一种:

git@github.com:USER/REPO.git
USERNAME@SERVERNAME:/path/to/repo.git

当密钥已加载、主机已被信任,并且远程 URL 指向正确的 SSH 主机后,Permission denied (publickey) 应该就能解决。

Leave a Reply