前言

最近在使用Git的过程中遇到了这样一个场景:我们有时需要在不同电脑上使用SSH访问同一个代码库,但每台电脑又有各自其他的用途。使用SSH访问代码托管平台时要生成密钥对,但又需要输入一个邮箱。

大家有没有想过,我们在代码托管平台、Git本地库和生成SSH密钥对时都要输入一个邮箱用作用户名,这些邮箱有区别吗?生成SSH密钥对时输入什么邮箱比较合适?输入别的字符可以吗?如何让一台电脑能用不同用户名访问不同的代码库呢?下面,我们就来探讨一下这些问题。

SSH密钥

大多数Git教程都会告诉你,生成SSH密钥时在-C后输入你在Git中设置user.email那里填写的邮箱就可以了,而且在很多教程里都会看到这行命令:

ssh-keygen -t rsa -C "username@email.com"

你看,命令都是这么写的,让你输入一个邮箱,是吧。

事实上,ssh-keygen命令中常用的参数是这样解释的:

参数 解释
-t 指定要创建的密钥类型,一般采用rsa加密方式,另外有dsa
-b 指定密钥长度,rsa默认2048bit
-f 指定用来保存密钥的文件名,可以不指定
-C 添加备注

我们尝试输入这行命令:

ssh-keygen -t rsa -C "username@email.com"

以上命令省略了-f参数,因此,运行上面那条命令后会让你输入一个文件名,用于保存刚才生成的SSH key代码,你一般会看到如下的文字:

1
2
Generating public/private rsa key pair.
Enter file in which to save the key (/Users/yourusername/.ssh/id_rsa): [Press enter]

不输入文件名,按下回车后,会在你电脑的User文件夹的.ssh路径下创建一个加密方式为rsa、注释为username@email.com的SSH密钥,而且会同时生成一对公钥和私钥,文件名为id_rsa,公钥的文件后缀名为.pub,私钥没有后缀名。

因此,在生成SSH密钥时,输入邮箱只是起到一个备注的作用,填写其他任意内容均可,也跟你的Git用户名没有任何关系。一台电脑使用一个SSH密钥就能访问多个远程服务器。

合理使用注释

那么,我们该如何填写注释,在日常使用中更方便地区分它们呢?

我列举这样一个场景:我在公司使用台式机办公,同时家里有一台台式机,自己有一台笔记本电脑。我有一些个人的兴趣性项目,代码托管在GitHub上,同时有一些公司的项目,代码托管在公司服务器上。我会在公司电脑上使用SSH访问公司服务器的代码库,并且偶尔需要用公司电脑访问自己的个人代码;在家里会使用台式机和笔记本访问自己的GitHub。

用表格列举如下:

电脑名称 说明
HomePC 家中使用的台式电脑
CompanyPC 公司使用的台式电脑
Laptop 自己的笔记本电脑
代码托管平台 用户名 email 说明
GitHub personal personal@qq.com 个人邮箱
公司服务器 company company@company.cn 公司邮箱

从某种角度上看,我们的代码库和开发环境存在多对多的关联关系,三乘以二等于六,是不是我们也要创建6个SSH密钥对呢?不是的。

我们需要留意到,在设置Git用户名和密码时,我们总是添加-global参数,让计算机上所有的Git库都使用同一个用户名。因此,我们完全可以在某些本地库中设置单独的用户名和密码,来访问特定的远程库。

以上面的情况为例,我们可以给每台电脑只创建一个SSH密钥对,在公司台式机上针对个人代码的本地库设置Git用户名为personal@qq.com全局用户名设置为company@company.cn,然后在家里的台式机和笔记本上设置全局用户名为personal@qq.com

最后,在设置好Git用户名之后,给各台电脑的密钥对添加注释,填写每台电脑的名称,而不是邮箱。用表格列举如下:

电脑名称 密钥对注释 代码托管网站上显示密钥标题
HomePC -C “HomePC” HomePC
CompanyPC -C “CompanyPC” CompanyPC
Laptop -C “Laptop” Laptop

理清关系后,我们发现,SSH密钥对其实是与每台电脑关联的,而非Git用户。把密钥添加到代码托管网站上的时候,最好用一个跟这台电脑密切相关的注释。以后如果不使用这台电脑了,从网站上删除这个密钥很方便。

这里需要注意的是代码托管网站对本地设定的Git用户是如何处理的。代码托管网站主要关注Git用户名user.email,用user.email来匹配托管平台账户名的邮件地址,如果相同,代码托管网站就认为此操作是账户所有者的操作。下面举一个例子:
如果本地设定的user.emailpersonal@qq.com,由于在GitHub账户的邮件地址也是personal@qq.com,如果从这台电脑push的话,GitHub会认定这次push是账户拥有者自己做的;如果本地设定的user.emailcompany@company.cn,也能push到GitHub,但GitHub会记录这次的修改是另一个用户名为company的人做的。

小结

  • 使用ssh-keygen命令产生密钥对,每台电脑有一对就够了。

  • 在本地生成ssh密钥对时,推荐用计算机相关信息而不是用户名作为密钥对的注释。在代码托管网站上,也推荐用这个信息来做密钥对的标题。

  • 配置本地Git用户名时,全局配置(–global)要考虑该电脑上的工作主要push到哪个远程服务器,然后配置成跟那个服务器一致的用户名和邮件地址。

  • 除了主要push的服务器外,如果这台电脑上的工作还需要push到其他服务器,那么在具体的本地库目录下,把用户名和邮件地址配置成与特定服务器相同即可。

经过上面的操作,我们可以愉快地在不同的电脑上用相同的账户访问同一个代码库,同时不影响电脑其他的工作,并且能够更加清晰地分辨每个SSH密钥的用途。


非常感谢你的阅读,辛苦了!


参考文章: (感谢以下资料提供的帮助)