Программное отключение SSH-туннеля в Paramiko

Мы пытаемся использовать модуль paramiko для создания туннелей SSH по требованию к произвольным серверам для выполнения запросов к удаленным базам данных. Мы попытались использовать демонстрацию forward.py, которая поставляется с paramiko, но большим ограничением является то, что не существует простого способа закрыть туннель SSH и соединение SSH после запуска сервера сокетов.

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

Я видел ссылки на метод server.shutdown(), но не ясно, как правильно его реализовать.


person PlaidFan    schedule 06.05.2010    source источник
comment
Вы также можете попробовать sshtunnel, у него есть два случая закрыть туннель .stop(), если вы хотите подождать до конца всех активных подключений или .stop(force=True), чтобы закрыть все активные подключения.   -  person pahaz    schedule 02.11.2020


Ответы (1)


Я не уверен, что вы имеете в виду под "реализовать это правильно" - вам просто нужно отслеживать объект сервера и вызывать для него shutdown, когда вы хотите. В forward.py сервер не отслеживается, потому что последняя строка forward_tunnel

ForwardServer(('', local_port), SubHander).serve_forever()

поэтому объект сервера больше недоступен. Но вы можете просто изменить это, например:

global theserver
theserver = ForwardServer(('', local_port), SubHander)
theserver.serve_forever()

и запустите функцию forward_tunnel в отдельном потоке, чтобы функция main снова получила управление (в то время как serve_forever выполняется в указанном отдельном потоке) и могла вызывать theserver.shutdown() всякий раз, когда это уместно и необходимо.

person Alex Martelli    schedule 06.05.2010
comment
Красивый! Модуль потока вместе с предоставлением доступа к ForwardServer сделали свое дело. - person PlaidFan; 06.05.2010
comment
поэтому в методе, где вы создаете поток, на котором работает ForwardServer, вы затем используете thread.theserver.shutdown() ?? - person rexbelia; 25.05.2017