Смежный вопрос: инициировать ssh-соединение с сервера на клиент
Ответ оттуда мне очень помог, эта команда делает то, что мне нужно:
ssh -R 2225:localhost:22 loginOfServerWithPublicIP@publicIP
Поэтому я написал сценарий для повторного подключения:
#!/bin/bash
while true; do
echo "try to connect..."
ssh -o ServerAliveInterval=240 -R 2225:localhost:22 user@host
echo "restarting in 5 seconds.."
sleep 5
done
И добавил это в /etc/crontab. Но я обнаружил, что это работает, только если я выполняю его «вручную» из оболочки, но если он вызывается cron, ssh подключается и сразу же завершает работу. (так, скрипт выше соединяется все время)
От man ssh, я обнаружил, что для фоновых соединений я должен назвать его с -nключом, но это не помогло. Затем я просто искал похожие сценарии и обнаружил, что он работает, если я вызываю tail -f something, то есть какую-то «бесконечную» команду, поэтому я просто создал пустой файл, /tmp/dummy_fileи теперь моя команда ssh выглядит так:
ssh -o ServerAliveInterval=240 -R 2225:localhost:22 -n user@host tail -f /tmp/dummy_file
Это работает сейчас! Но это решение кажется немного уродливым, плюс я не очень понимаю реальные причины такого поведения. Случайно я попытался позвонить bashвместо tail -f( bashкажется, мне тоже «бесконечной» командой), но это не сработало.
Итак, может кто-нибудь объяснить, пожалуйста, это поведение, и как правильно создать фоновое соединение SSH для поддержания обратного туннеля SSH?
whileцикл будет запускаться снова и снова, начиная новое фоновое sshсоединение каждые 5 секунд, верно? Это не то, что мне нужно.


&в конце вашей команды SSH:ssh -o ServerAliveInterval=240 -R 2225:localhost:22 user@host &