设置 Session Multiplexing
在客户端节点如下配置/etc/ssh/ssh_config 或~/.ssh/config 就可以直接开启 Session Multiplexing 功能:
清单 1. 配置 Session Multiplexing
Host * #该部分的定义将应用到全部主机 ControlMaster yes #Session Multiplexing 开关 ControlPath ~/.ssh/master-%r@%h:%p #供 Session Multiplexing 使用的 Control Socket (Unix Socket) 路径 ControlPersist yes #是否开启后台 Control master 模式
成功开启后,无论从该客户端节点用同一用户向同一 SSH Server 节点发起多少次连接,都有且仅有一条连接被建立,负责该节点到该 Server 之间的所有 SSH 包文。
下面我们给出一个实际案例:如清单 2 所示,设有一个 SSH 服务器节点:9.115.241.18,一个 SSH 客户端节点:9.115.241.20。在客户端的 Session Multiplexing 开启的情况下,向服务器端建立若干个 SSH 会话,最后在客户端或服务器端检测实际存在的连接数,会发现整个过程仅仅有一条 TCP 被建立起来。
清单 2. Multiplexing 实际使用案例
# 注:以下的操作均在客户端节点(9.115.241.20)完成 # 建立一个连接到服务器端,定期执行 ls 命令打印出当前目录下的文件 $ ssh zhang@9.115.241.18 'while /bin/true; do ls; sleep 1; done > /dev/null' &[1] 11551 # 再建立另一个连接到服务器端,执行同样的操作 $ ssh zhang@9.115.241.18 'while /bin/true; do ls; sleep 1; done > /dev/null' &[2] 11638 # 最后,显示出当前节点接入服务器端(9.115.241.18)22 端口(SSH 协议)的所有连接 $ netstat -n | grep '9.115.241.18:22' tcp 0 0 9.115.241.18:22 9.115.241.20:52148 ESTABLISHED
由清单 2 最后的 netstat 命令可知,无论由客户端发起多少个 SSH 进程,都只会有一条连接建立起来,而这一条连接便承载了 9.115.241.20 到服务器端的所有 SSH 通讯。
例子
新建文件ip.txt
清单 3.ip.txt
127.0.0.1 127.0.0.1 127.0.0.1 127.0.0.1 127.0.0.1 127.0.0.1 127.0.0.1 127.0.0.1
新建脚本ssht.sh
清单 4.ssht.sh
#!/bin/bash while read line;do ssh -n $line "echo ok &>/dev/null" && echo -e "e[1;32m OK e[0m" || echo -e "e[1;31m FAIL e[0m" done < ip.txt
然后执行 time sh ssht.sh
清单 5.结果
OK
OK
OK
OK
OK
OK
OK
real 0m17.460s
user 0m1.109s
sys 0m0.607s
参考资源