Смежный вопрос: инициировать 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 &