Назад | Перейти на главную страницу

Как запустить SSH-туннель с выскочкой

Я не очень привык к системному администратору и недавно создал туннель SSH между двумя серверами (в Ubuntu 12.4) с помощью следующей команды:

ssh -fNg -L 3307:127.0.0.1:3306 tunneluser@xx.xx.xx.xx

Это сработало, я также добавил эту команду в /etc/rc.local, и она успешно запускает туннель SSH при запуске. Однако я попытался добавить свой туннель в файл в /etc/init/my_tunnel.conf, и это сработало, но запускало почти 12 туннелей при каждом запуске! Я использовал следующий код:

start on (local-filesystems and net-device-up IFACE=eth0)
stop on runlevel[016]
respawn
exec ssh -fNg -L 3307:127.0.0.1:3306 tunneluser@xx.xx.xx.xx
exit 0

Я потратил на это часы и совершенно не понимаю, почему и как этот скрипт выполняется столько раз. Я тоже пробовал start on[2345], полностью прочитайте руководство выскочки, но все то же самое. Я уверен, что мне здесь чего-то не хватает.

Если кто-то может мне помочь. Спасибо.

Как прокомментировал c4f4t0r, respawn снова запустит команду при выходе из скрипта. Используя -f, он работает в фоновом режиме, эффективно завершая работу и заставляя выскочку возродить его. Если вы удалите -f, он останется в рабочем состоянии, которое выскочка может заметить при неожиданном выходе.

start on (local-filesystems and net-device-up IFACE=eth0)
stop on runlevel[016]
respawn
exec ssh -Ng -L 3307:127.0.0.1:3306 tunneluser@xx.xx.xx.xx
exit 0

Я сделал то же самое, это отличный способ настроить удаленный доступ к машине Linux: даже если локальная конфигурация или IP-адрес соединения изменяются, вы все равно сохраняете удаленный доступ.

Первым делом я написал скрипт для настройки туннеля ТОЛЬКО если его нет: (здесь я удалил все комментарии)

$ cat /root/scripts/tunnels.sh
if [ "$1" == "WAIT" ]; then sleep 20; fi
TUNNELOK=`ps aux | grep ssh | grep 3307 | sed 's/.*3307.*/TUNNELALLOK/' | sort -u`
if [ "$TUNNELOK" != "TUNNELALLOK" ]; then
  ssh -R 8877:localhost:22 -Ng tunnel_eaw@cirrus.hsolutions.ch &
fi

Затем я добавил его в crontab вместо initab / upstart:

# crontab -l |grep tunnel
@reboot /root/scripts/tunnel.sh WAIT
*/5 * * * * /root/scripts/tunnel.sh

И вот оно ...! Раньше я использовал initab / upstart, но решение, приведенное выше, наконец, работает отлично. В худшем случае вам придется подождать 5 минут, чтобы соединение снова появилось, но вы можете изменить это в crontab. Конечно, вам нужно будет убедиться, что "ps aux" подходит для вашей системы.