通过SSH(paramiko+mysql.connector)连接远程MySQL失败求助
解决SSH连接成功但无法通过隧道连接远程MySQL的问题
报错信息
mysql.connector.errors.DatabaseError: 2003 (HY000): Can't connect to MySQL server on 'xxx.hoct.com:3306' (10060)
问题说明
已成功通过SSH连接目标服务器,但无法连接远程MySQL;由于需要禁用['rsa-sha2-512', 'rsa-sha2-256']公钥算法才能建立SSH连接,选择使用paramiko库而非sshtunnel,现需修正代码以实现通过SSH隧道连接MySQL。
修正后的代码
import mysql.connector # pip install mysql-connector-python from paramiko import RSAKey, SSHClient, AutoAddPolicy ssh_passprase = 'passprase' ssh_key_path = 'C:\\Users\\dell\\.ssh\\deploy_pk2' private_key = RSAKey.from_private_key_file(ssh_key_path, password=ssh_passprase) ssh_host = 'xxx.hoct.com' ssh_username = 'user' ssh_port = 22 # 远程MySQL在SSH服务器上的地址和端口 remote_sql_host = 'localhost' remote_sql_port = 3306 # 本地用于转发的端口(选一个未被占用的端口,比如3307) local_forward_port = 3307 sql_username = 'user' sql_password = 'password' sql_main_database = 'db' # 初始化SSH客户端 ssh_client = SSHClient() ssh_client.load_system_host_keys() ssh_client.set_missing_host_key_policy(AutoAddPolicy()) # 连接SSH服务器,禁用指定公钥算法 ssh_client.connect( hostname=ssh_host, port=ssh_port, username=ssh_username, pkey=private_key, disabled_algorithms={'pubkeys': ['rsa-sha2-512', 'rsa-sha2-256']} ) # 建立本地端口转发:将本地3307端口的请求转发到远程服务器的localhost:3306 transport = ssh_client.get_transport() transport.request_port_forward('', local_forward_port, remote_sql_host, remote_sql_port) # 连接MySQL,目标为本地转发端口 print(mysql.connector.__version__) cnx = mysql.connector.connect( user=sql_username, password=sql_password, host='localhost', port=local_forward_port, database=sql_main_database ) # 执行查询 cursor = cnx.cursor() query = "SELECT * FROM price_source" cursor.execute(query) for row in cursor: print(row) # 关闭资源 cursor.close() cnx.close() ssh_client.close()
核心修改说明
- 改用
SSHClient封装类,简化SSH连接和端口转发的实现,同时支持直接传入disabled_algorithms参数 - 创建本地端口转发规则:将本地未被占用的端口(如3307)映射到远程服务器上的MySQL地址(
localhost:3306) - MySQL连接目标改为本地转发端口,而非直接连接远程主机,确保流量通过SSH隧道传输
- 完善资源关闭流程,避免连接泄漏
内容的提问来源于stack exchange,提问作者Konst Abash
相关产品推荐
相关产品推荐

