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 theControlPath
ControlPesist=60
sets the amount of time the connection should remain open due to inactivity