Питання, пов'язані з цим: ініціювати 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
, тобто якусь команду "neverending", тому я просто створив порожній файл, /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 &