Der erste Befehl hatte keine Zeit, um einen Tunnel einzurichten, als der zweite Befehl ausgeführt wurde, wodurch eine "Verbindung abgelehnt" wurde.
Verwenden Sie einfach nicht &
die Option, sondern verwenden Sie stattdessen die Option -f
:
-f
Fordert ssh auf, vor der Befehlsausführung in den Hintergrund zu wechseln. Dies ist nützlich, wenn ssh nach Passwörtern oder Passwörtern fragt, der Benutzer dies jedoch im Hintergrund wünscht. Dies impliziert -n. Die empfohlene Methode zum Starten von X11-Programmen an einem Remote-Standort ist etwa ssh -f host xterm.
Wenn die Konfigurationsoption ExitOnForwardFailure auf "yes" gesetzt ist, wartet ein mit -f gestarteter Client, bis alle Remote-Port-Weiterleitungen erfolgreich eingerichtet wurden, bevor er sich im Hintergrund befindet.
Wenn Sie all dies zusammenstellen, ersetzen Sie die ssh-Zeile in der Funktion durch:
ssh -o ExitOnForwardFailure=yes -f -N -L port:host:5432 user@$ip -i ~/.ssh/key.pub
Wenn Sie die Funktion mehrmals ausführen, wird (multiple-1) nutzlos ssh nicht ausgeführt.
Es ist auch möglich, durch -N
einen kurzen Remote-Sleep-Befehl zu ersetzen . Auf diese Weise wird es keinen langlebigen ssh-Befehl im Leerlauf geben, der durchsucht werden muss, wenn er getötet werden muss. Ssh wartet immer noch mit dem Ende der Tunnelnutzung, bevor es beendet wird. Die kurze Verzögerung ist also kein Problem:
ssh -o ExitOnForwardFailure=yes -f -L port:host:5432 user@$ip -i ~/.ssh/key.pub sleep 15