e
在使用git进行push或者hexo进行deploy时会出现下面问题:
1 | git@github.com: Permission denied (publickey). Could not read from remote repository |
Permission denied (publickey) 没有权限的publickey ,出现这错误一般是以下两种原因
- 客户端与服务端未生成 ssh key
- 客户端与服务端的ssh key不匹配
ssh
使用ssh公钥认证的方式可以免去ssh客户端(如ssh命令、xshell等)连接远端主机sshd时需要输入对方用户密码的问题。
但如果执行ssh命令所在的主机上保存了多套秘钥且将各公钥分发给了不同的远端主机,这时即使使用了公钥认证,也依然需要输入密码,因为ssh客户端不知道要读取哪个私钥去和该远端主机上的公钥配对。因此在把不同的公钥~/.ssh/id_rsa.pub
分发给了不同的主机后,在连接到主机时仍然需要输入密码,这是因为ssh客户端连接主机的时候,除了默认会读取的规范私钥文件id_rsa
(或其它秘钥类型)外,不会自动读取任何一个文件。
ssh-agent
程序员很不满意这样的连接方式,于是创造了一个中间的私钥管理者ssh-agent:你不是不知道怎么配对吗,我帮你配。而且这个功能对于程序员来说,so easy。
ssh认证的过程其实是客户端(ssh命令端)读取自己的私钥并推导出指纹发送给服务端(sshd端),服务端也使用自己保存的公钥推导出指纹进行对比,如果指纹相同说明服务端的公钥和客户端的私钥是配对的。
使用ssh-agent后,可以通过ssh-add命令向ssh-agent注册本机的私钥,ssh-agent会自动推导出这个私钥的指纹(实际上是ssh-add计算的)保存在自己的小本本里(内存),以后只要ssh连接某主机(某用户),将自动转发给ssh-agent,ssh-agent将自动从它的小本本里查找私钥的指纹并将其发送给服务端(sshd端)。如此一来,ssh客户端就无需再指定使用哪个私钥文件去连接。
客户端生成ssh key
执行:
1 | ssh-keygen -t rsa -C "2957286012@qq.com" |

在~/.ssh/
下会生成:

执行:
1 | ssh -v git@github.com |
这句代码是显示登录github的细节,输出:
1 | OpenSSH_8.5p1, OpenSSL 1.1.1k 25 Mar 2021 |
执行:
1 | ssh-agent -s |

执行:
1 | ssh-agent bash |

github服务器配置ssh
打开你刚刚生成的id_rsa.pub,将里面的内容复制,进入你的github账号,在settings下,SSH and GPG keys下new SSH key,然后将id_rsa.pub里的内容复制到Key中,完成后Add SSH Key。

验证
执行:
1 | ssh -T git@github.com |
结果是:
