当我尝试向 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) 应该就能解决。
