Se o shell do usuário remoto for ksh93, zsh ou bash (ou sh
implementado como qualquer um desses), você poderia fazer:
eval "$(ssh -nq "$user@$host" '
printf "%s=%q\n" \
tmp1 "$(command1)" \
tmp2 "$(command2)" \
tmp3 "$(command3)"')"
No entanto, observe que você estará ausente no status de saída dos comandos remotos. E isso poderia permitir que o usuário remoto fizesse com que você executasse comandos arbitrários (por exemplo, emitindo algo em seu ~/.bashrc
).
Outra opção é usar o recurso ControlMaster
de ssh
para compartilhar uma conexão entre várias chamadas de ssh. Você também pode usar o modo auto
. Algo como:
mkdir -p -- ~/.ssh/ctl
tmp1=$(ssh -o ControlMaster=auto \
-o ControlPath="$HOME/.ssh/ctl/%L-%r@%h:%p" \
-o ControlPersist=5m -nq "$user@$host" cmd1)
(e o mesmo para tmp2
...). Essa sintaxe reutiliza uma conexão existente, se existir ou cria uma nova, de outra forma. Ele será encerrado após 5 minutos de inatividade ou você pode fechá-lo explicitamente com:
ssh -o ControlPath="$HOME/.ssh/ctl/%L-%r@%h:%p" -O exit "$user@$host"
A primeira chamada levará tempo, porque ela executará a conexão e a autenticação, enquanto as seguintes serão muito mais rápidas.
Claro, se você não precisa das três saídas de comando para ir em três variáveis diferentes, você pode fazer:
tmp=$(ssh -nq "$user@$host" '
cmd1
cmd2
cmd3')
Assim, as 3 saídas de comando aparecerão concatenadas em $tmp
.