Як керувати тунелями як фоновими процесами зі сценарію оболонки?


19

Мені потрібно встановити пару ssh-тунелів із сценарію оболонки. Я намагався виконувати їх як bg завдання, використовуючи:

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

але, здається, тунелі не працюють правильно, коли я запускаю їх таким чином.

Вони добре працюють, коли я вручну їх налаштовую на власні вкладки, тому наступна моя ідея - скрипт відкрити нові вкладки в Terminal і запустити команди там як передній план.

Примітка. Спочатку це питання було "Як запустити нову вкладку терміналу з оболонки і потім запустити в ній команду?", Але я отримав два відповіді щодо роботи з тунелями. Що стосується питання "відкриття оболонки", я знайшов це на SuperUser , який буде працювати, хоча нові вкладки на задньому плані будуть переважнішими перед вікнами переднього плану, які вони відкриваються.


Чи зберігаєте ви активний сеанс SSH на сервері? Це означає, чи є у вас тюнелі на задньому плані та сеанс SSH переднього плану, на якому ви насправді працюєте?
Джек М.

До цих пір я тримав три відкриті вкладки: по одній для кожного тунелю, плюс ще одна для будь-якого. Більшість моєї фактичної роботи відбувається в Eclipse та у браузері.
скругман

(Тунелі є лише для того, щоб я міг отримати доступ до деяких віддалених даних з мого локального екземпляра Tomcat.)
sprugman

Відповіді:


26

Це технічно не відповідь на поставлене запитання, а скоріше відповідь на вашу проблему, як описано. Команда ssh має два перемикачі, які можуть вам стати в нагоді:

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

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

Якщо ви дійсно хочете, щоб це відображалося на вкладці, тоді вам може знадобитися інше рішення.


Я налаштовував ключі, тому мені не потрібно вводити паролі, але це, здається, працює. Спасибі! Одне запитання: як я можу отримати доступ до тунелів, щоб побачити, чи закінчилися вони, чи закінчити їх і т.д.? Ні, 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 є прекрасним способом налаштування переадресації для декількох портів за один кадр. Спасибі людина.
нарск
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.