Cover image

持久化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