Perché posso connettermi a MySQL tramite shell, ma non posso farlo tramite Python?

Sep 07 2020

Mi sto collegando a MySQL db tramite SSH sul server. Sono riuscito a farlo tramite MySql workbench e tramite la shell di sistema, il che significa che password, nome utente e ip sono corretti e consentiti.

Ora sto cercando di connettermi tramite Python. Sto usando il pacchetto sshtunnel con le stesse impostazioni del workbench (nella shell tutto era predefinito): porta mysql 3306, porta ssh 22, nome host mysql 127.0.0.1 e mi connette. Quando provo a connettermi tramite il connettore al db, ricevo:

mysql.connector.errors.ProgrammingError: 1045 (28000): Accesso negato per l'utente "myusername" @ "localhost" (utilizzando la password: YES).

Ho anche provato a connettermi direttamente tramite shell con python usando: os.system("mysql -u myusername -p")e ho ottenuto:

ERRORE 1045 (28000): Accesso negato per l'utente "myusername" @ "localhost" (utilizzando la password: YES)

Ho controllato qui:

Non è possibile accedere a MySQL tramite MySQL Workbench o HeidiSQL, ma è possibile accedere tramite shell

Accesso a MySQL da Python 3: Accesso negato per l'utente

E molti altri, ma non ho trovato niente di utile. La mia versione di Python è 3.6.8, la versione di MySql è 5.7.31. Quale altra cosa può differire tra la shell a cui si accede da Python e quella normale Unix? O l'accesso ottenuto da workbench?

Modificare:

Codice richiesto. Tutti e tre i collegamenti hanno fornito esattamente lo stesso output.

with sshtunnel.SSHTunnelForwarder(
        (ssh_host, ssh_port),
        ssh_username=ssh_username,
        ssh_password=ssh_password,
        remote_bind_address=('localhost', mysql_port)) as tunnel:
    

    # conn = mysql.connector.connect(**mysql_config)
    conn = MySQLdb.connect(host="localhost", 
    user="myusername", passwd="password", db="mydb")
    print(conn)
    # print(os.system("mysql -u myusername -p"))

Risposte

1 Manaslu Sep 07 2020 at 09:57

Sono riuscito a connettermi con:

tunnel = sshtunnel.SSHTunnelForwarder((ssh_host, 22), ssh_password=ssh_password, ssh_username=ssh_username,
     remote_bind_address=('localhost', 3306))
tunnel.start()

Apparentemente la differenza era tenere il tunnel aperto invece di usare l'istruzione "with", anche se non capisco cosa sia effettivamente successo e apprezzerei la spiegazione.