SSH长连接

我们知道怎样可以在连接ssh远程服务器的时候不输入密码, 但是每次连接的时候都建立一个新的连接未免过于啰嗦, 尤其是经常时不时就登上服务器的时候, 每次连接都耗费了我们的耐心.

这个时候, 如果SSH像TCP长连接那样就好了, 一直建立着, 不会断开.

你别说, 还真有.

不过名字就不叫SSH长连接了, 英文名叫 "SSH’s ControlMaster".

也就是一个小管家, 管理着你的那些连接. 比如, 你登陆了服务器A, 当你退出服务器A的时候, 小管家并不会断开连接, 尽管你看到确实是已经与服务器断开了. 当你再次登陆服务器A的时候, 你就回发现速度明显快了许多, 而且第一次登陆时欢迎的banner也不见了, 这是为什么? 就是因为小管家一直在连接着服务器, 在你看来, 你已经与服务器断开连接了, 但是服务器却认为你一直在线. 而且你用 ss -ant查看的时候也会发现连接是建立着的.

那怎么做呢?

~/.ssh/config文件里, 添加如下几句话:

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

解释一下都是什么意思:

  • Host * 对于所有主机都让小管家托管
  • ControlMaster auto 开启小管家的自动控制
  • ControlPath 托管的凭据在哪儿(一切皆文件)

当然, 你也可以指定仅适用于某些主机:

  1. HOST 192.168.0.*
  2. HOST *.com

如此之类的.

然后, 贴一下我的配置文件:

  1. TCPKeepAlive=yes
  2. ServerAliveInterval=15
  3. ServerAliveCountMax=6
  4. Compression=yes
  5. ControlMaster auto
  6. ControlPath /tmp/%r@%h:%p
  7. ControlPersist yes

刚才更新github的时候建立了一个连接:

  1. l git@github.com\:22
  2. srw------- 1 mr mr 0 1 19 18:12 git@github.com:22=

我看可以看到, 这是一个socket文件, 并且:

  1. ss -ant4 | grep -E ':22'
  2. ESTAB 0 0 10.177.46.227:40182 192.30.252.131:22

也是可以看到这个已经建立的连接的. 节省了以后再次建立连接的时间. 真的很快 :)