如何通过Python使用SSH连接MySQL

4
我查看了StackOverflow上的这些答案,但它们对我不起作用:A1A2A3
我按照这些答案编写了我的代码,并得到了“(1045,“访问被拒绝'user'@'localhost'(使用密码:YES)'”)"。为什么会这样?
我的代码如下:
第一次尝试:
from sshtunnel import SSHTunnelForwarder

with SSHTunnelForwarder(
      ('****.ucd.ie', 22),
      ssh_password="***",
      ssh_username="s***",
      remote_bind_address=('127.0.0.1', 3306)) as server:

     con = pymysql.connect(user='root',passwd='***',db='dublinbus',host='127.0.0.1',port=3306)

第二次尝试:

from sshtunnel import SSHTunnelForwarder
import pymysql
import pandas as pd

tunnel = SSHTunnelForwarder(('****.ucd.ie', 22), ssh_password='***', ssh_username='s***t',
     remote_bind_address=('127.0.0.1', 3306)) 
tunnel.start()
conn = pymysql.connect(host='127.0.0.1', user='root', passwd='****', port=3306)
data = pd.read_sql_query("SHOW DATABASES;", conn)

第三次尝试:

from sshtunnel import SSHTunnelForwarder
import pymysql

with SSHTunnelForwarder(
    ('****.ucd.ie',22),  
    ssh_password='****',
    ssh_username='s****t',
    remote_bind_address=('127.0.0.1', 3306)) as server:  
 
    db_connect = pymysql.connect(host='127.0.0.1',  
                                 port=3306,
                                 user='root',
                                 passwd='****',
                                 db='dublinbus')
 
    cur = db_connect.cursor()
    cur.execute('SELECT stop_num FROM dublinbus.stops limit 10;')
    data=cur.fetchone()
    print(data[0])

所有这些都给了我:(1045,“用户'root'@'localhost'的访问被拒绝(使用密码:是)”)

那么我怎样才能通过SSH连接到我的远程Mysql?

此外,我在本地的mysql workbench中使用相同的“ssh主机名”、“mysql主机名”和“mysql服务器端口”。不知道是否会产生影响。

#我使用***替换了一些私人信息。

1个回答

2
这可能有效:

这可能有效:

from sshtunnel import SSHTunnelForwarder
import pymysql
import pandas as pd

server = SSHTunnelForwarder(
ssh_address=('****', 22),
ssh_username="****",
ssh_password="****",
remote_bind_address=("127.0.0.1", 3306))

server.start()

con = pymysql.connect(user='root',passwd='***',db='****',host='127.0.0.1',port=server.local_bind_port)

1
这对我也起作用了。不过,为了澄清一下,我必须将我的远程MySQL服务器名称放在remote_bind_address参数中,而不是127.0.0.1,并且我必须在pymysql.connect函数中保留127.0.0.1。起初,我将两个127.0.0.1值都更改为远程MySQL服务器名称,但仍然出现超时错误。最终,这篇文章帮助我找到了问题所在:https://www.pauldesalvo.com/how-to-connect-python-to-a-remote-mysql-database-with-ssh-encryption/ - Rob.Kachmar

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