OpenSSH多路复用Multiplexing配置

设置 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 

 参考资源

https://www.ibm.com/developerworks/cn/opensource/os-cn-openssh-multiplexing/index.html?ca=drs-&utm_source=tuicool&utm_medium=referral

原文地址:https://www.cnblogs.com/birdstudio/p/6801052.html