github提示Permission denied (publickey),如何才能解决?
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,即可搞定