2012-07-18 4 views
3

Для этого используется SSH для установки временной переадресации портов, запуска локальной команды и завершения после этого, закрытия ssh-соединения.Как использовать ssh для запуска локальной команды после подключения и выйти после выполнения этой локальной команды?

Повторяю, команда должна выполняться локально, а не на удаляемом сайте.

Например, у вас есть сервер в DMZ, и вы должны разрешить приложению с вашего устройства подключаться к порту 8080 этого аппарата, но у вас есть только SSH-доступ к этой машине.

ответ

1

Предполагая, что вы используете OpenSSH из командной строки ....

SSH может открыть соединение, которое будет поддерживать туннель и остаются активными в течение как можно дольше:

ssh -fNT -Llocalport:remotehost:remoteport targetserver 

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

ssh -f -Llocalport:remotehost:remoteport targetserver sleep 10 

Если вы хотите, чтобы иметь возможность убить туннель из скрипта на локальной стороне, то я рекомендую вам фон это в вашей оболочке, а затем записать ИДП убить позже. Предполагая, что вы используете операционную систему, которая включает в себя Bourne оболочки ....

#/bin/sh 

ssh -f -Llocalport:remotehost:remoteport targetserver sleep 300 & 
sshpid=$! 
# Do your stuff within 300 seconds 
kill $sshpid 

Если ваш SSH фонового режима с помощью оболочки не по своему вкусу, вы можете также использовать расширенные возможности SSH для управления процессом фонового. Как described here, функции SSH ControlMaster и ControlPath - это то, как вы делаете эту работу. Например, добавьте следующую строку в ваш ~/.ssh/config:

host targetserver 
    ControlMaster auto 
    ControlPath ~/.ssh/cm_sockets/%[email protected]%h:%p 

Теперь ваше первое подключение к targetserver будет создан элемент управления, так что вы можете сделать что-то вроде этого:

$ ssh -fNT -Llocalport:remoteserver:remoteport targetserver 
$ ssh -O check targetserver 
Master running (pid=23450) 
$ <do your stuff> 
$ ssh -O exit targetserver 
Exit request sent. 
$ ssh -O check targetserver 
Control socket connect(/home/sorin/.ssh/cm_socket/[email protected]:22): No such file or directory 

Очевидно, что эти команды могут быть завернуты в ваш сценарий оболочки.

2

Вы можете использовать скрипт, похожий на этот (непроверенные):

#!/bin/bash 
coproc ssh -L 8080:localhost:8080 [email protected] 
./run-local-command 
echo exit >&${COPROC[1]} 
wait 
+0

Что такое 'coproc'? Он не включен ни на один из моих серверов FreeBSD или OSX, и, похоже, он работает по-разному в Solaris. Для получения ответа на ваш запрос требуется дополнительная информация, если вы используете специальные команды поставщика. – ghoti

+0

'coproc' - это bash builtin. Не знаю, в какую версию bash он впервые появился, извините. – dave4420

+0

А, я вижу. Спасибо, я не знал об этом башизме. – ghoti

Смежные вопросы