需求:实际上一台电脑配置一个公钥就可以实现不同代码库的提交和拉取代码,但是楼主想配两个密钥,一个对应自己平时写一些Demo使用,一个对应公司自己部署的一个Gitlab项目。
创建多个SSH-Key
- 使用ssh-key生成公钥和私钥
# 生成ssh-key,~/:指的是C盘用户的地址,一般是C:\Users\Administrator\.ssh
# 作为github使用
ssh-keygen -t rsa -C "username@email.com" -f ~/.ssh/id_rsa
# 生成第二个ssh-key,指的是公司的地址。username可以定义为你在公司提交的名字,生成密钥
# 作为gitlab使用
ssh-keygen -t rsa -C "username1@email.com" -f ~/.ssh/gs_rsa
-
进入到~/.ssh目录下
这时候看到4个文件,分别为
id_rsa、id_rsa_pub、gs_rsa、gs_rsa_pub
,后面的操作是将id_rsa_pub、gs_rsa_pub
的密钥添加到对应的代码库上,比如github,gitlab等等。这个自己找一下带有
pub
后缀的是公钥,没有带的是私钥。 -
使用ssh-add添加私钥
因为Git默认使用
id_rsa
,我们需要将密钥添加进去,同时配置config
,作用是告知Git,让Git根据不同的域名选择不同的私钥# 右键打开Git Base Here ssh-add ~/.ssh/id_rsa ssh-add ~/.ssh/gs_rsa # 如果提示:Could not open a connection to your authentication agent,则先执行这个命令 ssh-agent bash
查看是否添加成功
ssh-add -l # 如果成功,会打印出SHA256:你的私钥,一串加密字符串 rsa的地址
创建config文件
# 创建命令 touch ~/.ssh/config
config文件配置的信息
# 说明: # 注释 # Host 为域名别名 # Hostname 真实地址 # User 用户名 # IdentityFile rsa的地址 # PreferredAuthentications 认证方式(publickey--公钥的方式) # 账号1-github HOST github.com hostname github.com User xiaoshishu IdentityFile C:\Users\Administrator\.ssh\id_rsa PreferredAuthentications publickey # 账号2-公司的gitlan私服 HOST gitlab.gs.com hostname gitlab.gs.com # 公司git项目的地址,ip或者是域名 User gs_userName IdentityFile C:\Users\Administrator\.ssh\gs_rsa PreferredAuthentications publickey
验证是否生效
ssh -T git@github.com ssh -T git@gitlab.gs.com # 如果返回You've successfully authenticated中的,则表示成功连接。
注意!
使用ssh-agent bash这个命令,只是定义一个临时回话,将你的私钥添加到Git的ssh-key中,而config配置文件的作用,是告知Git说你要根据域名去找对应的私钥,要先把私钥添加到Git的ssh-key中,要先有因,后有果。
所以这里就存在一个问题,你必须要在当前这个窗口操作,不能重新开窗口,因为临时设置,新开窗口就无效了。而Git会默认取id_rsa,所以哪怕你设置了config也无效。
楼主照着网上帖子设置,结果一旦新开窗口拉取项目,就提示要密码
# 错误信息,不必理会 git@gitlab.gs.com’s password: Permission denied, please try again
-
创建.bashrc文件,右键Git Base Here之后,会自动加入ssh-key到Git中
# 创建./bashrc,创建.profile 也是可以的。默认会读取这两个。 touch ~/.bashrc
.bashrc文件配置的信息
# Note: ~/.ssh/environment should not be used, as it # already has a different purpose in SSH. env=~/.ssh/agent.env # Note: Don't bother checking SSH_AGENT_PID. It's not used # by SSH itself, and it might even be incorrect # (for example, when using agent-forwarding over SSH). agent_is_running() { if [ "$SSH_AUTH_SOCK" ]; then # ssh-add returns: # 0 = agent running, has keys # 1 = agent running, no keys # 2 = agent not running ssh-add -l >/dev/null 2>&1 || [ $? -eq 1 ] else false fi } agent_has_keys() { ssh-add -l >/dev/null 2>&1 } agent_load_env() { . "$env" >/dev/null } agent_start() { (umask 077; ssh-agent >"$env") . "$env" >/dev/null } if ! agent_is_running; then agent_load_env fi # if your keys are not stored in ~/.ssh/id_rsa or ~/.ssh/id_dsa, you'll need # to paste the proper path after ssh-add if ! agent_is_running; then agent_start ## 你需要更改的就这两个地方 ssh-add ~/.ssh/id_rsa ssh-add ~/.ssh/gs_rsa elif ! agent_has_keys; then ssh-add ~/.ssh/id_rsa ssh-add ~/.ssh/gs_rsa fi unset env
这个不是放在
.ssh
文件夹下面,而是放在C:\Users\Administrator 这个文件夹下面。之后重新启动,直接右键
git Base Here
,输入ssh -T git@github.com
,测试,成功即解决。这里楼主贴的是人家的,脚本这一块是薄弱项,需要花点时间学习下。记录之
小知识点
不同私钥对应不同的用户名
查看使用到的全局用户信息
#查看全局配置 主要看user.name user.email user.password
git config --list
#移除全局配置账户
git config --global --unset user.name
#查看全局用户名 已经显示为空了,说明移除成功
git config --global user.name
# 移除全局配置邮箱
git config --global --unset user.email
# 再查看全局邮箱 已经显示为空了,说明移除成功
git config --global user.email
# 移除全局密码
git config --global --unset user.password
# 查看全局密码 已经显示为空了,说明移除成功
git config --global user.password
移除成功之后,进入到你拉取的Git项目里面,右键打开 git Base Here
# 设置提交的用户名和邮箱名称。
git config user.name "gs_userName"
git config user.email "gs_userName@email.com"