我正在使用带有Python 3.4的Windows 7(使用Pycharm)并尝试通过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(source)连接到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-key连接到基础,因此服务器端和key / ssh连接都没有问题。)
答案 0 :(得分:0)
您的主机地址和端口混乱了。根据您的示例,这就是它需要的样子:
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地址。
答案 1 :(得分:-1)
在python代码中使用pymysql库解决了该问题。
我希望对您有帮助