ssh的连接重用

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

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

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

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

ssh -M -N -f fwolf.com

认证成功后会创建socket文件master-fwolf@fwolf.com:22

其它的介绍资料也很多,我是在[邮件列表](http://groups.google.com/group/szlug/t/e504940647256c1f)中看到的,惭愧,使用ssh很久了,现在才知道,网上用ssh master ControlMaster搜索资料很多。

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

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

$ time ssh fwolf.com -C pwd

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

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

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

# 检查当前是否已经创建Master连接
$ ssh fwolf.com -O check
Master running (pid=6350)

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

参考

[Accelerating OpenSSH connections with ControlMaster](http://www.linux.com/feature/54498)

3 thoughts on “ssh的连接重用”

  1. 单独用就很好用 但是我用ssh做tunnel就不正常了 表现在,如果已经有了一个ssh 再连一个ssh不用输入密码,这个正常 但是已经不能做tunnel了

    或者做了一个tunnel之后做不了第二个

  2. 如果已经开了master,再作tunnel的时候 可以试着用-S ControlPath指定其他master的socket(master也可以不存在) 或者用-o ControlMaster=no关闭对master的使用? 不过我都没有测试过,建议你试试。

    Update

    已测试这种方式可用: ssh fwolf.com -o ControlPath=/tmp/ssh 指定一个不存在但可写的socket文件就可以了。

Leave a Reply

Your email address will not be published. Required fields are marked *