Я пытаюсь создать соединение Python с удаленным сервером через SSH Jump Host (тот, который я успешно создал в Oracle SQL Developer), но не могу реплицировать в Python.Может успешно подключиться к хосту SSH, но не может перенаправить порт на удаленный сервер из-за тайм-аута или ошибки открытия туннелей.Можно предположить, что мой код неправильный, а не проблемы с сервером.Также необходимо решение, которое не использует подход «с SSHTunnelForwarder () как сервер:», потому что мне нужен непрерывный сеанс, похожий на сеанс OSD / cx_Oracle, а не функция пакетной обработки.
Подобные примеры, представленные здесь (и в других местах) использование paramiko, sshtunnel и cx_Oracle для меня не сработало.Многие другие примеры не требуют (или, по крайней мере, четко указывают) отдельных учетных данных для входа на удаленный сервер.Я ожидаю, что критически важной неясной частью является то, какой локальный хост + порт использовать, который явно не требуется для моего подключения к SQL Developer (хотя я пытался использовать порты, выбранные OSD, не одновременно).
Самое близкое совпадение, я думаю, было лучшим ответом от paramiko-port-forwarding-вокруг-nat-router
Входы OSD
SSH Host - host = proxy_hostname- порт = proxy_port = 22- username = proxy_username- пароль = пароль_прокси
Переадресация локального порта - host = remote_hostname- порт = удаленный_порт = 1521- автоматически назначать локальный порт = True
Соединение - username = remote_username- пароль = пароль удаленного доступа- тип соединения = SSH- SID = remote_server_sid
Код Python
т. Е. Аналогичный код от paramiko-port-forwarding-around-a-nat-router
import paramiko
from paramiko import SSHClient
# Instantiate a client and connect to the proxy server
proxy_client = SSHClient()
proxy_client.connect(
proxy_hostname,
port=proxy_port,
username=proxy_username,
password=proxy_password)
# Get the client's transport and open a `direct-tcpip` channel passing
# the destination hostname:port and the local hostname:port
transport = proxy_client.get_transport()
dest_addr = (remote_hostname,remote_port)
local_addr = ('localhost',55587)
channel = transport.open_channel("direct-tcpip", dest_addr, local_addr)
# Create a NEW client and pass this channel to it as the `sock` (along
# with whatever credentials you need to auth into your REMOTE box
remote_client = SSHClient()
remote_client.connect(
'localhost',
port=55587,
username=remote_username,
password=remote_password,
sock=channel)
Вместо подключения к удаленному серверу, которое я получаю
transport.py in start_client()
SSHException: Error reading SSH protocol banner