1. 预置条件和希望:
mac环境,公司电脑上装备了公司账户需求的ssh,这个时分假如有自己的一些总结想push到自己的github账户上,因为现在github现已停止https办法push代码,这个时分就需求装备两个ssh来分别到两个github账户上。
准备工作:
- 两个ssh key
- 两个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.sshCommand
,git fetch
和 git push
在需求衔接到长途体系时将运用指定的指令而不是 ssh。该指令与GIT_SSH_COMMAND环境变量的形式相同,并在设置环境变量时被覆盖。
也便是每次履行ssh的时分会履行ssh -i ~/.ssh/id_rsa
,所以导致失败。
5. 不收效的反常检查:
- 检查git工程的config(工程目录下运用git config –list)或者
git remote -v
检查工程的push和origin地址是否是咱们装备的地址 -
ssh-add -l
检查咱们希望的ssh 私钥是否增加到ssh-agent
中 - 检查希望的公钥是否在github中装备,比对第
2
步中的私钥列表,是否增加到ssh-agent
中 - 检查自己的git全局装备(
git config --global --list
),在git config core.sshcommand
中是否有什么额外装备导致反常
总结:
需求装备两个ssh key在两个github账户登录的时分,需求以下几步:
- 在
~/.ssh/config
中装备不同的私钥 - 两个私钥都需求用
ssh-add
指令增加到ssh-agent
中 - clone库房的时分需求用
config
中装备的Host姓名替换