git ssh多账户登录使用

2,653 阅读4分钟

之前就已经在Mac上配置过git的ssh多账户登录了,这次在Windows上配置ssh多账户依然被卡了好久,仔细想想还是之前的了解不够彻底,导致会走很多弯路,命令的意义被理解的似是而非,重新按照理解理顺一遍。

ssh配置

用ssh-keygen生成秘钥,

ssh-keygen主要用于生成、管理和转换认证密钥。常用参数:
-t type:指定要生成的密钥类型,有rsa1(SSH1),dsa(SSH2),ecdsa(SSH2),rsa(SSH2)等类型,较为常用的是rsa类型
-C comment:提供一个新的注释

# 生成rsa秘钥,邮箱换成登录git的邮箱
ssh-keygen -t rsa -C "yourself@email.com"

我们首先按照上面的例子使用ssh-keygen生成rsa秘钥,根据提示一直回车就可以了,然后会在Windows下C:\Users\用户名.ssh\ , 即 ~/.ssh/ 下生成id_rsa、id_rsa.pub两个文件, id_rsa.pub是公钥文件,需要打开拷贝到网站的SSH Keys里面。

有的可能还需要将私钥添加到ssh-agent中,但我这次没有添加也能正常访问, SSH命令可以在Linux命令大全 ssh-agent中查看,windows用户需要搜索git bash程序,打开之后在里面运行下面的添加私钥命令:

# 运行ssh-agen,会打印出来它使用的环境和变量。
ssh-agent
# 将SSH 私钥增加到ssh-agent
ssh-add ~\.ssh\id_rsa_github
# 显示ssh-agent已经添加过的密钥
ssh-add -l

到这里我已经可以使用项目正常pull/push等操作了,但是接下来会有多账户的场景,比如一个公司的账户,一个github的账户,怎么做到同时登录呢?

多账户ssh使用

首先使用ssh-keygen再次生成秘钥,这次需要输入不同的文件名,可以根据网站起一个id_rsa的名字方便记忆,比如github可以用id_rsa_github, 生成之后同样把公钥设置到网站ssh keys中。

在C:\Users\用户名.ssh\ , Mac中 ~/.ssh/ 下创建config文件,里面根据域名配置不同的rsa文件指向。 文件如下, 这里之前有的人说:

Host: "personal.github.com"是一个"别名",可以随意命名, 像github-PERSONAL这样的命名也可以;
HostName:比如我工作的git仓储地址是git@code.sohuno.com:username/repo_name.git, 那么我的HostName就要填"sohuno.com"

这里测了一下,Host名字不能乱写,是主机名,之前写了Host为 github,然后一直被权限拒绝还好久找不到原因,最后查到官方文件说Host是主机名,Host和HostName都写成要用的域名才行,一定要注意这里的坑。

Host github.com
   User yourusername 
   Hostname github.com
   IdentityFile ~\.ssh\id_rsa_github

Host git.xxx.com
   User yourusername1
   Hostname git.xxx.com
   IdentityFile ~\.ssh\id_rsa

ssh config参数说明,如果想看更多参数,可以在ssh config配置说明打开查看:

Host
Restricts the following declarations to be only for those hosts that match one of the patterns given after the keyword. The pattern is matched against the host name given on the command line.
限制以下声明仅适用于那些匹配关键字后给出的模式之一的主机。模式与命令行上给出的主机名匹配。

HostName
Specifies the real host name to log into. This can be used to specify nicknames or abbreviations for hosts. The default is the name given on the command line. Numeric IP addresses are also permitted (both on the command line and in HostName specifications).
指定要登录的实际主机名。这可以用来为主机指定昵称或缩写。默认是命令行给出的名称。数字IP地址也是允许的(在命令行和主机名规范中都允许)。

IdentityFile
Specifies a file from which the user's identity key is read when using public key authentication. The default for protocol version 1 is ~/.ssh/identity; and ~/.ssh/id_rsa or ~/.ssh/id_dsa for protocol version 2.
指定在使用公钥身份验证时从其中读取用户身份密钥的文件。

配置好之后,如果访问github,就会使用对应id_rsa_github的秘钥登录。

如果不行,可以在 /etc/ssh/ssh_config,下面添加这段配置试试,我是发现自己Host内容按照网上说的设置了别名,但是发现不行,需要用域名才可以,改完之后就好了。

可以使用 ssh -T git@github.com测试,如果返回

> ssh -T git@github.com
Hi xxx! You've successfully authenticated, but GitHub does not provide shell access.

就说明访问成功了。

写完回头一看挺简单呀,但就是简简单单的问题有时候却需要找半天,弄好了还不理解,记录一下希望以后能走更少的坑, 也让自己更明白一点。如果发现按照文中说明的但是却没有成功,还是最好去查下官方网站每个操作的意思,防止错误或者更新不及时的情况。

附带的git config 命令

# 配置git全局用户name
git config --global user.name "yourname"
# 配置全局用户email
git config --global user.email "jianqi.gao@jimubox.com"
# 在当前项目配置 user.name
git config user.name "yourname"
# 查看git当前配置
git config --global --list
git config --list