原理很简单,开一个 ssh 连接在后台放着,以后再有需要用到 ssh 到同样主机的时候,直接使用这个连接的 socket 文件,不用再创建连接了,同理,也不需要再进行用户身份验证。
默认是关闭的,可以在 ~/.ssh/config 中打开:
Host * ControlMaster auto ControlPath ~/.ssh/master-%r@%h:%p
创建 “Master” 连接就可以用:
$ ssh -M -N -f lmlphp.com
认证成功后会创建 socket 文件 [email protected]: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/[email protected]:22): No such file or directory
参考 Accelerating OpenSSH connections with ControlMaster (https://www.linux.com/news/accelerating-openssh-connections-controlmaster)