我们可能会遇到这样的问题:自己电脑上有 ssh 秘钥,生成的时候默认存在 ~/.ssh 目录中,用于登录服务器,而公司的版本控制工具使用的是 git,并且也是使用 ssh 登录,这时候想要在自己电脑上使用拉取公司项目该怎么办?
直接使用以下命令 clone 公司项目肯定会授权失败。
git clone 服务器地址:项目地址
原因在于该命令会默认读取 ~/.ssh 目录中的 ssh 秘钥来尝试登录服务器, ~/.ssh 目录中的 ssh 秘钥是登录自己服务器用的,并不能登录公司的 git 服务器,所以登录授权失败。很容易想到使用公司 Git 服务器的 ssh 覆盖掉自己的 ssh 文件,这样登录访问公司 Git 服务器就没问题了,但是想要登录自己服务器时又得把 ssh 替换成自己服务器的 ssh,这样不仅麻烦而且很容易搞混或丢失 ssh 文件。
解决方法是使用 ssh 的 config 文件配置不同的服务器使用不同的 ssh 秘钥,把两个服务器的 ssh 秘钥区分开来。
使用命令生成一组 ssh 文件,~/.ssh 目录的文件结构是这样的:
.
├── id_rsa
├── id_rsa.pub
└── known_hosts
其中 id_rsa.pub 是公钥,把它的内容复制到服务器的 ssh 配置中,使用 id_rsa 秘钥就可以使用 ssh 命令登录服务器了。
创建 ssh config 文件:
cd ~/.ssh
vi config
输入以下配置:
Host 别名
User 服务器用户名
Hostname 服务器地址
Port 端口
IdentityFile ~/.ssh/id_rsa
Host 别名
User 服务器用户名
Hostname 服务器地址
Port 端口
IdentityFile 秘钥文件位置
这样就给两个服务器分别配置了不同的秘钥文件。
上面是简单的配置结构,以下是每个字段的含义:
Host: 是服务器别名,方便记忆。
User:服务器用户名,如 root
Hostname:服务器 IP 地址
Port:服务器端口,如 22
IdentityFile:ssh 秘钥文件本地位置
比如,我是这样配置的:
Host gitolite
User gitolite
Hostname XXX.XXX.XXX.XXX
Port XXXX
IdentityFile ~/.ssh/id_rsa
Host vultr
User root
Hostname XXX.XXX.XXX.XXX
Port XXXX
IdentityFile ~/.ssh/vultr_id_rsa
~/.ssh 目录结构:
.
├── config
├── id_rsa
├── id_rsa.pub
├── known_hosts
├── vultr_id_rsa
└── vultr_id_rsa.pub
id_rsa、id_rsa.pub 是公司 git 服务器的 ssh 文件, vultr_id_rsa、vultr_id_rsa.pub 是我的 vultr vps 服务器 ssh 文件。
现在就可以直接使用命令来登录不同的服务器:
使用别名登录 vps:
ssh vultr
访问公司 git 服务器:
git clone gitolite:项目地址
访问成功,互不影响,没毛病。