如何通过控制命令管理SSH多路复用
多路复用通过重用与远程主机的现有TCP连接来提升SSH连接速度。当您频繁使用SSH协议连接到同一服务器进行远程登录、服务器管理、使用IT自动化工具或运行定时备份时,这非常有用。然而,在使用多路复用时,您的SSH命令有时可能无响应或会话挂起。这通常发生在公网IP变更、VPN问题或防火墙切断连接时。因此,了解SSH客户端控制命令可以在出现这些问题时节省时间并提高工作效率。
SSH多路复用工作原理
假设您想连接到AWS EC2服务器,在CLI中键入以下命令:
1
|
$ ssh ec2-user@ec2-ipv4-or-ipv6-address-here
|
对于SSH多路复用,您需要首先初始化并设置一个称为套接字的控制主连接文件。例如,可以为SSH用户vivek和远程主机'192.168.2.20’设置一个名为’/home/vivek/.ssh/controlmasters/vivek@192.168.2.20:22’的套接字文件。现在,所有后续的SSH命令会话都会重用这个主连接文件,而不是创建新的TCP连接,从而加速连接。
如何设置SSH多路复用
使用以下命令:
1
|
$ ssh -M -S {/path/to/socket_file} {user}@{server}
|
首先使用mkdir命令创建新目录:
1
|
$ mkdir -v ~/.ssh/controlmasters/
|
然后输入:
1
|
$ ssh -M -S ~/.ssh/controlmasters/freebsd-server-socket vivek@192.168.2.20
|
您可以指定TCP端口,如TCP/2222:
1
|
$ ssh -P 2222 -M -S ~/.ssh/controlmasters/freebsd-server-socket vivek@192.168.2.20
|
在Linux macOS或Unix客户端桌面上启用SSH多路复用
参数说明:
-M
:为SSH启用多路复用主模式
-S ~/.ssh/controlmasters/freebsd-server-socket
:指定连接共享的控制套接字文件路径
vivek@192.168.2.20
:指定SSH用户和服务器IP或DNS名称
-P 2222
:使用TCP/2222进行ssh连接
设置完成后,下次只需输入:
1
2
|
$ ssh {user}@{host}
$ ssh vivek@192.168.2.20
|
使用SSH配置文件创建多路复用
编辑~/.ssh/config
文件并为名为db1的主机添加以下配置:
1
2
3
4
5
6
7
|
Host db1
ControlPath ~/.ssh/controlmasters/%r@%h:%p
ControlMaster auto
ControlPersist yes
User ec2-user
Host 1.2.3.4
Port 2222
|
现在只需连接:
推荐的方式是先配置单个主机,然后为所有主机应用通用设置:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
Host aws-db1
Hostname 15.xxx.xxx.xxx
User debian
IdentityFile ~/.ssh/id_ed25519
Host aws-web-server
Hostname 23.xxx.yyy.zzz
User admin
IdentityFile ~/.ssh/id_ed25519
Host post-bios-unlock-freebsd-raid-server
Hostname 192.168.2.19
Port 2222
User root
RequestTTY yes
RemoteCommand cryptroot-unlock
IdentityFile ~/.ssh/intel_nuc_freebsd
HostKeyAlgorithms ssh-rsa
# 为所有主机启用SSH多路复用
Host *
IdentitiesOnly yes
ControlPath ~/.ssh/controlmasters/%r@%h:%p
ControlMaster auto
ControlPersist yes
|
使用控制命令管理SSH多路复用
语法:
1
2
|
$ ssh -O {ctrl-command} {IP}
$ ssh -O {ctrl-command} {user}@{IP}
|
SSH多路复用控制命令列表
命令 |
描述 |
示例 |
check |
检查主进程是否运行 |
ssh -O check {server} |
forward |
请求转发而不执行命令 |
ssh -O forward -L port:host:port {server} |
cancel |
取消转发 |
ssh -O cancel {server} |
exit |
请求主连接退出 |
ssh -O exit {server} |
stop |
请求主连接停止接受多路复用请求 |
ssh -O stop {server} |
检查主连接是否活动
输入:
1
2
|
$ ssh -O check {host}
$ ssh -O check 192.168.2.20
|
可以使用小写o选项指定控制文件路径:
1
2
|
$ ssh -o ControlPath={/path/to/socket} -O check {host}
$ ssh -o ControlPath=~/.ssh/controlmasters/freebsd-server-socket -O check 192.168.2.20
|
输出:
1
|
Master running (pid=2030199)
|
使用stop或exit选项关闭主连接
当主SSH连接出现问题时,可以终止它:
1
2
|
$ ssh -O exit {host}
$ ssh -o ControlPath={/path/to/socket} -O exit {host}
|
输出:
验证:
1
|
$ ssh -O check 192.168.2.20
|
输出:
1
|
Control socket connect(/home/vivek/.ssh/controlmasters/vivek@192.168.2.20:22): No such file or directory
|
ssh -O stop vs. ssh -O exit命令的区别
ssh -O exit
命令完全终止主SSH连接。与该主连接关联的所有活动会话将突然关闭,如果您正在远程主机上编辑文件,可能会导致数据丢失。
ssh -O stop
选项对现有SSH连接更加温和。此选项阻止使用现有主连接创建新会话,但允许现有会话继续运行,直到它们完成或由用户独立关闭。
语法:
1
2
|
$ ssh -O stop {host}
$ ssh -o ControlPath={/path/to/socket} -O stop {host}
|
多路复用时的SSH端口转发控制
以下示例假设远程SSH服务器上已安装所需服务并在TCP端口8443或VNC服务器端口5900上正常运行。
可以通过多路复用连接转发本地端口:
1
2
|
$ ssh -O forward -L {port}:{host}:{port} {user}@{remote_ip}
$ ssh -o ControlPath={/path/to/socket} -O forward -L {port}:{host}:{port} {user}@{remote_ip}
|
退出多路复用的转发会话:
1
2
|
$ ssh -O cancel {user}@{remote_ip}
$ ssh -o ControlPath={/path/to/socket} -O cancel {user}@{remote_ip}
|
例如,VNC端口转发:
1
|
$ ssh -O forward -L 5900:127.0.0.1:5900 vivek@192.168.2.20
|
取消SSH转发:
1
|
$ ssh -O cancel vivek@192.168.2.20
|
另一个示例:
1
|
$ ssh -O forward -L 8443:10.147.164.1:8443 vivek@192.168.2.20
|
参数说明:
ssh -O forward
:通过多路复用的SSH端口转发命令
-L 8443:10.147.164.1:8443
:端口转发命令
- 第一个
8443
:本地机器上的端口号
10.147.164.1
:目标IP地址
- 第二个
8443
:目标机器上的目标端口号
如何测量SSH多路复用效果
首先连接并激活多路复用套接字:
1
|
$ time ssh {user}@{server} true
|
输出:
1
2
3
|
real 0m3.563s
user 0m0.018s
sys 0m0.004s
|
使用time命令测量多路复用效果:
1
|
$ time ssh {user}@{server} true
|
输出:
1
2
3
|
real 0m0.939s
user 0m0.004s
sys 0m0.003s
|
禁用多路复用并测试:
1
|
$ time ssh -o 'ControlMaster=no' -o 'ControlPath=no' {user}@{server} true
|
输出:
1
2
3
|
real 0m3.508s
user 0m0.014s
sys 0m0.007s
|
总结
SSH多路复用是一个非常方便的功能,但其控制命令文档较少。本文提供了如何使用SSH多路复用及其控制命令的各种实用示例。