Как управлять туннелями как фоновыми процессами из сценария оболочки?

19

Мне нужно настроить пару ssh-туннелей из сценария оболочки. Я попытался запустить их как задачи BG, используя:

#!/bin/sh
ssh -L 3000:server1:5029 me@server2 &
ssh -L 3001:server3:3306 me@server2 &

но туннели, кажется, не работают правильно, когда я запускаю их таким образом.

Они работают нормально, когда я вручную настраиваю их на их собственных вкладках, поэтому моя следующая идея состоит в том, чтобы скрипт открывал новые вкладки в терминале и запускал там команды в качестве процессов переднего плана.

Примечание: этот вопрос изначально был «Как запустить новую вкладку терминала из оболочки, а затем запустить в ней команду?», Но я получил два ответа о работе с туннелями. Что касается вопроса «открытия оболочки», я нашел его в SuperUser , который будет работать, хотя новые вкладки на заднем плане предпочтительнее открываемых окон переднего плана.

sprugman
источник
Поддерживаете ли вы активный SSH-сеанс с сервером? То есть у вас есть ваши туннели в фоновом режиме и сеанс SSH на переднем плане, в котором вы фактически работаете?
Джек М.
До сих пор я оставлял открытыми три вкладки: по одной для каждого туннеля, и еще одну для чего угодно. Большая часть моей реальной работы происходит в Eclipse и браузере.
Сперма
(Туннели предназначены только для того, чтобы я мог получить доступ к некоторым удаленным БД из моего локального экземпляра Tomcat.)
sprugman

Ответы:

26

Технически это не ответ на заданный вопрос, а скорее ответ на вашу проблему, как описано. Команда ssh имеет два параметра, которые могут быть вам полезны:

ssh -f -N -L 3000:server1:5029 me@server2

приказывает ssh достаточно долго находиться на переднем плане, чтобы запрашивать необходимые пароли, а затем переключаться в фоновый режим, не выполняя удаленную команду, а просто обрабатывая туннель.

Если вы действительно хотите, чтобы это отображалось на вкладке, то вам может потребоваться другое решение.

ZZZ
источник
Я настроил ключи, поэтому мне не нужно вводить пароли, но, похоже, это работает. Благодарность! Один вопрос: как я могу получить доступ к туннелям, чтобы узнать, истек ли срок их ожидания, или завершить их и т. Д.? Ни один, jobsни psсписок ручек для них ....
Sprugman
2
ps -wwajx | grep ssh должен показать вам процессы, затем вы можете убить их, как считаете нужным.
zzz
2
Я хотел бы добавить, что если вы опустите -fи фоновый процесс через &в конце, вы можете получить PID $!как дескриптор, чтобы позже убить туннельный процесс в вашем скрипте.
bk138
6

Я бы предложил просто интегрировать ваши туннели в ваше соединение «один для чего угодно». Вы можете сделать это легко, добавив соответствующие записи в ваш ~/.ssh/configфайл:

Host server2
    HostName 10.1.1.1
    User me
    LocalForward 3000 127.0.0.1:5029
    LocalForward 3001 127.0.0.1:3306

Затем вы можете просто войти в систему, выполнив:

> ssh server2

Туннели должны подойти и начать работать, оставляя вам один экземпляр SSH, в котором можно делать «что угодно». Если вам нужно открыть второе соединение с server2, вы можете получить сообщение об ошибке:

> ssh server2
bind: Address already in use
channel_setup_fwd_listener: cannot listen to port: 3000
bind: Address already in use
channel_setup_fwd_listener: cannot listen to port: 3001
Could not request local forwarding.

Это не повредит ничему, кроме ваших глаз. Вы также можете настроить эти пересылки для нескольких серверов, добавив аналогичные строки для других серверов, и все это произойдет автоматически.

Джек М.
источник
Ответ @ zzz, кажется, делает то же самое, более или менее, и немного более прямолинеен. Спасибо хоть.
Спрэман
Это в сочетании с опциями -f -N является отличным способом настройки переадресации для нескольких портов за один прием. Спасибо чувак.
Нарск