Сценарий Bash для установки временного туннеля SSH

На Cygwin я хочу сценарий Bash к:

  1. Создайте туннель SSH к удаленному серверу.
  2. Сделайте некоторую работу локально, которая использует туннель.
  3. Затем закройте туннель.

Часть завершения работы имеет меня озадаченный.

В настоящее время у меня есть хромое решение. В одной оболочке я выполняю следующее для создания туннеля:

# Create the tunnel - this works! It runs forever, until the shell is quit.
ssh -nNT -L 50000:localhost:3306 jm@sampledomain.com

Затем в другом окне оболочки я делаю свою работу:

# Do some MySQL stuff over local port 50000 (which goes to remote port 3306)

Наконец, когда я сделан, я закрываю первое окно оболочки для уничтожения туннеля.

Я хотел бы сделать это все в одном сценарии как:

# Create tunnel
# Do work
# Kill tunnel

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

124
задан Boann 21 July 2019 в 22:27
поделиться

4 ответа

Вы можете запустить ssh с концом и , чтобы поместить его в фоновый режим и получить его идентификатор при выполнении. Затем вам просто нужно выполнить kill этого идентификатора, когда вы закончите.

2
ответ дан 24 November 2019 в 01:03
поделиться
  • Вы можете указать ssh переходить в фоновый режим с помощью и и не создавать оболочку на другой стороне ( просто откройте туннель) с помощью флага командной строки (я вижу, вы уже сделали это с помощью -N ).
  • Сохраните PID с помощью PID = $!
  • Ваши вещи
  • убивают $ PID

РЕДАКТИРОВАТЬ: Исправлено $? в $! и добавил &

18
ответ дан 24 November 2019 в 01:03
поделиться

Я предпочитаю запускать новую оболочку для отдельных задач и часто использую следующую комбинацию команд:

  $ sudo bash; exit

или иногда:

  $ : > sensitive-temporary-data.txt; bash; rm -f sensitive-temporary-data.txt; exit

Эти команды создают вложенную оболочку, в которой я могу выполнять всю свою работу; когда я закончу, я нажимаю CTRL-D, и родительская оболочка также очищается и закрывается. Вы можете легко добавить bash; в свой сценарий туннеля ssh непосредственно перед частью kill , чтобы при выходе из вложенной оболочки ваш туннель был закрыт:

#!/bin/bash
ssh -nNT ... &
PID=$!
bash
kill $PID
4
ответ дан 24 November 2019 в 01:03
поделиться

Еще один потенциальный вариант - если вы можете установить пакет expect, вы должны быть в состоянии написать сценарий для всего этого. Несколько хороших примеров здесь: http://en.wikipedia.org/wiki/Expect

2
ответ дан 24 November 2019 в 01:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: