原理很简单,开一个 ssh 连接在后台放着,以后再有需要用到 ssh 到同样主机的时候,直接使用这个连接的 socket 文件,不用再创建连接了,同理,也不需要再进行用户身份验证。

默认是关闭的,可以在 ~/.ssh/config 中打开:

Host *
    ControlMaster auto
    ControlPath ~/.ssh/master-%r@%h:%p

创建 “Master” 连接就可以用:

$ ssh -M -N -f lmlphp.com

认证成功后会创建 socket 文件 may@lmlphp.com:22。

其它的介绍资料也很多,网上用 ssh master ControlMaster 搜索资料很多。

实际使用中,我倒有一个反面的感觉,创建了 “Master” 之后,一般的 scp 什么的操作的确是快了,可如果单独开一个 ssh terminal 上去的话,输入的响应速度很变慢。开始以为是这个 ssh 连接也重用了 “Master” 的原因,后来加上 -o ControlMaster=no 参数强制不使用 Master,单独创建新连接也是一样,不知道是什么原因导致的。

仔细测试一下效果,首先在已经创建 Master 的情况下连接主机,执行命令并马上退出:

$ time ssh lmlphp.com -C pwd

执行多次,得到的执行时间一般在 0.33 秒左右,然后关闭 Master,再次执行这个命令,平均执行时间为 6.7 秒,的确是快了许多。

后来才发现,刚才对响应速度“慢”的感觉应该是错误的,可能是由于另外开着一个 scp 的缘故,scp 完成之后,速度就快很多了。之所以会感觉“慢”,其实也是相对而言的,因为单独 ssh 连接上去之后,也是不中断的持续连接、持续响应,同样没有重新建立连接的时间,速度也是非常快的。开启 Master 主要对那些一会儿连接、一会儿断开,请求断断续续的情况最有效果。

另外,还有两个比较有用的相关控制命令:

# 检查当前是否已经创建 Master 连接 Note:Capitalization of the letter o
$ ssh lmlphp.com -O check
Master running (pid=6350)

# 发送断开当前 Master 连接的请求,比我用的笨 kill 方式好多了
$ ssh lmlphp.com -O exit
Exit request sent.
$ ssh lmlphp.com -O check
Control socket connect(/home/may/.ssh/master-may@may.com:22): No such file or directory

参考 Accelerating OpenSSH connections with ControlMaster (https://www.linux.com/news/accelerating-openssh-connections-controlmaster)

05-21 20:24