如何使用mysql-connector-python指定端口号(错误2003)
How to specify port number using mysql-connector-python (error 2003)
我正在尝试通过 SSH 从我的本地 Windows 机器连接到 MySQL 服务器。 SSH 连接工作正常,但是当 运行 以下 Python 脚本时,我无法连接到 MySQL 服务器:
import mysql.connector
import sys
import time
import paramiko
host = 'remote-ssh-host'
i = 1
while True:
print("Trying to connect to %s (%i/30)" % (host, i))
try:
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect(host, port=22, username='sshuser', password='sshpwd')
print("Connected to %s" % host)
break
except paramiko.AuthenticationException:
print("Authentication failed when connecting to %s" % host)
sys.exit(1)
except:
print("Could not SSH to %s, waiting for it to start" % host)
i += 1
time.sleep(2)
# If we could not connect within time limit
if i == 30:
print("Could not connect to %s. Giving up" % host)
sys.exit(1)
cnx = mysql.connector.connect(user="mysqluser", password="mysqlpwd",
host="mysqlhost",
port=3307)
这是输出:
Trying to connect to remote-ssh-host (1/30)
Connected to remote-ssh-host
Traceback (most recent call last):
File "C:\Python34\lib\site-packages\mysql\connector\network.py", line 469, in open_connection
self.sock.connect(sockaddr)
TimeoutError: [WinError 10060]
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "C:\path\to\script\ssh_mysql_test.py", line 50, in <module>
port="3307"
...
File "C:\Python34\lib\site-packages\mysql\connector\network.py", line 472, in open_connection
errno=2003, values=(self.get_address(), _strioerror(err)))
mysql.connector.errors.InterfaceError: 2003: Can't connect to MySQL server on 'mysqlhost:3307' (10060)
有人问过类似的问题 and here,但我认为这个问题与mysql-connector-python处理端口号连接字符串的方式有关,因为使用 Putty 终端时,我可以让它工作:
login as: sshuser
sshuser@remote-ssh-host's password:
sshuser@remote-ssh-host:~$ mysql -h mysqlhost -P 3307 -u mysqluser -p
Enter password:
...
mysql>
但是,当以与例如相同的方式指定端口号时mysql-连接器-python 做:
login as: sshuser
sshuser@remote-ssh-host's password:
sshuser@remote-ssh-host:~$ mysql -h mysqlhost:3307 -u mysqluser -p
Enter password:
ERROR 2005 (HY000): Unknown MySQL server host 'mysqlhost:3307' (0)
我知道错误编号不同(2003 年与 2005 年),但我认为它们是相关的。所以问题实际上是:如何格式化端口号,使连接执行为 -h hostname -P port
而不是 -h hostname:port
?
问题是您的 ssh 和 MySQL 连接完全分开了。为了让您的 MySQL 连接通过 ssh 工作,您需要通过 ssh 隧道 MySQL 连接。
实际上提供了这个问题的答案:使用 ssh 隧道组件创建隧道,MySQL 连接直接通过隧道。
server = SSHTunnelForwarder(
('host', 22),
ssh_password="password",
ssh_username="username",
remote_bind_address=('127.0.0.1', 3306))
以上代码将ssh连接绑定到localhost的3306端口。因此,与 127.0.0.1:3306 建立的任何连接都将通过 ssh 连接隧道连接到远程服务器。
engine = create_engine('mysql+mysqldb://user:pass@127.0.0.1:%s/db' % server.local_bind_port)
在上面的代码中,MySQL 连接到 127.0.0.1:3306,因此它将通过 ssh 连接进行隧道传输。您需要遵循相同的模式:创建一个绑定到本地端口的 ssh 隧道,并在您的 MySQL 连接字符串中指定此本地端口而不是远程端口。
我正在尝试通过 SSH 从我的本地 Windows 机器连接到 MySQL 服务器。 SSH 连接工作正常,但是当 运行 以下 Python 脚本时,我无法连接到 MySQL 服务器:
import mysql.connector
import sys
import time
import paramiko
host = 'remote-ssh-host'
i = 1
while True:
print("Trying to connect to %s (%i/30)" % (host, i))
try:
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect(host, port=22, username='sshuser', password='sshpwd')
print("Connected to %s" % host)
break
except paramiko.AuthenticationException:
print("Authentication failed when connecting to %s" % host)
sys.exit(1)
except:
print("Could not SSH to %s, waiting for it to start" % host)
i += 1
time.sleep(2)
# If we could not connect within time limit
if i == 30:
print("Could not connect to %s. Giving up" % host)
sys.exit(1)
cnx = mysql.connector.connect(user="mysqluser", password="mysqlpwd",
host="mysqlhost",
port=3307)
这是输出:
Trying to connect to remote-ssh-host (1/30)
Connected to remote-ssh-host
Traceback (most recent call last):
File "C:\Python34\lib\site-packages\mysql\connector\network.py", line 469, in open_connection
self.sock.connect(sockaddr)
TimeoutError: [WinError 10060]
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "C:\path\to\script\ssh_mysql_test.py", line 50, in <module>
port="3307"
...
File "C:\Python34\lib\site-packages\mysql\connector\network.py", line 472, in open_connection
errno=2003, values=(self.get_address(), _strioerror(err)))
mysql.connector.errors.InterfaceError: 2003: Can't connect to MySQL server on 'mysqlhost:3307' (10060)
有人问过类似的问题
login as: sshuser
sshuser@remote-ssh-host's password:
sshuser@remote-ssh-host:~$ mysql -h mysqlhost -P 3307 -u mysqluser -p
Enter password:
...
mysql>
但是,当以与例如相同的方式指定端口号时mysql-连接器-python 做:
login as: sshuser
sshuser@remote-ssh-host's password:
sshuser@remote-ssh-host:~$ mysql -h mysqlhost:3307 -u mysqluser -p
Enter password:
ERROR 2005 (HY000): Unknown MySQL server host 'mysqlhost:3307' (0)
我知道错误编号不同(2003 年与 2005 年),但我认为它们是相关的。所以问题实际上是:如何格式化端口号,使连接执行为 -h hostname -P port
而不是 -h hostname:port
?
问题是您的 ssh 和 MySQL 连接完全分开了。为了让您的 MySQL 连接通过 ssh 工作,您需要通过 ssh 隧道 MySQL 连接。
server = SSHTunnelForwarder(
('host', 22),
ssh_password="password",
ssh_username="username",
remote_bind_address=('127.0.0.1', 3306))
以上代码将ssh连接绑定到localhost的3306端口。因此,与 127.0.0.1:3306 建立的任何连接都将通过 ssh 连接隧道连接到远程服务器。
engine = create_engine('mysql+mysqldb://user:pass@127.0.0.1:%s/db' % server.local_bind_port)
在上面的代码中,MySQL 连接到 127.0.0.1:3306,因此它将通过 ssh 连接进行隧道传输。您需要遵循相同的模式:创建一个绑定到本地端口的 ssh 隧道,并在您的 MySQL 连接字符串中指定此本地端口而不是远程端口。