问题背景和需求
需求:可以同时拉取公司gitlab仓库代码、自己的gitbub仓库代码及gitee仓库代码到本地
问题:gitbub拉取代码没问题、gitee和gitlab出现如下 问题1,以及后续在尝试解决问题的过程中出现 问题2和问题3
问题1: ERROR: Repository not found, fatal: 无法读取远程仓库
问题2: kex_exchange_identification: Connection closed by remote host
问题3: ssh: connect to host gitlab.xx.com.cn port 443: Connection refused
问题的本机环境:
查看~/.ssh 有以下文件:
drwx------ 5 User staff 160 5 15 09:52 .
drwxr-xr-x+ 59 User staff 1888 5 15 09:50 ..
-rw------- 1 User staff 444 5 15 09:50 id_rsa.github
-rw-r--r-- 1 User staff 124 5 15 09:50 id_rsa.github.pub
-rw------- 1 User staff 444 5 15 09:50 id_rsa.gitlab
-rw-r--r-- 1 User staff 124 5 15 09:50 id_rsa.gitlab.pub
-rw------- 1 User staff 444 5 15 09:50 id_rsa.gitee
-rw-r--r-- 1 User staff 124 5 15 09:50 id_rsa.gitee.pub
-rw-r--r--@ 1 User staff 570 5 15 09:53 known_hosts
-rw-r--r--@ 1 User staff 570 5 15 09:53 config
其中config用户配置内容如下:
# Default gitHub user Self
Host github.com
Port 443
HostName github.com
User git
IdentityFile ~/.ssh/id_rsa.github
# Add gitLab user
Host git@gitlab.com
HostName gitlab.com
User git
IdentityFile ~/.ssh/id_rsa.gitlab
# Add gitee
Host gitee.com
Port 22
HostName gitee.com
User git user
IdentityFile ~/.ssh/id_rsa.gitee
# Add Company
Host git@gitlab.xx.com.cn
HostName http://gitlab.xx.com.cn
User gitLab user
IdentityFile ~/.ssh/id_rsa.gitlab
我理解的问题原因(不一定准确):以上问题的出现在于用户配置文件config中内容与known_hosts配置冲突,在clone时出现了连接匹配不正确。
在参考网上解决方案的时候往往会与预期出现不一致的结果,同时可能会引发新的问题,因为网上提供解决方案的作者电脑环境和配置是与读者可能存在差别,所以不一定完全适用于自己,那么此时可以通过遵循官方文档的方式,还原本机原始状态,清空本机原有配置,然后按照文档提供的步骤重新开始安装、配置、测试。
使用 SSH 连接到 GitHub
使用 SSH 连接到 Gitee
使用 SSH 连接到 GitLab
本次解决步骤
截图里电脑已经安装了github/gitlab的配置后,再次添加gitee的ssh配置操作
0. 前置
- 如果之前有配置过某个ssh,可删除
.ssh目录 - 删除
gitlab、github、gitee平台中在用户-设置-SSH 配置页所添加的publicKey 譬如github SSH And GPG keys,命令如下:
rm -rf ~/.ssh 删除~/.ssh文件夹
ls ~/.ssh 查看~/.ssh 此时为空文件夹
open ~/.ssh/known_hosts 如果删除无法打开
// 其他操作命令
vim ~/.ssh/known_hosts 编辑~/.ssh/known_hosts
1. 查看git用户配置
git config --global --list
2. 删除全局git用户配置
$ git config --global --unset user.name "xxx"
$ git config --global --unset user.email "xxx@yyy.com"
3. 分别为gitlab、github、gitee生成SSH key
注意:这里的 xxx@yyy.com 只是生成的 sshkey 的名称,并不约束或要求具体命名为某个邮箱,同时id_ed25519_hub/id_ed25519.gitlab/id_ed25519.gitee分别对应github/gitlab/gitee生成了id_ed25519文件。
ssh-keygen -t ed25519 -f ~/.ssh/id_ed25519.hub -C "xxx@yyy.com"
ssh-keygen -t ed25519 -f ~/.ssh/id_ed25519.gitlab -C "xxx@yyy.com
ssh-keygen -t ed25519 -f ~/.ssh/id_ed25519.gitee -C "xxx@yyy.com"
4. 查看~/.ssh目录的github/gitlab/gitee的id_ed25519`文件
ls -al ~/.ssh
// 结果如下,会看到用户.ssh通过第3步所生成了不同的id_ed25519文件
drwx------ 10 user staff 320 1 8 10:50 **.**
drwxr-xr-x+ 58 user staff 1856 1 8 11:20 **..**
-rw-r--r--@ 1 user staff 356 1 8 10:50 config
-rw------- 1 user staff 399 12 27 2022 id_ed25519
-rw------- 1 user staff 387 1 8 10:35 id_ed25519.gitee
-rw-r--r-- 1 user staff 86 1 8 10:35 id_ed25519.gitee.pub
-rw-r--r-- 1 user staff 94 12 27 2022 id_ed25519.pub
-rw------- 1 user staff 419 2 20 2023 id_ed25519_hub
-rw-r--r-- 1 user staff 105 2 20 2023 id_ed25519_hub.pub
-rw-r--r--@ 1 user staff 745 1 8 10:39 known_hosts
5. 将第3步产生的ssh key添加到ssh-agent,根据你的环境,使用不同的命令
ssh-agent bash
ssh-add ~/.ssh/id_ed25519.hub
ssh-add ~/.ssh/id_ed25519.gitlab
ssh-add ~/.ssh/id_ed25519.gitee
6. 配置config(我自己解决并没有创建config),如果有需要,可以根据自己本机环境是否需要添加,可以参考Generating a new SSH key and adding it to the ssh-agent和config The contents to be filled in are as follows
7. 查看
~/.ssh目录的config文件,我电脑可用的配置信息如下:
# gitlab
Host git@gitlab.xxx.com
HostName git@gitlab.xxx.com
PreferredAuthentications publickey
IdentityFile ~/.ssh/id_ed25519
# github
Host github.com
AddKeysToAgent yes
UseKeychain yes
IdentityFile ~/.ssh/id_ed25519_hub
# gitee
Host gitee.com
AddKeysToAgent yes
UseKeychain yes
IdentityFile ~/.ssh/id_ed25519.gitee
8. 新增 SSH 密钥到 GitHub、Gitee、GitLab 帐户,参考adding-a-new-ssh-key-to-your-github-account
9. 测试 SSH 连接,参考testing-your-ssh-connection
ssh -T git@github.com
ssh -T git@gitlab.com
ssh -T git@gitee.com
10. 测试克隆仓库结果,如上图,已成功克隆三大平台仓库代码
其他:ssh-keygen命令摘要,如ssh-keygen -R HOSTNAME
b “Bits” 此选项指定密钥中的位数。管理 SSH 用例的法规可能要求使用特定的密钥长度。一般来说,2048 位被认为足以用于 RSA 密钥。
e “Export” 此选项允许在 OpenSSH 密钥文件格式和[RFC 4716](https://tools.ietf.org/html/rfc4716) “SSH Public Key File Format”中记录的格式之间重新格式化现有密钥。
p [-P old_passphrase] “Change the passphrase” 此选项允许使用和 [-N new_passphrase],更改私钥文件的密码` [-f keyfile] `。
t “Type” 此选项指定要创建的密钥的类型。常用值有:rsa表示[RSA]
i "Input" 当需要*ssh-keygen*来访问现有密钥时,此选项指定文件。
f "File" 指定存储创建的密钥的文件的名称。
N "New" 为密钥提供新密码。
P "Passphrase" 在读取密钥时提供(旧)密码。
c "Comment" 更改密钥文件的注释。
p 更改私钥文件的密码。
q ssh-keygen。
v 详细模式。
l "Fingerprint" 打印指定公钥的指纹。
B "Bubble babble" 显示密钥文件的“bubble babble”(Tectia 格式)指纹。
F 在 known_hosts 文件中搜索指定的主机名。
R 从 known_hosts 文件中删除属于主机名的所有密钥。
y 读取私有 OpenSSH 格式文件并将 OpenSSH 公钥打印到标准输出。
问题3: ssh: connect to host gitlab.xx.com.cn port 443: Connection refused或者ssh: connect to host gitee.com port 22: Operation timed out
以上问题3可能解决的方案
原因:可能是etc/hosts里的ip和domain映射有问题或者是~/.ssh/config所配置Port不匹配
- 先在终端
ping gitee.com或者ping github.com,此时一般会timeout
Request timeout for icmp_seq 0
Request timeout for icmp_seq 1
Request timeout for icmp_seq 2
- 可以找到
hosts,如我的电脑hosts里历史配置有180.97.125.228 gitee.com,直接删除这一行,或者删除下~/.ssh/config的端口号
hosts文件中
****Mac**修改**hosts****
1. 打开终端,输入 sudo vi /etc/**hosts** ,回车。
1. 输入密码,回车,**hosts**文件就打开了。
1. 输入 i ,即insert,进入**编辑**模式,输入需要映射的ip和域名。
1. 待**编辑**完毕后,按esc键结束**编辑**模式,输入 :wq 保存并退出。
##
# Host Database
##
127.0.0.1 localhost
180.97.125.228 gitee.com // 直接将这一行删除
# End of section
~/.ssh/config文件中
# gitee
Host gitee.com
AddKeysToAgent yes
UseKeychain yes
IdentityFile ~/.ssh/id_ed25519.gitee
Port 22 // 直接将这一行删除
3.再次执行ssh -T git@gitee.com,成功授权
ssh -T git@gitee.com
Hi xx! You've successfully authenticated, but GITEE.COM does not provide shell access.
总结
解决问题是一个寻求解决方案资源、不断调试验证的过程,如何找到优质资源,如何理解内容,因人而异,更重要的是需要针对知识缺口、缺乏体系化的思维和架构进行查漏补缺,同时将资源、知识整合成网络并相互关联起来,让读者和作者的语言是互通的,如果针对一个问题能够以点带面的去研读相关官方论文和成套的文档资料,真正深入理解,才能形成一套如何去解决问题的一套模型,或许在遇到不同类型的问题再去解决时,根据过去建立起来的模型与经验,能够达到事半功倍的目的。我认为我虽然达成了我这次的需求和目的,但是这个过程依然是模棱两可,我想深入的过程需要让学习结构化,希望后续自己能够学会这样的思维能力。
参考
SSH keys
Open SSH Manual Pages
Configure a development environment where gitlab, GitHub and gitee (code cloud) coexist
Understanding the SSH Encryption and Connection Process
配置文件~/.ssh/config和/etc/ssh/ssh_config
What is the known_hosts File for ssh in Linux?
SSH config file for OpenSSH client