gitee github 远程仓库的免密登录(ssh)

1 http和ssh方式的区别

常用的克隆项目的方式为http,这种方式允许直接下载项目,当需要push代码到远程仓库时,每次都要输入项目的账号密码以进行身份验证

Git Credential Manager for Windows 
Enter your credentials for https://giteecom/. 
LLLLI///1 0@163.com

 

使用ssh方式连接远程仓库后,无论是下载项目还是push代码到远程仓库,都不需要输入项目的账号密码

 

如图,远程仓库提供的这个按钮给出的地址就是用来进行免密登录的

HTTPS SSH https://gitee.com/wuhandaxuewhI/javasm41 L'

 

2 ssh连接方式只允许与远程仓库搭建了SSH的电脑实现

想要通过SSH这种连接方式克隆项目到本地,需要当前电脑和远程仓库搭建起SSH连接,搭建之后可以使用ssh连接clone项目,但是如果希望push代码,那只能是项目的拥有者能执行

 

要成为项目的拥有者很简单,首先项目和远程仓库的账号绑定,只需要在一台或多台电脑上生成公钥和私钥,然后把公钥配到远程仓库的账号,那么这一台或多台电脑就能与账号搭建起SSH连接,此时这一台或多台电脑就能拥有远程仓库的账号下所有的项目

 

远程仓库的账号可以一对多,这里提到的各个电脑则属于一对一(也可以一对多,但是需要设置)

 

3 具体实现流程

3.1 生成公钥和私钥

通过鼠标右键-git bash here 打开命令行,输入下面的代码,或者直接粘贴,就能执行生成公钥和私钥的操作

ssh-keygen -t rsa

第一步,Enter file in which to save the key,提示我们输入公私钥的生成路径,按下回车则使用默认名字以及默认路径,默认会存放在c盘的用户名下的.ssh文件夹下

如果粘贴新路径,就会变更生成路径

如果输入一段字符串,那么就会以该字符串作为公私钥文件名

如果和已有公私钥文件名相同,那么原公私钥文件会被覆盖

Administratorapc-20201216GNIR MINQ'64 /e/demol 
S ssh-keygen -t rsa 
Generating public/private rsa key pair. 
Enter file in which to save the key (/c/Users/Administrator/.ssh/id_rsa):

 

第二步,Enter passphrase,提示我们输入push项目时要输入的验证密码,这是为了防止别人随便在你的项目上push东西,如果不想每次操作都输入密码,可以不填

在输入时,命令行不会显示出你输入的字符串(好简陋且缺少体验的防护措施)

 

第三步,Enter same passphrase again,再一次输入刚刚输入的密码,如果刚才没输入,则直接回车

 

上面这三步都可以按回车,直接以默认方式跳过

 

最后显示如图:

/e/gi (master) 
GQ MINGW64 
ssh-ke en -t r sa 
enera 1 ng pu pr •vate rsa key pair. 
Enter file in which 
save the key (/c/users/ 
JAVASM/ . ssh/i d_rsa) : 
created di rectory '/c sers/JAVASM/. ssh' . 
Enter passphrase (emp 
or no passp rase) : 
Enter same passphrase a ain: 
your identification has een saved in /c/users 
/JAVASM/ . ssh/i d_rsa. 
your public key has been 
ved in /c/Users/JAV 
ASM/. ssh/i d_rsa. pub . 
The key fingerprint is: 
SHA2 56 : VESDh 5NN1uswh EENd 
INrCOjRbozX1wD30j 
G7aE JAVASM@JAVA-20191015GQ 
The key's randomart image is. 
+---CRSA 2048] 
8.0 -o. E .01 
o oso.o o I 
+----CSHA256] 
/e/gi tiÄ-ns (mas 
JAVASM@JAVA-20191015GQ MINGW64 
ter)

 

此时就会生成公钥和私钥,要把公私钥放在.ssh文件下,win10下,git默认访问C盘的用户下的.ssh目录

id_g itee_two 
D 
id_g itee_two.pu b

sa

3.2 复制公钥的内容

1 
S 
2 
—rsa AAAAB3NzaC1yc2E 
短 制 公 钥 中 的 内 容 直 接 ctrl A 就 行 了

 

3.3 在远程仓库(GitHub为例)中配置公钥

3.3.1 第一步

Signed in as liruhui 
@ Set status 
Your profile 
Your repositories 
Your projects 
Your stars 
Your gists 
Feature preview 
Help 
Settings 
Sign out

 

3.3.2 第二步

Personal settings 
Profile 
Account 
Security 
Security log 
Emails 
Notifications 
Billing 
SSH and GPG keys 
Blocked users 
Repositories 
Organizations 
Saved replies 
Applications 
SSH keys 
There are no SSH keys associated with your account 
Check out our guide to generating SS* keys or troubleshoot common SSH Problems. 
GPG keys 
There are no GPG keys associated with your account. 
Learn how to generate a GPG key and add it to ßur account. 
New SSH key 
New GPG key

 

3.3.3 第三步 配置公钥

SSH keys / Add new 
Title 
huige 
ssh-rsa 
AAAA83NzaC1yc2 AAAADAQA8AAA8AQDsDTfbVjL2Vlrc/UoPGodaFreN4YenOef8t+QwLLVZS+AvOXcVz90DTYJH0+ 
OcJgFqBGJlFh/Fe3AUenDv2+ 7aklJkodVQ'Kd4dEyXyU+LSVydZToh98rXRJlUOpUuD4JCzD84kc/CcHtWhhWfhxEQb4Q 
cK92TPRJG/F1kbYFp62VKpUIcTz8ArSJXN970ga3PapXNeeJL6 t4nOd1EDXZNELKfKXQxERlgFg/Dgqf36MUTRMjkbcD 
JAVASM@JAVA-2019101SGQ 
Add SSH key

 

4 命令行版 使用ssh登录

4.1 获取远程仓库的SSH地址

在远程仓库中点击SSH按钮,得到远程仓库的SSH登录方式的地址

:reate new file Upload files 
Clone wi 
Find file 
Use a password protected SS* key. 
Open in Desktop 
Clone or download • 
use HTTPS 
Download ZIP

 

4.2 ssh方式克隆代码 clone

其实和之前的语法一样,就是远程仓库地址有变化而已

注意:克隆下来的项目是以整个文件夹的形式存在,如果要操作克隆的项目,需要进到这个文件夹里,右键"git bash hero",否则操作不到克隆下来的项目里的文件

MINGW64:/e/git?? 
hu ige 
git clone git@github. com:liruhui/huige.git 
remote: Enumerating objects : 7 done. 
remote: Counting objects: 100% (7/7), done. 
remote: Compressing objects: I 
remote: Total 7 (delta 2), reus 
Receiving objects: 100% (7/7) , 
Resolving deltas: 100% (2/2) , 
IAVAsmaJAVA-201g1015GQ MING..'64 
(5/5), done. 
6 (delta I), 
pack-reused O

 

4.3 ssh方式上传代码 push

W64 
/e/gi cmaster) 
73/ huige (master) 
aaaa.md 
HuigeControllerjava 
HuigeMapperjava 
H u igeService java 
LoginControllerjava 
Log in Mapperjava 
L inServicejava 
Z] txt 
OIYIODGQ 
it add 
git commit -m ' 
1 file changed, 0 insertions (+) , 0 deletions (-) 
create mode 100644 txt" 
/e/gitiEUhuige (master) 
IAVASMaJAVA-20191015GQ MINGW64 
git push orgin master 
fatal : 
'orgin' does not appear to be a git repository 
fatal: Could not read from remote repository. 
please make sure you have the correct access rights 
and the repository exists. 
/e/gitiEUhuige (master) 
GW64 
git push origin master 
c 
Delta compression using up to 8 threads. 
Compressing objects: 100% (2/2), done. 
Writing objects: 100% (2/2), 236 bytes | 0 bytes/s, done 
Total 2 (delta 1), reused 0 (delta 0) 
remote: Resolving deltas: 100% (1/1), completed with 1 1 
ocal object. 
To github.com:liruhui/huige.git 
f04ac6f..9d1ce9e master -> master 
/e/gitiEUhuige (master) 
]AVASMaJAVA-20191015GQ MINGW64 
$1

 

5 特别情况 配置SSH后首次连接需要确认秘钥真实性

在配置了SSH后,在命令行下首次克隆项目时会提示该SSH连接无法确认真实性,需要人为确认是否继续,此时输入yes 即可实现SSH配置,并执行克隆

Administratorapc-20201216GNIR 
S git clone gitagitee. com:8RSbIackshoot/project.git 
Cloning into 'project' 
The authenticity of host 'gitee.com (180. 97.125. 228)' can't be established. 
ECDSA key fingerprint is SHA256:FQGC9Kn/eyeIW8i cd8grQp+KkGYoFgbVr17bmjeyOWc. 
Are you sure you want to continue connecting (yes/no)? yes

 

此时可以看到.ssh文件夹下生成了新的文件

rsa 
id _rsa. pu b 
id rsa 
id_rsa.pub 
known_hosts

 

如果在IDEA下进行首次克隆,只会报错,无法进行下一步,所以使用git时,有的情况只有命令行能解决,命令行才是最重要的

Repository test failed 
Could not read from remote repository.

 

6 特别情况 一对公私钥的公钥只能配给远程仓库中的一个账号

例如,当一对公私钥的公钥配给Gitee的某个账号后,其他账号就不允许再配置这个公钥了

当 前 公 已 被 他 丿 、 . 使 甲 重 新 生 成 〔 SSH × 
Key 不 允 许 重 思 添 加 〕

 

反过来,一个账号可以配上多台电脑的公钥,这样每台电脑都能用ssh方式连接这个账号下的所有项目,可以执行的操作包括

①用ssh方式克隆任何远程仓库上的任何开源项目

②用ssh方式push代码到配对的远程仓库账号的任意代码,并且可以任意指定分支

 

7 单台电脑上配置多对公私钥

Windows下Git多账号配置,同一电脑多个ssh-key的管理 - popfisher - 博客园 (cnblogs.com)

git本地管理多个密钥/账户(原创) - 简书 (jianshu.com)

Could not open a connection to your authentication agent_argleary的博客-CSDN博客

一个Git终端如何配置多个Git仓库和账户 - 知乎 (zhihu.com)

Git之同一台电脑连接多个远程仓库 - 简书 (jianshu.com)

 

后续:我在一台电脑上生成两对钥匙,分别配置到gitee的两个账号中,但是这两把钥匙生成时均为我的QQ邮箱,config中的设置 除了host不一样 其他都一样

这样是不行的,会报错 一个都用不了

我猜所谓的单电脑上配置多把钥匙,应该是要求每把钥匙在config中的user不能一样

 

在使用git的过程中,一般都只关注单账号的情况,工作中的配置也是直接由自己的上级发一个配置文档之类的东西,然后对着搞一遍就行了

但是如果在一台电脑上,希望能实现对多个账号的ssh连接,此时就要分别生成公私钥,然后分别配置公钥,并且编写一个config配置文件

 

7.1 生成新的公私钥

依然是使用下面的代码

ssh-keygen -t rsa -C 你的邮箱

第一步,Enter file in which to save the key,提示我们输入公私钥的生成路径,按下回车则使用默认名字以及默认路径,默认会存放在c盘的用户名下的.ssh文件夹下

如果粘贴新路径,就会变更生成路径

如果输入一段字符串,那么就会以该字符串作为公私钥文件名

如果和已有公私钥文件名相同,那么原公私钥文件会被覆盖

Administratorapc-20201216GNIR MINQ'64 /e/demol 
S ssh-keygen -t rsa 
Generating public/private rsa key pair. 
Enter file in which to save the key (/c/Users/Administrator/.ssh/id_rsa):

 

第二步,Enter passphrase,提示我们输入push项目时要输入的验证密码,这是为了防止别人随便在你的项目上push东西,如果不想每次操作都输入密码,可以不填

在输入时,命令行不会显示出你输入的字符串(好简陋且缺少体验的防护措施)

 

第三步,Enter same passphrase again,再一次输入刚刚输入的密码,如果刚才没输入,则直接回车

 

上面的二、三步可以按回车,直接以默认方式跳过

 

最后显示如图:

Generating public/private rsa key pair. 
Enter file in which to save the key (/c/Users/Administrator/.ssh/id_rsa): id_git 
ee_two 
Enter passphrase (enpty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in id_gitee_two. 
Your public key has been saved in pub. 
The key fingerprint is: 
SHA256:0UGi2n7ushmEnobai90/vA8N8nwZGw1WbMZMEt50M+s 547302897aqq. com 
The key's randomart image is: 
-CRSA 2048] 
1020.0* 
1+80..*+. o. 
. 8Eo S 
.0 00 
. —yooo 
Administratorapc-20201216GNIR MINGi•.'64 
—/. ssh

 

此时就会生成第二把公钥和私钥

ロ - d ー 9 ー 0 
口 一 d ー 9 一 に 0 ・ pub 
口 ま 「 sa.pub 
ロ 
ロ 
id rsa 
k コ ow コ ー h 。 窪 5

 

7.2 将公钥配置到账户上

如图,在gitee上给账号配置公钥

SHA2S6:

 

7.3 添加新 ssh Key

默认SSH只会读取id_rsa,所以为了让SSH识别新的私钥,需要将其添加到SSH agent

$ ssh-add ~/.ssh/id_rsa_me

如果出现下图的错误

Y700@DESKTOP-HEFMOF8 MINGW64 -/.ssh 
S ssh-add —/.ssh/' 
Could not open a connection to your authenti cation agent.

 

就重置SSH agent,然后重新配置所有私钥

$ ssh-agent bash

 

7.4 在.ssh目录创建config文本文件

如果已经有,跳过这一步,如果没有,则有两种方式创建

方式一,直接在文件夹下新建一个txt文件,将后缀名.txt去掉,将文件名改为config

 

方式二,使用git的命令行,输入下面代码创建

touch config

7.5 在config中完成相关配置(最核心的地方)

需要在config中对当前所有公私钥进行配置,例如现在有两对公私钥,那么就在config中配置如下

	# 配置gitee的第一个账户
	Host gitee1                 
	    HostName gitee.com
	    IdentityFile C:\\Users\\\Administrator\\.ssh\\id_rsa
	    PreferredAuthentications publickey
	    User xxxxxx
	
	# 配置gitee的第二个账户
	Host gitee2
	    HostName gitee.com
	    IdentityFile C:\\Users\\\Administrator\\.ssh\\id_gitee_two
	    PreferredAuthentications publickey
	    User BRSblackshoot

具体说明

每个账号单独配置一个Host,每个Host要取一个别名,每个Host主要配置HostName和IdentityFile两个属性

语法

说明

Host 别名

网站的别名 可以取为自己喜欢的名字,通常可以用 自定义前缀 . 网站域名

HostName

托管网站的域名 (github就是github.com gitee就是gitee.com或git.oschina.net)

IdentityFile 

使用的密钥文件 (即私钥在本地磁盘的路径)

PreferredAuthentications

配置登录时用什么权限认证--可设为publickey,password publickey,keyboard-interactive等

User

托管网站上的用户名, 最好写账户邮箱, 否则容易设置失败

Host的名字可以取为自己喜欢的名字,不过这个会影响git相关命令,例如:

Host mygithub 这样定义的话,命令如下,即git@后面紧跟的名字改为mygithub

git clone git@mygithub:PopFisher/AndroidRotateAnim.git

 

如果我们要克隆gitee的项目,一般拿到的ssh地址都是gitee.com开头,所以这个别名建议是不要改,省得从网上复制下来后还得手改

sv 
git@gitee.com:BRS

 

原理分析

1.ssh 客户端是通过类似 git@github.com:githubUserName/repName.git ** 的地址来识别使用本地的哪个私钥的,地址中的 User 是@前面的git, Host 是@后面的github.com。

2.如果所有账号的 User 和 Host 都为 git 和 github.com,那么就只能使用一个私钥。所以要对User 和 Host 进行配置,让每个账号使用自己的 Host,每个 Host 的域名做 CNAME 解析到 github.com,如上面配置中的Host second.github.com。

3.配置了别名之后,新的地址就是git@second.github.com:githubUserName/repName.git**(在添加远程仓库时使用)。

这样 ssh 在连接时就可以区别不同的账号了。

 

7.6 测试配置是否成功

打开Git Bash客户端(管理员身份运行)执行测试命令测试是否配置成功(会自动在.ssh目录生成known_hosts文件把私钥配置进去)

测试命令,有两种格式

格式

说明

ssh -T git@github.com

@后接配置文件中的HostName (即真实域名地址)

ssh -T git@ydy

@后接配置文件中的Host (即自己设置的别名)

 

出现如图的欢迎语,则表示成功

Administratorapc-20201216GNIR -/. ssh 
S ssh -T gitagiteel 
Hi You 've successfully authenticated, 
hell access. 
Administratorapc-20201216GNIR -/. ssh 
S ssh -T gitagitee2 
but GITEE.COM does not provide s 
Hi 8RSbIackshoot! You 've successfully authenticated, 
ide shell access. 
but GITEE.COM does not prov

posted @ 2021-10-04 23:54  夏·舍  阅读(995)  评论(0)    收藏  举报