Git高级之配置多个SSH key

最近我们在代码托管平台上使用 SSH 的方式下拉代码,通常是用一个 ssh key 来拉取所有托管平台的代码,如码云,GitHub、GitLab 等,但是总用一个不是太好。会有安全风险,这就需要为每个托管平台设置单独的 SSH-key

下面我们下简单介绍一下如何创建多个 SSH Key 并且使用下拉代码。

第一步、生成 SSH-Key

Windows 建议使用 Git bash 操作

Linux、mac 用户使用默认终端即可

生成第一个 SSH-Key

1
ssh-keygen -t rsa -C "你的邮箱" -f ~/.ssh/id_rsa_one

生成第二个 SSH-Key

1
ssh-keygen -t rsa -C "你的邮箱" -f ~/.ssh/id_rsa_two

创建完成之后 我们在.ssh 的根目录下可以看到文件

  • WindowsSSH 目录

    C:\Users\Administrator\.ssh
  • Linux、macSSH 目录
    直接 cd ~/.ssh 即可进入
    此时,.ssh 目录下应该有 4 个文件:id_rsa_oneid_rsa_one.pubid_rsa_twoid_rsa_two.pub

第二步、添加私钥

在终端中执行

1
2
ssh-add ~/.ssh/id_rsa_one
ssh-add ~/.ssh/id_rsa_two

如果执行 ssh-add 时提示 Could not open a connection to your authentication agent

可以先执行命令:

1
ssh-agent bash

然后再重新运行 ssh-add 命令即可

添加成功会出现提示:

Identity added 等字样

第三步、查看私钥列表是否存在

1
ssh-add -l

当我们可以看到 2 条私钥的时候就证明安装成功了,别急还没有完

第四步、修改配置文件 config

若.ssh 目录(就是私钥所在的文件夹)下无 config 文件,那么创建

1
touch config

打开 config 文件 配置如下格式 这里要注意 IdentityFile 后面对应的是 本地 ssh key 文件路径

1
2
3
4
5
6
7
8
9
10
11
# gitee
Host gitee.com
HostName gitee.com
PreferredAuthentications publickey
IdentityFile ~/.ssh/id_rsa_one

# github
Host github.com
HostName github.com
PreferredAuthentications publickey
IdentityFile ~/.ssh/id_rsa_two

第五步、用 ssh 命令测试验证

1
2
ssh -T git@gitee.com
ssh -T git@github.com

验证通过后即可愉快的 clone 代码了

附:清空私钥列表

1
ssh-add -D

第六步、配置项目使用的 ssh-key

如果项目使用的 ssh-key 不同, 我们不能重复设置 git config --global,这时我们只需要去掉 --global 修饰符,只为当前项目添加 git 配置就可以了
注意 git config 命令的 --global 参数,用了这个参数,表示你这台机器上所有的 Git 仓库都会使用这个配置,当然也可以对某个仓库指定不同的用户名和 Email 地址。

一般情况下为所有项目全局设置默认的用户名和邮箱

1
2
git config --global user.name "xxx"
git config --global user.email "xxx@xx.com"

git 为不同的项目设置不同的用户名和邮箱

找到项目所在目录下的 .git/文件夹,进入.git/文件夹,然后执行如下命令分别设置用户名和邮箱

1
git config user.name "xxx"
1
git config user.email "xxx@xx.com"

然后执行命令查看 config 文件:cat config

发现里面多了刚才配置的用户名和邮箱信息,即成功为该项目单独设置了用户名和邮箱

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
[core]
repositoryformatversion = 0
filemode = true
bare = false
logallrefupdates = true
ignorecase = true
precomposeunicode = true
[remote "origin"]
url = https://github.com/552277/calendar.git
fetch = +refs/heads/*:refs/remotes/origin/*
[branch "master"]
remote = origin
merge = refs/heads/master
[user]
name = xxx
email = xxx@xx.com

如果 git pull 每次都要求输入用户名和密码,则可以执行如下配置

1
git config --global credential.helper store

执行后, cat config 查看,则多了下面的内容:

1
2
[credential]
helper = store
1
2
3
4
5
[user]
name = xxx
email = xxx@xx.com
[credential]
helper = store