How to reuse an ssh connection

2020-02-09 02:13发布

问题:

I'm creating a small script to update some remote servers (2+)
I am making multiple connects to each server; is there a way I can reuse the SSH connections so I don't have to open too many at once?

回答1:

If you open the first connection with -M:

ssh -M $REMOTEHOST

subsequent connections to $REMOTEHOST will "piggyback" on the connection established by the master ssh. Most noticeably, further authentication is not required. See man ssh_config under "ControlMaster" for more details. Use -S to specify the path to the shared socket; I'm not sure what the default is, because I configure connection sharing using the configuration file instead.

In my .ssh/config file, I have the following lines:

host *
  ControlMaster auto
  ControlPath ~/.ssh/ssh_mux_%h_%p_%r

This way, I don't have to remember to use -M or -S; ssh figures out if a sharable connection already exists for the host/port/username combination and uses that if possible.

This option is available in OpenSSH since 2004.



回答2:

I prefer the method described at Puppet Labs https://puppetlabs.com/blog/speed-up-ssh-by-reusing-connections

Add these lines to ~/.ssh/config and run mkdir ~/.ssh/sockets

Host *
    ControlMaster auto
    ControlPath ~/.ssh/sockets/%r@%h-%p
    ControlPersist 600

Read the full blog post for more useful information about what these do and the idiosyncrasies of ssh when used like this. I highly recommend reading the blog or you may find things don't work as you expect.



回答3:

Alternatively, you can do it this way:

$ssh_conn="ssh -t -o ControlPath=~/.ssh/master-$$ -o ControlMaster=auto -o ControlPersist=60"

$ssh_conn user@server
  • ControlPath=~/.ssh/master-$$ sets up a control path for the ssh connection limiting connection reuse to the current shell (via the $$ PID)
  • ControlMaster=auto allows the connection session to be shared using the ControlPath
  • ControlPesist=60 sets the amount of time the connection should remain open due to inactivity


标签: ssh