大多数时候,我们的机器上会有很多的git host,比如公司gitlab、github、oschina等,那我们就需要在本地配置多个ssh key,使得不同的host能使用不同的ssh key ,做法如下(以公司gitlab和github为例):
1. 生成两个sshkey
- 为公司生成一对秘钥ssh key
$ ssh-keygen -t rsa -C "你的邮箱@xxx.com" -f ~/.ssh/id_rsa_gitlab
- 为github生成一对秘钥ssh key
$ ssh-keygen -t rsa -C "你的邮箱@xxx.com" -f ~/.ssh/id_rsa_github
注意:
- 如果没有使用
-f指令,不要一路回车,要对文件进行重命名。 - 输入路径:
/c/Users/Admin/.ssh/id_rsa_gitlabid_rsa_gitlab是新的文件名 - (暂时还少一个文件,在第5步会出现该文件)
2. 配置 config
我们需要在目录:
- linux:
~/.ssh/ - windows:
C:\Users\admin\.ssh\,创建config文件(无后缀名),并且配置ssh key的路由策略。
- 创建config文件:
$ touch config
linux 下 config 配置:
# gitlab
Host gitlab.com
HostName gitlab.com
PreferredAuthentications publickey
IdentityFile ~/.ssh/id_rsa_gitlab
# github
Host github.com
HostName github.com
PreferredAuthentications publickey
IdentityFile ~/.ssh/id_rsa_github
# 配置文件参数
# Host Host可以看作是一个你要识别的模式,对识别的模式,进行配置对应的的主机名和ssh文件
# HostName 要登录主机的主机名
# User 登录名
# PreferredAuthentications publickey,password,keyboard-interactive
# IdentityFile 指明上面User对应的identityFile路径
windows 下 config 配置:
# gitlab
Host gitlab.com
HostName gitlab.com
PreferredAuthentications publickey
IdentityFile C:\\Users\\\admin\\.ssh\\id_rsa_gitlab
# github
Host github.com
HostName github.com
PreferredAuthentications publickey
IdentityFile C:\\Users\\\admin\\.ssh\\id_rsa_github
# 配置文件参数
# Host Host可以看作是一个你要识别的模式,对识别的模式,进行配置对应的的主机名和ssh文件
# HostName 要登录主机的主机名
# User 登录名
# PreferredAuthentications publickey,password,keyboard-interactive
# IdentityFile 指明上面User对应的identityFile路径
-
Host: 相当于一个别名,远程仓库地址的域名别名它涵盖了下面一个段的配置,我们可以通过他来替代将要连接的服务器地址。这里可以使用任意字段或通配符。访问ssh的时候如果服务器地址能匹配上这里Host指定的值,则Host下面指定的HostName将被作为最终的服务器地址使用,并且将使用该Host字段下面配置的所有自定义配置来覆盖默认的/etc/ssh/ssh_config配置信息。 -
HostName:真正连接的服务器地址 -
User:自定义的用户名 PreferredAuthentications指定优先使用哪种方式验证,支持密码和秘钥验证方- publickey,password publickey,keyboard-interactive
-
IdentityFile:指定本次连接使用的密钥文件
3. 添加sshkey到仓库设置
通过查看 ~/.ssh/id_rsa.pub 文件内容,获取到你的 public key
cat ~/.ssh/id_rsa.pub
- 在github,gitLab,Tgit相应的位置,找到SSH-key的配置位置,用记事本打开.ssh文件夹下的id_rsa.pub文件(公钥,没有pub的是私钥,私钥很重要,不能随意透漏出去),这个文件中存放的就是刚才生成的ssh-key;把文件中所有的字符串复制,粘贴到相应位置中保存即可.
- 添加公钥: 复制生成后的 ssh key,通过仓库主页 「管理」->「部署公钥管理」->「添加部署公钥」 ,将生成的 public key 添加到仓库中。
4. 配置全局git 用户和邮箱
在Git Bash中运行以下两条配置命令,将用户名和Github注册邮箱配置为全局账户: (电脑设备配置过一次即可,其余时候可以省略不管,不影响)
$ git config --global user.name "your_username" #设置用户名
$ git config --global user.email "your_registered_github_Email" #设置邮箱地址(建议用注册giuhub的邮箱)
5. 验证是否成功
连接测试
$ ssh -T git@github.com //github的检测
$ ssh -T git@gitlab.com //gitlab的检测 其他的如T-git也类似,就是换个网址
(Warning之后会生成第3步缺失的known_hosts文件) (里面是一些远程库的域名和SSH钥匙信息)
- 这时候会提示Are you sure you want to continue connecting (yes/no)?,意思是#确认你是否继续连接,输入yes并点击回车(一定要输入yes);
- 如果生成ssh key的时候密码不为空,则会看到类似于这样的提示:Enter passphrase for key '/c/Users/xxxx_000/.ssh/id_rsa':,意思是#生成ssh kye是密码为空则无此项,若设置有密码则有此项且,输入生成ssh key时设置的密码即可;
- 如果能看到类似于Hi XXXX! You've successfully authenticated, but GitHub does not provide shell access.这样的提示,则表示ssh key配置成功!(有的时候也不见得会如此显示,我在配置git时就报了一个莫名其妙的错误,什么0通道被占用,反正有问题google一下,去建一个远程仓库测试一下能否正常clone,push)
5. 拉取项目设置
通过上述设置,就可以通过不同的Host来针对不同的git仓库和git项目使用不同的ssh key。
注意:通常情况下我们从git仓库拉取的项目ssh访问地址,类似这种git@git仓库地址:用户名/项目名.git。一定要把这里的git仓库地址替换为ssh config里面设定的Host。
[root@hostname .ssh]# git clone git@gitee.com:用户名/项目名.git
替换为如下
[root@hostname .ssh]# git clone git@gitee_two.com:用户名/项目名.git
6. 关联本地已有的项目
通过上述设置,就可以通过不同的Host来针对不同的git仓库和git项目使用不同的ssh key。
注意:通常情况下我们将本地仓库与git远程仓库进行关联时的地址是ssh访问地址时,类似这种git@git仓库地址:用户名/项目名.git。一定要把这里的git仓库地址替换为ssh config里面设定的Host。
git remote add origin git@gitee.com:用户名/项目名.git
git remote add origin git@gitee_two.com:用户名/项目名.git
参考地址: