github提示Permission denied (publickey),如何才能解决?

连接github时,公钥出现问题。执行 ssh -vT git@github.com后出现如下显示: OpenSSH_5.9p1 Debian-5ub…
关注者
109
被浏览
555,036

23 个回答

最佳实践所有命令预览: 基于本文方案二:电脑有多个git环境(公司电脑专用)

欢迎你回头客, 你可能拿到了一台新电脑, 还没遇到该问题, 但你还是想避免遇到这个问题, 你想到了我的这个回答, 那么恭喜你, 下面的命令可以完美避开该问题.

如何在一个全新的电脑上配置两个环境:

defaults write com.apple.Finder AppleShowAllFiles true
cd ~
OPEN .
mkdir .ssh
cd .ssh
ssh-keygen -t rsa
pbcopy < ~/.ssh/github_rsa.pub # 自动拷贝到粘贴板,并前往github.com的setting设置里粘贴
ssh-keygen -t rsa
pbcopy < ~/.ssh/gitlab_rsa.pub # 自动拷贝到粘贴板,并前往gitlab.com的setting设置里粘贴
vi ~/.ssh/config # 粘贴本文中git config 文件编写的最佳实践部分

在git工程中配置用户名

两个环境下, 需要在 git工程中配置提交者的信息, 将下面的邮箱和用户名部分, 改成你的自定义的设置.

git config  --global user.email "luohanchenyilong@163.com"; 
git config  --global user.name "ChenYilong"; 
git config --global credential.helper store; # git push的时候记住用户名和密码  

回到本问题

正文

首先确认下你的Linux/Mac/Wins当前用户对于 git 工程所在的本地文件夹, 是否具有777权限,没有的话,先设置一下.

因为即使你把 root 用户的 ssh 加到 GitHub 后, 操作系统的子账户并不能具有 ssh 的权限.

如果具有777权限,可以进行下面的检查:

下面的方案前提是你对文件夹有777权限.

(当然, 一般不会有问题. 这里只是出于严谨提醒下. 大部分人可忽略.)

方案一:电脑只有一个git环境(个人电脑专用)

如果你的电脑只有一个git环境,很可能电脑是你个人的 (具体为什么, 请看下文的“config 文件编写的最佳实践”部分), 那么极大多数情况是由于 GitHub 账号没有设置 ssh 公钥信息所致。 前往 GitHub 网站的"account settings"

依次点击"Setting -> SSH Keys"->"New SSH key"

Title处填写“id_rsa.pub”或其他任意信息。 key处原样拷贝下面命令的打印 ~/.ssh/id_rsa.pub 文件的内容:

cat ~/.ssh/id_rsa.pub      # 控制台上输出内容
pbcopy < ~/.ssh/id_rsa.pub # 自动拷贝到粘贴板

如没有则按下述方法生成:

ssh-keygen -t rsa

输入文件名的地方输入可以输入自定义文件名,默认是id_rsa,然后一路回车......

注意如果自定义文件名的话,需要加一个config文件,下文有介绍。

最后,输入

ssh -T git@github.com

或者下面的命令, 区别就是会多打印日志.

ssh -Tv git@github.com

如果没有报错,
再尝试输出就应该有了

cat ~/.ssh/id_rsa.pub      # 控制台上输出内容
pbcopy < ~/.ssh/id_rsa.pub # 自动拷贝到粘贴板

或者说设置了 sshkey 还是 permission denied 怎么回事?

回到如下命令,检查当前配置的SSH对应的git账号;

ssh -T git@github.com

然后用如下命令(id_rsa对应目标账户的私钥)命令,制定目标Git账号

ssh-add -k ~/.ssh/id_rsa


方案二:电脑有多个git环境(公司电脑专用)


如果尝试了上面的方法还是不行,那么可能你用了多个密钥,可能电脑有多个git环境, 你很可能用的是公司电脑(具体为什么, 请看下文的“config 文件编写的最佳实践”部分),


你在新建秘钥的时候使用了自定义的名称,比如 github_rsa,你需要再配置一个 config 文件

cd ~/.ssh/

vi config

输入以下内容:

Host github
    User git  
    HostName github.com
    PreferredAuthentications publickey
    IdentityFile ~/.ssh/github_rsa
    ServerAliveInterval 300
    ServerAliveCountMax 10

ESC+:wq保存退出

重新尝试以下命令即可搞定:

注意⚠️:@ 符号前后的参数要与上面 User 和 HostName对应上,一般公司内部的代码仓库都是自定义的,注意修改上面的参数然后再匹配下面的进行测试:

ssh -T git@github.com

或者下面的命令, 区别就是会多打印日志.

ssh -Tv git@github.com

注意下面的K是小写:

ssh-add -k ~/.ssh/github_rsa

git config 文件编写的最佳实践


上面主要是报错后的排查错误过程, 如何避免这个报错呢?毕竟电脑几年就一换, 环境一配置就配一天. 每次都遇到这个错误?

给大家看看 config 文件编写的最佳实践, 直接避免permission denied:

新拿到一台电脑, 如果是个人电脑,通常只会有一个git环境. 一般不需要多环境了, (个人电脑很少情况能跑公司项目的) , 不需要自定义config文件内容, 那么直接参考上文的“电脑只有一个git环境(个人电脑专用)”部分.

如果拿到一台公司电脑, 那么就请按照下面的最佳实践配置下git的多环境:

请先把

vi ~/.ssh/config

并输入一下内容:

# gitlab
Host gitlab
    User git
    HostName gitlab.company.com
    PreferredAuthentications publickey
    IdentityFile ~/.ssh/gitlab_rsa
    ServerAliveInterval 300
    ServerAliveCountMax 10
# github
Host github
    User git
    HostName github.com
    PreferredAuthentications publickey
    IdentityFile ~/.ssh/github_rsa
    ServerAliveInterval 300
    ServerAliveCountMax 10

这里唯一需要替换的gitlab里的HostName部分, 改成你们公司的git地址.

现在几乎所有的公司代码仓库都是gitlab搭建, (如果不是gitlab搭建, 这个公司可以选择run了.兄弟你咋想不开, 选择进了这么个公司?)

而你自己也肯定要用GitHub, (什么?你没GitHub账号? 先问问自己这家公司你能不能干到35岁吧?不能的话注册个吧,维护下, 裁员找工作有用.)

所以我们有了命名共识:

GitHub == 私人git环境
gitlab == 企业git环境

所以即使你跳槽换个公司, 新电脑内也是gitlab加上GitHub两套环境. 所以我称这个配置为最佳实践.

配置完config, 再去执行文章顶部关于git多环境描述的部分.

这样设置config的好处:

config内的文件名约定后, 命令就能写死:


遇到GitHub报permission denied错就执行

ssh-add -k ~/.ssh/github_rsa

遇到gitlab报permission denied错就执行:

ssh-add -k ~/.ssh/gitlab_rsa

如果还是报错

Host key for GitHub: Let’s build from here has changed and you have requested strict checking.
Host key verification failed.

那就执行

ssh-keyscan -t rsa github.com >> ~/.ssh/known_hosts

默认使用id_rsa尝试

如果你在新建秘钥的时候使用了自定义的名称,比如github_rsa,你需要再配置一个config文件

cd ~/.ssh/

vi config

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

ESC+:wq保存退出

重新尝试ssh -T git@github.com,即可搞定