Abra uma conexão SSH uma vez e, em seguida, coloque-a sobre ela. Esse recurso do OpenSSH é chamado de conexões mestre. Consulte Como usar um canal SSH já estabelecido
ssh_control_socket="$(mktemp)"
ssh -o ControlPath="$(ssh_control_socket)" -o ControlMaster=yes -o ControlPersist=yes administrator@host "mkdir ${DIR}"
# other commands using ssh (ssh, scp, rsync, …): pass the same ControlPath option
ssh -o ControlPath="$(ssh_control_socket)" -t administrator@host "…"
rsync -e "ssh -o 'ControlPath=$(ssh_control_socket)'" …
ssh -o ControlPath="$(ssh_control_socket)" administrator@host -O exit
rm -f "$(ssh_control_socket)"
Irritantemente, você precisa passar explicitamente uma opção ControlPath
em cada chamada SSH (é o nome de um arquivo usado para comunicação entre cada invocação de ssh
e o cliente SSH original que fez a conexão real). Aqui eu passo um nome de soquete explícito para que o script seja autocontido. Se confiar em ~/.ssh/config
for aceitável, adicione essa linha ao seu ~/.ssh/config
:
ControlPath ~/.ssh/%l_%h_%p_%r.multiplex
Isso faz com que todos os clientes SSH consigam verificar se existe uma conexão existente a ser ligada. O recurso não será realmente usado a menos que haja uma conexão mestre de escuta, você ainda precisa transmitir -o ControlMaster=yes
(ou -M
para abreviar) na primeira conexão, ou seja, seu script pode ser
# Open the shared connection
ssh -M -o ControlPersist=yes administrator@host :
# … all SSH-relying commands in their basic form, they will go via the shared connection …
# Close the shared connection
ssh -O exit administrator@host