如何在 python 中动态设置 ssh 隧道?

How to setup ssh tunnel dynamically in python?

我正在尝试建立隧道以连接到 Oracle 数据库,但无法打开隧道。错误如下:

错误 |设置 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:no 侦听器

那么,我如何动态设置 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)