ssh配置多账号


我们可能会遇到这样的问题:自己电脑上有 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 文件,~/.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:项目地址

访问成功,互不影响,没毛病。

评论