如何使用Python 3.5通过SSH隧道连接到MySQL数据库?

3
我正在使用带有Pycharm的Python 3.4的Windows 7,并尝试通过SSH使用私钥访问远程MySQL数据库。
我使用SSHTunnel(ghithub_link)来设置SSH隧道,如下所示:
    from sshtunnel import SSHTunnelForwarder

server = SSHTunnelForwarder(
    ("blablabla.ddns.net", 3307),
    ssh_host_key=None,
    ssh_username="name",
    ssh_password=None,
    ssh_private_key="E:\id_rsa",
    ssh_private_key_password="pssrd",
    remote_bind_address=('192.168.0.24', 3306))

我使用Oracle的MySQL-connector-Python(源代码)连接到MySQL数据库,如下所示:
    cnx=mysql.connector.connect(user='user_worker', password='passwrd',host="blablabla.ddns.net", port=3307, database='base_101')
    cnx.close()

我收到以下错误信息:
       Traceback (most recent call last):

      File "C:/Users/PycharmProjects/untitled _Get.py", line 37, in <module> cnx=mysql.connector.connect(user='user_worker', password=’pass',host="blablabla.ddns.net", port=22, database=’base_101')

      File "C:\Users \Python34\site-packages\mysql\connector\__init__.py", line 179, in connectreturn MySQLConnection(*args, **kwargs)

      File "C:\Users \Python34\site-packages\mysql\connector\connection.py", line 95, in __init__self.connect(**kwargs)

      File "C:\Users \Python34\site-packages\mysql\connector\abstracts.py", line 719, in connectself._open_connection()

      File "C:\Users\YOANN\AppData\Roaming\Python\Python34\site-packages\mysq\connector\connection.py", line 206, in _open_connectionnself._socket.open_connection()

      File "C:\Users\YOANN\AppData\Roaming\Python\Python34\site-packages\mysq\connector\network.py", line 475, in open_connection errno=2003, values=(self.get_address(), _strioerror(err)))


   mysql.connector.errors.InterfaceError: 2003: Can't connect to MySQL server on '127.0.0.1:3306' (10061 Aucune connexion n’a pu être établie car l’ordinateur cible l’a expressément refusée)

我猜问题出在端口上,但我无法解决。另一方面,我可以使用Pycharm数据库工具通过SSH和SSH密钥连接到数据库,所以服务器端和密钥/SSH连接没有问题。

这是使用Oracle-Worbench成功运行的方式。这就是我在Python中尝试做的事情:workbench-example-image.img - ylnor
2个回答

3
您把主机地址和端口混淆了。根据您的示例,它应该是这个样子:
server = SSHTunnelForwarder(
    ("blablabla.ddns.net", 22),
    ssh_host_key=None,
    ssh_username="name",
    ssh_password=None,
    ssh_private_key="E:\id_rsa",
    ssh_private_key_password="pssrd",
    remote_bind_address=("127.0.0.1", 3306))

server.start()

cnx=mysql.connector.connect(user='user_worker',
    password='passwrd',
    host="127.0.0.1", 
    port=server.local_bind_port, 
    database='base_101')

# Do some DB stuff...

cnx.close()
server.stop()

这个配置假设你直接隧道连接到MySQL服务器。如果不是(例如在通过DMZ或NAT进行代理时),则remote_bind_address将需要是MySQL服务器地址,而不是环回地址。


-2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接