SSH配置主机别名及指定认证私钥路径

大家都知道可以用SSH密钥对进行身份验证,达到登录Linux主机,或者登录Git平台的目标。

但有一个问题,有时候你可能拥有几个不同的SSH私钥(虽然没什么使用多个密钥对的必要性),或者私钥文件文件名不是默认的~/.ssh/id_rsa,应该怎么指定需要使用的私钥文件路径呢?

几种常见的情景如下所示,更多详细内容,和标准的定义,请参考ssh_config手册,或在终端中键入man ssh_config查看。

使用命令行登录SSH

第一种,就是我们最常见的登录SSH服务器的方式。当你在终端中输入如下命令。

1
ssh myname@my.host.addr

SSH客户端会连接到该服务器,并尝试使用默认路径(见上述手册,IdentityFile部分)下的私钥,进行认证。如果私钥不在默认路径下,也未显式指定私钥文件,而服务器要求必须使用私钥认证,则认证失败。

如果想显式指定私钥,可以使用-i参数,指定私钥文件。例如。

1
ssh myname@myhost -i /path/to/mykey

如果是连接SSH服务器啥的,这就够用了。但缺点很明显,每次登录,都必须显式指定私钥文件。而如果是git命令,则会因为没有-i参数支持,命令执行失败。怎么改进呢?我们看下面。

使用ssh_conifg文件

配置文件

实际上,关于一个SSH连接,一些行为是可以在配置文件中定义的。你可以针对不同的目标服务器,配置不同的连接行为。

对于Linux中的一个用户而言,SSH配置文件位于~/.ssh/config。对于整个系统而言,SSH配置文件位于/etc/ssh/ssh_config(注意区别/etc/ssh/sshd_configsshd_config是SSH服务器进程的配置文件,不用于客户端。

我们用一个~/.ssh/config的片段来说明。

1
2
3
4
Host myserver
Hostname 192.168.1.123
User root
IdentityFile ~/mykey

上面这个配置文件非常好读懂。

最开始的Host,代表的是,你在ssh命令中,给定的host参数的值,常常就是你输入username@host@后面那部分。如果匹配,则应用下面的规则。对于该Host的定义,在config文件中持续到下一个Host或者Match

接下来是Hostname指定了你服务器的真实地址,可以是ip,当然也可以是域名。

User指定了登录的用户名。

IdentityFile指定了登录该Host使用的认证私钥文件路径。

使用

编写了配置文件,就可以使用了。现在,登录到你的服务器更加简单,只需要在终端中输入。

1
ssh myserver

就可以应用Host myserver块下的配置,自动使用指定的私钥文件进行认证。

Git

关于Git使用场景的提醒

虽然这个应该是旧闻了,但还是提醒一下,上面用于Git的案例,不仅适用于Github,也适用于其他Git平台,甚至包括自己搭建的Git服务器,像本网站的生成部署脚本,就利用了这个方法达到一键部署的效果。

我们可以用上述方法,解决git命令没有-i参数的不便之处。以Github为例,我们只需要向~/.ssh/config添加如下一个段落。

1
2
3
Host github.com
HostName github.com
IdentityFile ~/mykey

这样,下次对远程仓库代码进行更改时候,就会使用你指定的SSH私钥了。