В Cygwin я хочу, чтобы сценарий Bash:
- Создайте SSH-туннель к удаленному серверу.
- Выполните некоторую работу локально, используя туннель.
- Затем закройте туннель.
Часть выключения озадачила меня.
В настоящее время у меня есть хромое решение. В одной оболочке я запускаю следующее, чтобы создать туннель:
# 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 'control socket'. Чтобы поговорить с уже запущенным процессом SSH и получить его pid, уничтожьте его и т. Д. Используйте «управляющий сокет» (-M для главного и -S для сокета) следующим образом:
Обратите внимание, что my-ctrl-socket будет фактическим созданным файлом.
Я получил эту информацию из очень RTFM-ответа в списке рассылки OpenSSH .
источник
Operation not permitted
в среду непрерывной интеграции drone.io:muxserver_listen: link mux listener ssh-ctrl-socket.wsASkszgSBlK7kqD => ssh-ctrl-socket: Operation not permitted
my-ctrl-socket
файлом после его запуска? Когда я это делаюls -la
в текущей папке, я больше не вижу файл.while [ ! -e $ctrl_socket ]; do sleep 0.1; done
open failed: administratively prohibited: open failed
и не думаю, что это открывает туннельВы можете указать SSH, чтобы он работал в фоновом режиме с помощью параметра -f, но вы не получите PID с помощью $ !. Кроме того, вместо того, чтобы ваш скрипт спал произвольное количество времени перед использованием туннеля, вы можете использовать -o ExitOnForwardFailure = yes с -f, и SSH будет ждать, пока все удаленные переадресации портов будут успешно установлены, прежде чем перейти в фоновый режим. Вы можете grep выводить ps, чтобы получить PID. Например, вы можете использовать
и будьте уверены, что получаете желаемый PID
источник
ssh
переходить в фоновый&
режим и не создавать оболочку на другой стороне (просто откройте туннель) с помощью флага командной строки (я вижу, вы уже сделали это с-N
).PID=$!
kill $PID
РЕДАКТИРОВАТЬ: Исправлено $? в $! и добавил &
источник
trap 'kill $PID' 1 2 15
расскажет о многих случаях сбоя скрипта.trap "kill $PID"
, потому что bash будет интерполировать переменные только внутри строк сPID
переменная будет переопределена позже. Переменная либо расширяется приtrap
вызове встроенной функции (подход OP), либо при обнаружении сигнала (ваш подход); здесь оба подхода дают одинаковый результат.Я предпочитаю запускать новую оболочку для отдельных задач и часто использую следующую комбинацию команд:
или иногда:
Эти команды создают вложенную оболочку, в которой я могу выполнять всю свою работу; когда я закончу, я нажимаю CTRL-D, и родительская оболочка также очищается и закрывается. Вы можете легко добавить
bash;
в свой сценарий туннеля ssh непосредственно передkill
частью, чтобы при выходе из вложенной оболочки туннель был закрыт:источник
Вы можете запустить его
ssh
с помощью&
конца, чтобы поместить его в фоновый режим и получить его идентификатор при выполнении. Затем вам просто нужно выполнитьkill
этот идентификатор, когда вы закончите.источник
Другой потенциальный вариант - если вы можете установить пакет expect, вы сможете написать все это в сценарии. Вот несколько хороших примеров: http://en.wikipedia.org/wiki/Expect
источник