Первая команда не успела установить туннель при запуске второй команды, что дало «Отказ в соединении».
Просто не используйте, &
а используйте вместо этого параметр -f
:
-f
Запрашивает ssh перейти в фон непосредственно перед выполнением команды. Это полезно, если ssh собирается запрашивать пароли или парольные фразы, но пользователь хочет сделать это в фоновом режиме. Это подразумевает -n. Рекомендуемый способ запуска программ X11 на удаленном сайте - это что-то вроде ssh -f host xterm.
Если для параметра конфигурации ExitOnForwardFailure установлено значение «да», клиент, запущенный с параметром -f, будет ожидать успешного установления всех переадресаций с удаленного порта, прежде чем перейти в фоновый режим.
Собрав все это вместе, замените строку ssh в функции:
ssh -o ExitOnForwardFailure=yes -f -N -L port:host:5432 user@$ip -i ~/.ssh/key.pub
таким образом, запуск функции несколько раз, не оставит (несколько-1) бесполезный запуск SSH.
Также возможно заменить -N
короткой удаленной командой сна. Таким образом, не будет долгоживущей бездействующей команды ssh, которую нужно искать, чтобы ее убить. Ssh все еще будет ждать окончания использования туннеля, прежде чем закончится, поэтому небольшая задержка не является проблемой:
ssh -o ExitOnForwardFailure=yes -f -L port:host:5432 user@$ip -i ~/.ssh/key.pub sleep 15