Перевести Oracle SQL Developer SSH Host с прямым соединением локального порта на Python - PullRequest
0 голосов
/ 23 мая 2019

Я пытаюсь создать соединение 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

1 Ответ

0 голосов
/ 24 мая 2019

Решение

Наконец-то нашли решение!Аналогичен автоматическому назначению локального порта в OSD и не требует SSHTunnelForwarder с оператором.Надеюсь, что это может помочь кому-то еще - используйте входные переменные OSD вопроса с ...

from sshtunnel import SSHTunnelForwarder
import cx_Oracle 

server=SSHTunnelForwarder(
    (proxy_hostname,proxy_port),
    ssh_username=proxy_username,
    ssh_password=proxy_password,
    remote_bind_address=(remote_hostname,remote_port))

server.start()
db=cx_Oracle.connect('%s/%s@%s:%s/%s'%(remote_username,remote_password,'localhost',server.local_bind_port,remote_server_sid))
# do something with db
server.close()
...