python:如何连接mysql数据库

f3temu5u  于 2021-06-20  发布在  Mysql
关注(0)|答案(1)|浏览(396)

我正在尝试编写一个脚本,连接到一个服务器,然后连接到一个mysql数据库(我现在可以通过navicat来做这件事——所以我知道mysql连接的用户名和密码是正确的)。
以下是我迄今为止写的:

import socket
from ssh2.session import Session
import mysql.connector
host = 'servername.logserverlog.net'
user = 'username'

sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.connect((host, 22))

session = Session()
session.handshake(sock)
session.userauth_publickey_fromfile(user, r'C:\Users\user\Docs\ssh-key')

cnx = mysql.connector.connect(user='username', password='$gHj1aFaVFRfhl*C', database='analyst_db')

我得到的错误是:
文件“c:\users\user\appdata\local\programs\python36-32\lib\site-packages\mysql\connector\connection.py”,第176行,在\u auth\u switch\u request raise errors.get\u exception(packet)mysql.connector.errors.programmingerror:1045(28000):拒绝用户'username'@'localhost'的访问(使用密码:yes)
考虑到我已经确认了我的用户和密码是有效的,我还尝试将密码字符串编辑为原始字符串(以查看mysql db是否正确地接收到python字符串),并收到了相同的错误。
所以,我不知道为什么会不断出现错误。

cgvd09ve

cgvd09ve1#

我最终了解到,仅仅因为我创建了一个ssh连接,我仍然需要设置一个带有端口转发的ssh隧道,以便脚本知道在哪里进行通信。我假设连接本身会告诉脚本在哪里查看(而实际上端口转发会告诉脚本在哪里查看和侦听)。
所以我跳过了一步。最后的工作脚本使用sshtunnel库中的sshtunnelforwarder。

import mysql.connector
from datetime import date, datetime, timedelta
from sshtunnel import SSHTunnelForwarder

ssh_host    = 'servername.net'
ssh_port    = 22
ssh_user    = 'serveruser'
ssh_key     = "C:\\Users\\user\\ssh\\public key"
ssh_remote_port = 3306

with SSHTunnelForwarder(
    (ssh_host, ssh_port),
    ssh_username=ssh_user,
    ssh_private_key=ssh_key,
    remote_bind_address=('127.0.0.1', ssh_remote_port)
) as server:
cnx = mysql.connector.connect(user='username', password='password', database='analyst_db, host='localhost', port=server.local_bind_port)
cur = cnx.cursor()

相关问题