使用ssh连接github或gitee - 已创建密钥但依旧无法使用git命令无法连接, 显示git@github.com: Permission denied (publickey).

发布时间 2023-11-17 16:46:38作者: Faserr

阅读须知

本文面向入门, 可能有出现错误的情况, 欢迎指出.
本文主要引导解决与发现问题的方法, 解决方案可以翻到最下面

代码块中
$ 开头表示输入内容
> 开头代表输出内容
# 后面代表注释的内容
示例如下

$ 我是输入内容
> 我是输出内容 # 我是注释,用于解释发生了什么

场景

在添加ssh的教程中,一般都会让我们使用ssh git@github.com验证是否连接成功

首先按需求使用ssh-keygen创建密钥(请确保密钥在~/.ssh中)

> Enter file in which to save the key: mykey # 请记住这里, 是出现问题的主要原因
> Enter passphrase (empty for no passphrase): 114514 # 这一步和下一步都是设置密码, 不输入也可以. 实际输入的时候你是看不到内容的, 这是正常现象.
> Enter same passphrase again:114514

使用'ssh git@github.com'连接

此时请确保已将公钥(.pub)!!!添加到github/gitee

$ ssh git@github.com
> git@github.com: Permission denied (publickey).

可以看到明明在github/gitee添加了公钥, 私钥位置也没问题, 但是却依旧连接失败

原因

这里可以用到 -v 参数, 这个参数可以显示连接时的日志.

使用-vvv能看到更详细的信息, 但这里不需要, 对这些信息代表什么感兴趣的可以去看看ssh连接调试.

$ssh git@github -v
...
> debug1: Will attempt key: /c/Users/xxx/.ssh/id_rsa
> debug1: Will attempt key: /c/Users/xxx/.ssh/id_ecdsa
> debug1: Will attempt key: /c/Users/xxx/.ssh/id_ecdsa_sk
> debug1: Will attempt key: /c/Users/xxx/.ssh/id_ed25519
> debug1: Will attempt key: /c/Users/xxx/.ssh/id_ed25519_sk
> debug1: Will attempt key: /c/Users/xxx/.ssh/id_xmss
> debug1: Will attempt key: /c/Users/xxx/.ssh/id_dsa
...

可以看到, 连接日志并没有尝试我们的/c/Users/xxx/.ssh/mykey私钥

那么原因已经出来了: 因为我们命名了密钥, 但是ssh连接默认是会使用默认名称的, 并不是我们放在~./ssh目录下就自动读取

解决方案

知道了原因, 解决方法就是告诉ssh去使用我们的密钥, 主要有以下两种方法

1. 使用-i参数指定私钥位置

这种方法每次都要指定私钥位置, 不方便, 不太推荐

$ ssh git@github -i ~/.ssh/mykey   # 这里mykey是你命名的私钥名称

2. 使用config配置文件

~/.ssh/config添加文件config
在里面添加内容

Host github.com
	User git
	IdentityFile ~/.ssh/mykey   # 这里mykey换成你命名的私钥名称

在配置文件中使用配置项IdentityFile 指定了连接github使用的密钥.
再次尝试, 已经可以正常连接了.

3. 拓展内容

关于ssh, config里还有许多方便的配置, 感兴趣也可以去了解一下.
比如

Host github
	HostName github.com
	User git
	IdentityFile ~/.ssh/mykey

这样甚至可以直接使用ssh github连接

只是用于示例, git没有必要这样使用