SSH客户端可以通过配置进行不少实用的功能。详细的说明可以参见man ssh_config
概述
配置入口
- 作为命令行参数传递
- 用户级配置文件
~/.ssh/config
- 系统级配置文件
/etc/ssh/ssh_config
配置格式和用法
- 空行和
#
开头的行均为注释 - 有效行以
keyword arguments
为一组,参数可以由空白符隔开,或者以=
表示一一对应的关系 - 参数如果包含空格,需要用引号包括整体参数;如果使用
=
作为分隔符,则不用 - 配置项的
keyword
大小写不敏感
通常一个有效的配置组有以下模式:
Host app1
HostName my.app.com
Port 2200
User superadmin
那么,你获得了一个app1
的配置;你可以把app1
当作一种别名,任何ssh
相关的命令里面都可以用它来获取你之前的配置。例如,建立一个交互式的ssh连接:
ssh app1
你会发现,它等效于:
ssh -p 2200 superadmin@my.app.com
翻阅文档不难发现,ssh
的配置向有很多很多。下文会给出一些十分有趣的配方,让你快速从中获益。
美味配方
Recipe 01: 管理多公钥
为了安全或者其他因素,我们会拥有多个公钥。在没有指定特定公钥的情况下,ssh
会使用~/.ssh/id_rsa.pub
作为公钥。假如针对开放服务(例如github等),我们要使用另外一个公钥,通常需要利用ssh
的-i
参数;我们也可以利用ssh_config
来轻松管理。
Host github.com
IdentityFile ~/.ssh/github.key
假如,github内,我们需要针对不同的team,使用不同的公钥,我们还可以:
Host github-project1
User git
HostName github.com
IdentityFile ~/.ssh/github.project1.key
Host github-org
User git
HostName github.com
IdentityFile ~/.ssh/github.org.key
Host github.com
User git
IdentityFile ~/.ssh/github.key
Recipe 02: 安全网关
对于大多数不公共暴露服务,只能通过一个网关服务器去访问。假如一个简化的拓扑结构如下:
- > App1
/
Internet < - > Gateway < - > - > App2
\
- > App3
这样,我们必须通过Gateway
来访问内部的APP服务器,我们可以利用ProxyCommand
和nc
来一起实现:
Host gateway
HostName example.com
User foo
Port 22
IdentityFile ~/.ssh/id_rsa.pub
Host app1
HostName gold-mine.com
Port 22
User foo
ProxyCommand ssh -A gateway nc %h %p
这样,我们可以直接通过如下命令来访问app1
:
ssh app1
Recipe 03: 安全通道
除了登录到网关之后手动连接,我们也可以通过网关建立安全通道,并映射到开发者本地的某个端口;这样开发者可以直接通过本地端口连接网关之后的私有服务。
例如,我们需要连接一个只在数据库服务本地监听的mysql:
$ ssh -f -N -L 9906:127.0.0.1:3306 root@mysql.app.com
那么我们可以通过mysql连接本地的9906
端口来进行访问远程的数据库。
将这些参数转换为ssh_config
:
Host tunnel
HostName mysql.app.com
IdentityFile ~/.ssh/internal-1.key
LocalForward 9906 127.0.0.1:3306
User root
ssh命令被简化为:
$ ssh -f -N tunnel
假设,这台mysql本身就在网关之后呢?利用上一条recipe,我们可以如下设置:
Host gateway
HostName gateway.app.com
User root
Port 22
IdentityFile ~/.ssh/id_rsa.pub
Host tunnel
HostName mysql.app.com
Port 22
User root
ProxyCommand ssh -A gateway nc %h %p
LocalForward 9906 127.0.0.1:6379
ssh命令不变,但是这时,ssh通道是经用网关服务器转发的。
科学上网
利用ssh转发功能,我们可以迅速的打开一个socks代理:
$ ssh -CfNg -D 127.0.0.1:1080 root@server.com
-
-C
:开启通讯压缩 -
-f
:后台执行 -
-N
:忽略远程命令(服务器端sshd配置) -
-g
:允许远程用户访问本地转发端口 -
-D
:开启ssh的动态转发,即实现一个sock代理
只有-D
是核心命令,其他的都是辅助效果。
相应的ssh_config
为:
Host prxoy
HostName server.com
Port 22
User root
Compression yes
DynamicForward *:6370
相应的ssh命令:
$ ssh -fN proxy
即使直接ssh proxy
也可以,只不过这个进程没有进入后台,当你临时使用时反而这样更方便。