I found out that using persistent connections greatly improves the productivity when working with SSH. However, finding the appropriate configuration turned out to be a complicated task. I wanted it to be as unobtrusive as possible, to restart the connection when the socket is closed, and to work without blocking timeouts.
After reading the ssh_config man page and some articles, here’s the best thing I came up with:
Host * ControlPath ~/.ssh/master-%[email protected]%h:%p ControlMaster auto ControlPersist 4h TCPKeepAlive no GSSAPIAuthentication no ServerAliveInterval 60 ServerAliveCountMax 2
The only issue with this configuration is with long hosts (eg: a really long name) as it hits the UNIX_PATH_MAX limit. Unfortunately, the proper solution to this issue isn’t merged into upstream.
The OS X users who also use brew may easily include the patch for the path issue by editing the openssh formula for OpenSSH 6.6p1 with “brew edit openssh”:
patch do url "http://www.mirrorservice.org/sites/downloads.sourceforge.net/m/ma/mancha/misc/openssh-6.6p1-mux-hash.diff" sha1 "31f6df29ff7ce3bc22ba9bad94abba9389896c26" end
With this patch, a value like ~/.ssh/master-%m works for ControlPath. %m is replaced by SHA1(lhost(%l) + rhost(%h) + rport(%p) + ruser(%r)) and it keeps things short and sweet.