【猫咪教程】#3 使用ssh配置文件简化多服务器管理

话说每次你想连接服务器的时候都要这样:

1
$ ssh maomihz.com

假如你的服务器用的是非标准端口、和你不一样的用户名、非标准路径的私钥认证,你需要这样

1
$ ssh [email protected] -p 23323 -i ~/.ssh/my_key.pub

假如你还要端口转发的话,

1
$ ssh -L 43110:localhost:43110 -L 28332:localhost:28332 -R \*:25565:localhost:25565 [email protected] -p 23323 -i ~/.ssh/my_key.pub

要记住这条命令真不容易,但是,openssh可以通过创建配置文件的方式,记录所有关于一个主机的信息,以后再次登陆主机的时候只要这样:

1
$ ssh maomihz

今天的猫咪教程介绍如何使用ssh的配置文件来简化多服务器、多私钥的管理

3.1 找到配置文件

openssh同时有SSH的服务端和客户端。对于ssh客户端的配置文件,用户配置文件在~/.ssh/config,全局配置文件在/etc/ssh/ssh_config

修改全局配置文件需要root:

1
2
$ vim ~/.ssh/config
# vim /etc/ssh/ssh_config

3.2 编辑配置文件

配置文件是按主机来归类的,要给每一个主机一个名字:

1
2
3
4
5
6
7
8
9
Host 名字
配置项1 数值
配置项2 数值
...

Host 名字2
配置项1 数值
配置项2 数值
...

你的主机名字就是用来执行ssh命令用的:

1
$ ssh 主机名字

它会读取配置文件里关于主机的信息来连接主机

3.3 常见的配置项

若要参考官方文档,请查看ssh_config(5)
$ man 5 ssh_config

一个最常见、完整的主机配置是这样的:

1
2
3
4
5
6
7
8
9
Host server
HostName example.com
Port 23323
User maomi
IdentityFile ~/.ssh/my_key.pub

RemoteForward *:25565 127.0.0.1:25565
LocalForward 43110 127.0.0.1:43110
LocalForward 28332 127.0.0.1:28332
  • HostName定义了主机的域名/IP地址
  • Port定义了远程主机ssh服务器监听的端口
  • User定义了以该用户的身份登录
  • IdentityFile指定了用哪个私钥文件对远程主机进行验证
  • RemoteForward是远程端口转发,例子中所有请求远程25565端口(不管哪个网络接口)都会通过SSH隧道转给本地请求127.0.0.1:25565
  • LocalForward是本地端口转发,例子中所有请求本地43110端口都会通过SSH隧道转给远程请求127.0.0.1:43110
1
2
3
4
$ ssh server
Last login: Wed Jun 22 20:49:43 2016 from 8.8.8.8

[[email protected] ~]$

3.4 进阶技巧

Host后面的主机名字可以使用通配符,比如说

1
Host server*

匹配所有server开头的主机:server/server_1/server_home

SSH在读取文件的时候是从上往下读的,当它发现匹配时,会读取这一段里所有的配置数值。读取完后它并不会停止,还会继续往下读,假如有发现了一个匹配,它会加载里面的配置数值,但是一切已有的值不会被覆盖,所以说越通用的配置选项应该放在越后面。比如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
Host home_forward
RemoteForward *:25565 127.0.0.1:25565
LocalForward 43110 127.0.0.1:43110
LocalForward 28333 127.0.0.1:28332
ServerAliveInterval 10

Host home*
HostName home.example.com
Port 31874

Host maomihz
HostName example.com

Host other
HostName biong.net

Host *
User maomi
Port 22

假如运行ssh home_forward,ssh会读取第一块,第二块和最后一块配置文件,把它们合起来使用。

假如运行ssh maomihz,ssh会读取第三块,最后一块配置。