持久化ssh连接
             Oct 12, 2015
        
        前两天在设置github的多ssh-key登陆时,有个问提扰了我好久,直到后来才找到原因,特此记录一下。
话说前段时间在用超算中心跑实验的时候,由于学校的战斗力为5的渣渣网速,ssh以及sshfs每隔几分钟就断掉一次,而每次连接又耗费大量时间等待其身份验证,于是从google上查找了一下,在~/.ssh/config添加两行:
ControlMaster auto
ControlPath /tmp/ssh_mux_%h_%p_%r
ControlPersist 4h好吧,瞬间有一种便秘了好多天突然畅通无阻的感觉(我承认我是有够低俗的),心情舒畅了不少。但具体是什么意思自己也没细想,就把他搁那儿了。
然后的然后,在设置多个github登陆时,又修改了.ssh/config文件如下:
ControlMaster auto
ControlPath /tmp/ssh_mux_%h_%p_%r
ControlPersist 4h
Host user1.github.com
Host github.com
User git
IdentityFile ~/.ssh/id_rsa1
Host user2.github.com
Host github.com
User git
IdentityFile ~/.ssh/id_rsa2然后ssh分别进行测试两个Host能否联通,但令人抓狂的是每次return的都是Hi, User1,而且对User2的repo进行push也无法认证,因为是User1的sshkey,如此几次怎么查找都找不出问题所在,后来一怒之下关机重启了。
再一次进行ssh测试User2的连接情况,奇迹发生了,终于出现Hi, User2了,但这时sshUser1也成了Hi, User2,突然想起来是不是config里前三行搞的鬼?然后继续问谷歌吧。
ControlMaster auto告诉ssh客户端尝试重用现有的连接(master connection)。
ControlPath指定了这个连接的socket保存位置,这里保存在/tmp路径下,以便重启后便删除了,实际放在其他地方也可以。文件名中%h表示远程主机名(host),%p表示端口(port),%r表示远程用户名(remote user name)。文件可随时rm掉然后重新连接。
ControlPersist 4h表示在创建的首个连接(master connection)的会话推出后,master连接仍然在后台保留,以便其他复用该连接的会话不会出现问题。- — @李林克斯 《重用SSH连接》
难怪,由于的我的ControlMaster配置没有在哪个Host下,因此对全局生效,况且github的user都是git,所以导致每次验证的都是master的连接,难怪会出现问题。看来以后遇到问题后不能什么都不懂直接Copy,因为接下来总会有莫名其妙的问题等着你。
12 Oct 2015
Post by: MetaCoder