1. 预置条件和希望:

mac环境,公司电脑上装备了公司账户需求的ssh,这个时分假如有自己的一些总结想push到自己的github账户上,因为现在github现已停止https办法push代码,这个时分就需求装备两个ssh来分别到两个github账户上。

准备工作:

  1. 两个ssh key
  2. 两个github账户

cd到~/.ssh目录下运用以下指令生成两个key,自行调整参数和姓名。

# 这里默许rsa生成最基本的秘钥,需求其他加密类型的自行调整
ssh-keygen -t rsa -C "abc@163.com" -f ~/.ssh/id_rsa_a
ssh-keygen -t rsa -C "xyz@163.com" -f ~/.ssh/id_rsa_b

2. 具体装备:

好,那咱们现在在~/.ssh目录下有了两个ssh key,四个文件

id_rsa_a
id_rsa_a.pub
id_rsa_b
id_rsa_b.pub
2.1 config文件

SSH config是Linux体系下针对SSH客户端的一个参数装备方案,能够将一些关于SSH指令的参数放到装备文件中去,履行ssh指令的时分从文件中读取,简化指令行的操作。

ssh的config装备也有必定的优先级,由高到低依照以下的顺序获取(这里有个坑,后边会提到):

例子
指令行选项 -p 10086-i /path/to/identity_file 等选项来设置SSH的端口号或认证证书位置
用户装备文件 ~/.ssh/config,默许不存在,需求手动创建
体系级装备文件 /etc/ssh/ssh_config,针对所有user的装备文件,一般用不到

依照咱们的希望,config装备如下:

#~/.ssh/config
Host github_a
       HostName github.com
       User git
       IdentityFile ~/.ssh/id_rsa_a
Host github_b
       HostName github.com
       User git
       IdentityFile ~/.ssh/id_rsa_b

咱们先贴一条clone指令:git clone git@github.com:yocn/resp.git
咱们来拆解一下这个指令
用户名@主机地址:id/库房名

  • Host
    也可称为Alies,一个别名,通过它能够找到以下的装备
  • HostName
    需求ssh衔接过去的主机地址,在咱们现在的需求里边便是github.com,也能够是IP地址,在ssh衔接linux server的时分一般是ip地址
  • User
    登录主机的用户名,在咱们现在的需求里边是git,假如是ssh衔接server的时分便是你需求ssh登录的用户名
  • IdentityFile
    秘钥的位置

所以装备完之后,咱们就能够把之前的clone指令用下面的代替:
git clone git@github.com:yocn/resp.git

git clone github_a:yocn/resp.git

2.2 增加到ssh-agent

ssh agent,意为 ssh 署理,是一个密钥办理器,用来办理一个多个密钥,并为其他需求运用 ssh key 的程序供给署理。
当其他程序需求身份验证的时分 能够将验证请求交给 ssh-agent 来完结整个认证过程 。运用不同的密钥衔接到不同的主机时,需求要手动指定对应的密钥,而 ssh 署理能够 主动帮助咱们挑选对应的密钥进行认证。

需求把上面的两个key增加到ssh-agent,能够用下面的指令,增加到环境变量装备文件里,每次运转主动增加,就不用手动增加了。

# .bash_profile
nohup ssh-add ~/.ssh/id_rsa_a >/dev/null 2>&1
nohup ssh-add ~/.ssh/id_rsa_b >/dev/null 2>&1

还有一种办法能够主动增加到ssh-agent中,ssh-agent启动的时分就主动加载进去了

Host *
  AddKeysToAgent yes
  UseKeychain yes
  IdentityFile ~/.ssh/id_rsa_a

但是这种办法我没法加载多个key,只能装备一个IdentityFile,每次能够运用ssh-add -l查询现已增加到ssh-agent中的key,能够看到上面两个key都增加进去了。

abc@abc ~ % ssh-add -l
3072 SHA256:LAgtT7X/bFLtc8fyxxxxxxxxWkSKP UqVi/5YUpExBs abc@163.com (RSA)
4056 SHA256:4vZ5H41eFKXn/KLxxxxxxxx 3zR7MD3e46ytVobsXsM4 xyz@163.com (RSA)

这个时分咱们现已能够测试咱们的连通性了:

abc@abc resp % ssh -T github_a
Hi yocn! You've successfully authenticated, but GitHub does not provide shell access.

不出意外的话是这样的打印成果,假如有问题请移步5. 不收效的反常检查:检查并一步步排除。

3. 拉取,提交代码

咱们遇到的一般情况是公司的环境现已配好了,咱们要做的便是使自己的环境work但不影响公司环境的运转。

这个时分我个人的github库房为
git clone git@github.com:yocn/resp.git
咱们需求用咱们替换过的库房地址来拉取库房:
git clone github_a:yocn/resp.git

拉取下来之后咱们能够运用git remote -v指令检查库房的远端地址。

abc@abc resp % git remote -v
origin	git@github_a:yocn/resp.git (fetch)
origin	git@github_a:yocn/resp.git (push)

这个时分尝试用git push测试,一般没问题了。

4. one more thing

我这个搞了半天没有成功是因为之前的时分在ssh的global装备中配了core.sshCommand='ssh -i ~/.ssh/id_rsa',当时用这个指令装备了一个秘钥进去,后来忘记了。

假如设置了core.sshCommandgit fetchgit push 在需求衔接到长途体系时将运用指定的指令而不是 ssh。该指令与GIT_SSH_COMMAND环境变量的形式相同,并在设置环境变量时被覆盖。
也便是每次履行ssh的时分会履行ssh -i ~/.ssh/id_rsa,所以导致失败。

5. 不收效的反常检查:

  1. 检查git工程的config(工程目录下运用git config –list)或者git remote -v检查工程的push和origin地址是否是咱们装备的地址
  2. ssh-add -l检查咱们希望的ssh 私钥是否增加到ssh-agent
  3. 检查希望的公钥是否在github中装备,比对第2步中的私钥列表,是否增加到ssh-agent
  4. 检查自己的git全局装备(git config --global --list),在git config core.sshcommand中是否有什么额外装备导致反常

总结:

需求装备两个ssh key在两个github账户登录的时分,需求以下几步:

  1. ~/.ssh/config中装备不同的私钥
  2. 两个私钥都需求用ssh-add指令增加到ssh-agent
  3. clone库房的时分需求用config中装备的Host姓名替换