O primeiro comando não teve tempo de estabelecer um túnel quando o segundo comando foi executado, dando assim uma "Conexão recusada".
Apenas não use &
, mas use a opção -f
:
-f
Requests ssh to go to background just before command execution. This is useful if ssh is going to ask for passwords or passphrases, but the user wants it in the background. This implies -n. The recommended way to start X11 programs at a remote site is with something like ssh -f host xterm.
If the ExitOnForwardFailure configuration option is set to “yes”, then a client started with -f will wait for all remote port forwards to be successfully established before placing itself in the background.
Colocando tudo isso junto, substitua a linha ssh na função por:
ssh -o ExitOnForwardFailure=yes -f -N -L port:host:5432 user@$ip -i ~/.ssh/key.pub
assim, rodando a função várias vezes, não vai deixar (multi-1) ssh inútil rodando.
Também é possível substituir -N
por um comando sleep curto e remoto. Dessa forma, não haverá um comando idle ssh ocioso que deve ser pesquisado se tiver que ser morto. O Ssh ainda esperará o fim do uso do túnel antes de terminar, então o pequeno atraso não é um problema:
ssh -o ExitOnForwardFailure=yes -f -L port:host:5432 user@$ip -i ~/.ssh/key.pub sleep 15