git clone, Permission denied (publickey). fatal: Could not read from remote repository.

本文详细介绍了在使用Git Clone Recursive命令时遇到的权限问题及其解决步骤,包括生成SSH Key、添加SSH Key到GitHub账户、验证Key等,帮助读者顺利克隆带有子模块的GitHub项目。

作者:王老头
出处:http://www.cnblogs.com/wmr95/p/7852832.html

博主在github上下载tiny face的的源代码的时候,遇到git clone命令为:git clone --recursive git@github.com:peiyunh/tiny.git

而当我在ternimal下执行这条语句的时候,出现错误:

Permissiondenied (publickey).

fatal:Could not read from remote repository.

Pleasemake sure you have the correct access rights

and the repository exists.

但是其实执行命令:git clone git@github.com:peiyunh/tiny.git 是没有问题的(不加–recursive参数),于是百度了一番,我理解的是原因是由于你在本地(或者服务器上)没有生成ssh key,你可以在ternimal下执行:

cd ~/.ssh ls来查看是否有文件id_rsa以及文件id_rsa.pub,如下图所示:(我的已经生成了,所以我ls后会显示。)

下面记录下解决办法:

1.首先,如果你没有ssh key的话,在ternimal下输入命令:ssh-keygen -t rsa -C "youremail@example.com", youremail@example.com改为自己的邮箱即可,途中会让你输入密码啥的,不需要管,一路回车即可,会生成你的ssh key。(如果重新生成的话会覆盖之前的ssh key。)

2.然后再ternimal下执行命令:

ssh -v git@github.com

最后两句会出现:

No more authentication methods to try.

Permission denied (publickey).

3.这时候再在ternimal下输入:

ssh-agent -s

然后会提示类似的信息:

SSH_AUTH_SOCK=/tmp/ssh-GTpABX1a05qH/agent.404; export SSH_AUTH_SOCK;

SSH_AGENT_PID=13144; export SSH_AGENT_PID;

echo Agent pid 13144;

4.接着再输入:

ssh-add ~/.ssh/id_rsa

这时候应该会提示:

Identity added: …(这里是一些ssh key文件路径的信息)

(注意)如果出现错误提示:

Could not open a connection to your authentication agent.

请执行命令:eval ssh-agent -s后继续执行命令 ssh-add ~/.ssh/id_rsa,这时候一般没问题啦。

5.打开你刚刚生成的id_rsa.pub,将里面的内容复制,进入你的github账号,在settings下,SSH and GPG keys下new SSH key,title随便取一个名字,然后将id_rsa.pub里的内容复制到Key中,完成后Add SSH Key。

6.最后一步,验证Key

在ternimal下输入命令:

ssh -T git@github.com

提示:Hi xxx! You’ve successfully authenticated, but GitHub does not provide shell access.

这时候你的问题就解决啦,可以使用命令 git clone --recursive git@github.com:peiyunh/tiny.git 去下载你的代码啦。

你遇到的错误是: ``` Permission denied (publickey). fatal: Could not read from remote repository. ``` 这说明: ✅ SSH 连接已建立(网络通) ❌ 但你的公钥未被 Gerrit 接受 → 认证失败 --- ## ✅ 错误原因总结 `Permission denied (publickey)` 表示: - SSH 服务正在运行(Gerrit 可达) - 你尝试使用 SSH 密钥登录 - **但服务器不认可你提供的公钥** 常见原因如下: | 原因 | 说明 | |------|------| | 1. 公钥未添加到 Gerrit | 最常见!私钥在本地,但公钥没上传 | | 2. 使用了错误的密钥 | 系统默认找 `~/.ssh/id_rsa`,但你可能用了别的 | | 3. ssh-agent 没有加载正确私钥 | 即使密钥存在,agent 不加载也无法认证 | | 4. Gerrit 用户名不匹配 | SSH 登录用户名 ≠ Gerrit 账户绑定的 username | | 5. 多个密钥冲突 | agent 加载了多个 key,服务器拒绝所有 | --- ## ✅ 解决方案(一步步来) ### 🔹 步骤 1:确认你使用的 SSH 命令格式正确 典型的 Gerrit clone 命令是: ```bash git clone ssh://<your-username>@gerrit.example.com:29418/project-name ``` 📌 注意: - `<your-username>` 是你在 Gerrit 中的 **SSH 登录用户名**,不是邮箱! - 不是网页登录账号,而是专门设置的 `Username`(可在 Gerrit 设置中查看) 👉 查看方法: 1. 登录 Gerrit Web 界面 2. 点击右上角头像 → **Settings** 3. 左侧点击 **Profile** 4. 查看 “Username” 字段(例如:`zhangsan`) 所以你应该用: ```bash git clone ssh://zhangsan@gerrit.example.com:29418/my-project ``` 而不是随便写一个名字。 --- ### 🔹 步骤 2:检查是否生成了 SSH 密钥对 运行: ```bash ls ~/.ssh/ ``` 看看有没有: - `id_rsa` 和 `id_rsa.pub`(或 `id_ed25519`, `id_ecdsa` 等) - 如果没有,请先生成: ```bash ssh-keygen -t rsa -b 4096 -C "your.email@example.com" -f ~/.ssh/id_rsa_gerrit ``` > 建议为 Gerrit 单独生成一对密钥,避免和其他服务混淆 --- ### 🔹 步骤 3:将公钥内容上传到 Gerrit 显示公钥内容: ```bash cat ~/.ssh/id_rsa_gerrit.pub ``` 输出类似: ``` ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQD... your.email@example.com ``` 复制整行(包括 `ssh-rsa` 开头和你的邮箱),然后: 1. 登录 Gerrit Web 界面 2. 进入 **Settings → SSH Public Keys** 3. 点击 “Add Key” 4. 粘贴上面的内容 5. 保存 ✅ 成功后,Gerrit 就会信任你的私钥 --- ### 🔹 步骤 4:确保 ssh-agent 正确加载了私钥 启动 agent 并添加密钥: ```bash # 启动 agent eval $(ssh-agent) # 添加你的私钥 ssh-add ~/.ssh/id_rsa_gerrit ``` 验证是否加载成功: ```bash ssh-add -l ``` 你应该看到类似输出: ``` 4096 SHA256:abcdef... id_rsa_gerrit (RSA) ``` 如果没有 → 再次运行 `ssh-add` --- ### 🔹 步骤 5:测试 SSH 连接(不要直接 git clone) 使用调试模式连接: ```bash ssh -v -p 29418 zhangsan@gerrit.example.com ``` 观察输出中的关键部分: ```text debug1: Offering public key: /home/user/.ssh/id_rsa_gerrit RSA SHA256:... explicit debug1: Server accepts key: /home/user/.ssh/id_rsa_gerrit RSA SHA256:... debug1: Authentication succeeded ``` 如果出现这些日志 → ✅ 认证成功! 你会看到欢迎信息: ``` Hi zhangsan, you have successfully connected over SSH. ``` 即使提示“interactive shells are disabled”,也没关系 —— 这正是 Gerrit 的正常行为。 --- ### 🔹 步骤 6:配置 Git 使用正确的密钥(可选但推荐) 编辑 `~/.ssh/config` 文件(没有就创建): ```bash nano ~/.ssh/config ``` 添加以下内容: ``` Host gerrit HostName gerrit.example.com Port 29418 User zhangsan IdentityFile ~/.ssh/id_rsa_gerrit IdentitiesOnly yes ``` 保存退出。 现在你可以这样克隆: ```bash git clone ssh://gerrit/project-name ``` Git 会自动使用指定密钥,避免混淆。 --- ## 🧪 完整示例流程(建议照做一遍) ```bash # 1. 生成专用密钥 ssh-keygen -t rsa -b 4096 -C "me@company.com" -f ~/.ssh/id_rsa_gerrit # 2. 查看公钥并复制 cat ~/.ssh/id_rsa_gerrit.pub # 把输出粘贴到 Gerrit Settings → SSH Public Keys # 3. 启动 agent 并加钥 eval $(ssh-agent) ssh-add ~/.ssh/id_rsa_gerrit # 4. 测试连接(替换真实地址) ssh -v -p 29418 zhangsan@gerrit.example.com ``` 如果最后一步能看到欢迎语 → 就可以正常使用 `git clone` 了! --- ## ❗ 常见陷阱提醒 | 问题 | 如何避免 | |------|----------| | 用错了用户名 | 必须使用 Gerrit Profile 中的 `Username`,不是邮箱 | | 忘记加 `ssh-add` | 每次新开终端都要重新加载 | | 使用 PuTTY / Pageant | Git Bash 不识别 `.ppk` 文件,必须用 OpenSSH 格式 | | 公钥复制不完整 | 必须复制整行,不能漏掉开头 `ssh-rsa` 或结尾邮箱 | ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值