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.

我的处理方式是检查 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

配置你的客户端

  1. 生成密钥:

```bash
ssh-keygen
```

  1. 配置 SSH 使用该密钥:

```bash
vim ~/.ssh/config
```

  1. 将密钥复制到你的服务器:

```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

Leave a Reply