На Cygwin я хочу сценарий Bash к:
Часть завершения работы имеет меня озадаченный.
В настоящее время у меня есть хромое решение. В одной оболочке я выполняю следующее для создания туннеля:
# 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
Как я отслеживаю туннельный процесс, таким образом, я знаю который уничтожить?
Вы можете запустить ssh
с концом и
, чтобы поместить его в фоновый режим и получить его идентификатор при выполнении. Затем вам просто нужно выполнить kill
этого идентификатора, когда вы закончите.
ssh
переходить в фоновый режим с помощью и
и не создавать оболочку на другой стороне ( просто откройте туннель) с помощью флага командной строки (я вижу, вы уже сделали это с помощью -N
). PID = $!
убивают $ PID
РЕДАКТИРОВАТЬ: Исправлено $? в $! и добавил &
Я предпочитаю запускать новую оболочку для отдельных задач и часто использую следующую комбинацию команд:
$ 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
Еще один потенциальный вариант - если вы можете установить пакет expect, вы должны быть в состоянии написать сценарий для всего этого. Несколько хороших примеров здесь: http://en.wikipedia.org/wiki/Expect