如何在不同电脑上使用SSH访问同一个代码库
前言
最近在使用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 | Generating public/private rsa key pair. |
不输入文件名,按下回车后,会在你电脑的User文件夹的.ssh
路径下创建一个加密方式为rsa
、注释为username@email.com
的SSH密钥,而且会同时生成一对公钥和私钥,文件名为id_rsa
,公钥的文件后缀名为.pub
,私钥没有后缀名。
因此,在生成SSH密钥时,输入邮箱只是起到一个备注的作用,填写其他任意内容均可,也跟你的Git用户名没有任何关系。一台电脑使用一个SSH密钥就能访问多个远程服务器。
合理使用注释
那么,我们该如何填写注释,在日常使用中更方便地区分它们呢?
我列举这样一个场景:我在公司使用台式机办公,同时家里有一台台式机,自己有一台笔记本电脑。我有一些个人的兴趣性项目,代码托管在GitHub上,同时有一些公司的项目,代码托管在公司服务器上。我会在公司电脑上使用SSH访问公司服务器的代码库,并且偶尔需要用公司电脑访问自己的个人代码;在家里会使用台式机和笔记本访问自己的GitHub。
用表格列举如下:
电脑名称 | 说明 |
---|---|
HomePC | 家中使用的台式电脑 |
CompanyPC | 公司使用的台式电脑 |
Laptop | 自己的笔记本电脑 |
代码托管平台 | 用户名 | 说明 | |
---|---|---|---|
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.email
是personal@qq.com
,由于在GitHub账户的邮件地址也是personal@qq.com
,如果从这台电脑push的话,GitHub会认定这次push是账户拥有者自己做的;如果本地设定的user.email
是company@company.cn
,也能push到GitHub,但GitHub会记录这次的修改是另一个用户名为company
的人做的。
小结
使用ssh-keygen命令产生密钥对,每台电脑有一对就够了。
在本地生成ssh密钥对时,推荐用计算机相关信息而不是用户名作为密钥对的注释。在代码托管网站上,也推荐用这个信息来做密钥对的标题。
配置本地Git用户名时,全局配置(
–global
)要考虑该电脑上的工作主要push到哪个远程服务器,然后配置成跟那个服务器一致的用户名和邮件地址。除了主要push的服务器外,如果这台电脑上的工作还需要push到其他服务器,那么在具体的本地库目录下,把用户名和邮件地址配置成与特定服务器相同即可。
经过上面的操作,我们可以愉快地在不同的电脑上用相同的账户访问同一个代码库,同时不影响电脑其他的工作,并且能够更加清晰地分辨每个SSH密钥的用途。
非常感谢你的阅读,辛苦了!
参考文章: (感谢以下资料提供的帮助)