Смежный вопрос: инициировать 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?
источник
&
в конце вашей команды SSH:ssh -o ServerAliveInterval=240 -R 2225:localhost:22 user@host &
while
цикл будет запускаться снова и снова, начиная новое фоновоеssh
соединение каждые 5 секунд, верно? Это не то, что мне нужно.Ответы:
Похоже, вы хотите
-N
опцию ssh.источник
Я настоятельно рекомендую вам рассмотреть
autossh
. Он имеет определенную эвристику, которая позволит ему определить, является ли потеря соединения основной причиной, и снизит частоту попыток переподключения. Кроме того, он контролирует соединение, используя дополнительные туннели, что делает его очень полезным для сценариев, подобных тому, о котором вы спрашиваете.Например, если вы работаете в Ubuntu, вы можете выполнить поиск в Интернете,
autossh upstart
чтобы найти несколько полезных примеров того, как настроить Ubuntu так, чтобы туннель постоянно поддерживал работу.Я использую это для того, чтобы туннельное соединение всегда было открыто для моего сервера для определенных служб.
источник
autossh
, я прочитал эту статью: goo.gl/jVuuSR , но он работал только для меня, если у меня есть подключение к Интернету сразу при загрузке системы; но если соединение установлено позже, оно не работает. Не уверен, может быть, я сделал что-то не так, но даже в этой статье автор имеетsleep 10
в своем/etc/rc.local
, чтобы быть уверенным, что интернет-соединение уже готово, когда вызывается autossh.upstart
других замен init вы можете связать запуск туннеля с одним или несколькими подключенными сетевыми устройствами. Лучшее из решений (IMO) в Интернете - вот это: erik.torgesta.com/tag/ssh-upstart ... и нетsleep 10
, в любом случае это не поможет.ssh-upstart
, я посмотрю на это!Я поддержу предложение @ 0xC0000022L и буду его использовать
autossh
. Я использую его для поддержания SSH-соединения с моего ноутбука, так как я беру его с места на место, и он просто работает. Я использую это соединение для туннелирования задних портов 25 и 2143 для доступа к моим личным серверам SMTP и IMAP.Вот скрипт, который я использую:
Затем я сохраняю
Host
запись в моем$HOME/.ssh/config
файле для хостаimap-o
.autossh_mail.sh
Скрипт запускается как часть моего рабочего стола , когда я войти в систему . Вы можете получить доступ к нему черезgnome-session-properties
.источник