SSH多路复用控制命令完全指南

本文详细介绍了SSH多路复用技术及其控制命令的使用方法,包括如何设置主连接、配置SSH配置文件、管理连接状态、端口转发以及性能测试等实用技巧。

如何通过控制命令管理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
$ ssh db1

推荐的方式是先配置单个主机,然后为所有主机应用通用设置:

 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
Exit request sent.

验证:

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多路复用及其控制命令的各种实用示例。

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计