我在 EC2 上向自己的 Git 服务器运行 git push 时遇到了一个问题:
sign_and_send_pubkey: signing failed: agent refused operation
Permission denied (publickey).
fatal: Could not read from remote repository.
我的处理方式是检查 Git 远程 URL,在必要时刷新 SSH 主机密钥,并确认正确的 SSH 密钥已经生成、加载并注册。
我当时参考的原始资料:
- <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/>
抱歉之前漏掉了第二个来源链接;如果之后找到,我会补上。
检查远程 URL
首先,检查你的远程 URL 是否正确:
git remote -v
如果它已经过期,或者指向了错误的主机,就更新它:
git remote set-url origin git://new.url.here
对于 SSH 远程仓库,URL 通常更像这样:
git remote set-url origin git@github.com:USER/REPO.git
或者,对于私有 Git 服务器:
git remote set-url origin USERNAME@SERVERNAME:/path/to/repo.git
刷新 known_hosts
如果错误与主机密钥验证有关,确认 ~/.ssh 存在,并添加服务器的主机密钥。
对于 GitHub:
mkdir -p ~/.ssh
ssh-keyscan -t rsa github.com >> ~/.ssh/known_hosts
对于你自己的服务器,把 github.com 替换为服务器名称或 IP 地址:
ssh-keyscan -t rsa SERVERNAME >> ~/.ssh/known_hosts
如果你已经有 ~/.ssh/known_hosts,不要删除它,除非你清楚为什么现有的主机密钥是错的。如果主机密钥意外发生变化,请先验证服务器指纹,再接受新的密钥。
生成 SSH 密钥
如果你还没有密钥,就生成一个:
ssh-keygen -t rsa -C "user.email"
默认的公钥路径通常是:
~/.ssh/id_rsa.pub
把这个 .pub 文件的内容添加到你的 GitHub 个人资料的 SSH keys 列表中,或者添加到你的 Git 服务器的 authorized keys 中。
对于 GitHub,可以用下面的命令打印公钥:
cat ~/.ssh/id_rsa.pub
配置你的客户端
- 生成密钥:
```bash
ssh-keygen
```
- 配置 SSH 使用该密钥:
```bash
vim ~/.ssh/config
```
- 将密钥复制到你的服务器:
```bash
ssh-copy-id -i /path/to/key.pub SERVERNAME
```
第 2 步中的配置文件应包含类似下面的内容:
Host SERVERNAME
HostName ip-or-domain-of-server
User USERNAME
PubkeyAuthentication yes
IdentityFile /path/to/key
IdentityFile 请使用绝对路径,例如:
IdentityFile ~/.ssh/id_rsa
将密钥加载到 ssh-agent
如果你看到这个错误:
sign_and_send_pubkey: signing failed: agent refused operation
启动 ssh-agent 并添加你的密钥:
eval "$(ssh-agent -s)"
ssh-add ~/.ssh/id_rsa
然后测试 SSH 连接。
对于 GitHub:
ssh -T git@github.com
对于你自己的服务器:
ssh -T SERVERNAME
SSH 认证可用后,再次尝试 Git 命令:
git push
