mac下配置两个ssh提交到两个github账户,包含不生效分析

1. 预置条件和期望:

mac环境,公司电脑上配置了公司账户需要的ssh,这个时候如果有自己的一些总结想push到自己的github账户上,因为现在github已经停止https方式push代码,这个时候就需要配置两个ssh来分别到两个github账户上。

准备工作:

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

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

perl 复制代码
# 这里默认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,四个文件

txt 复制代码
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配置如下:

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,可以用下面的命令,添加到环境变量配置文件里,每次运行自动添加,就不用手动添加了。

javascript 复制代码
# .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启动的时候就自动加载进去了

txt 复制代码
Host *
  AddKeysToAgent yes
  UseKeychain yes
  IdentityFile ~/.ssh/id_rsa_a

但是这种方法我没法加载多个key,只能配置一个IdentityFile,每次可以使用ssh-add -l查询已经添加到ssh-agent中的key,可以看到上面两个key都添加进去了。

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

这个时候我们已经可以测试我们的连通性了:

vbnet 复制代码
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命令查看仓库的远端地址。

ruby 复制代码
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名字替换
相关推荐
limengshi1383923 小时前
通信工程学习:什么是RIP路由信息协议
网络·网络协议·学习·智能路由器·信息与通信
GodK7773 小时前
HTTPS 的加密流程
网络协议·http·https
limengshi1383927 小时前
通信工程学习:什么是TFTP简单文件传输协议
网络·网络协议·学习·信息与通信
bush48 小时前
使用root账号ssh登录虚拟机ubuntu
运维·ubuntu·ssh
#欲速则不达#16 小时前
高级I/O
c++·网络协议
中草药z17 小时前
【JavaEE】http/https 超级详解
网络·笔记·网络协议·学习·http·https·计网
物有本木18 小时前
httpsok-v1.17.0-SSL通配符证书自动续签
网络·网络协议·ssl
F_D_Z18 小时前
【解决办法】git clone报错unable to access ‘xxx‘: SSL certificate problem:
网络·git·网络协议·ssl
BUG制造机.19 小时前
TCP --- 确认应答机制以及三次握手四次挥手
网络·网络协议·tcp/ip
无聊看看天T^T19 小时前
网络基础:TCP/IP五层模型、数据在局域网传输和跨网络传输的基本流程、IP地址与MAC地址的简单解析
网络·数据结构·c++·网络协议·tcp/ip·算法