我正在尝试建立一个隧道,然后再连接到Oracle DB,但是无法打开隧道。错误如下:
错误|设置SSH转发器时出现问题:无法打开隧道localhost:1521 <> XXXXXXXXX:1521可能正在使用中或无法访问目标。
sshtunnel.HandlerSSHTunnelForwarderError:打开隧道时发生错误。
我的代码设置为:
self.tunnel = sshtunnel.SSHTunnelForwarder((conn_data['gateway'], int(conn_data['gateway_port'])),
ssh_username=conn_data['username'],
ssh_password=password,
remote_bind_address=(conn_data['remote_bind'],
int(conn_data['remote_port'])),
local_bind_address=(conn_data['local_bind'],
int(conn_data['local_port'])))
如果我在工作所在公司的网络内,则代码可以正常工作。但是,如果我通过VPN连接,则会收到上述错误。我的猜测是VPN建立在同一条隧道上。
我尝试更改local_port并删除本地绑定,但是如果这样做,则会出现错误:
cx_Oracle.DatabaseError:ORA-12541:TNS:没有监听器
因此,如何动态设置SSHTunnelForwarder的端口,以便它可以通过已经设置的VPN访问我的数据库?
注意:更改VPN的配置或不使用它不是一种选择。
问题已解决。问题是我的VPN使用与我相同的端口(这导致了第一个错误),并且我的Oracle连接也指向了该端口(导致错误的ORA-12541)。
要解决它,我必须将conn_data ['local_port']更改为另一个端口,并将我的oracle连接的端口设置为此相同的端口:
self.tunnel = sshtunnel.SSHTunnelForwarder((conn_data['gateway'],
int(conn_data['gateway_port'])),
ssh_username=conn_data['username'],
ssh_password=password,
remote_bind_address=(conn_data['remote_bind'], int(conn_data['remote_port'])),
local_bind_address=(conn_data['local_bind'], 1234))
self.connection.connect(conn_data['host'],
port=1234,
username=conn_data['username'],
password=password,
look_for_keys=False)