1

ローカルの Windows マシンから SSH 経由で 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)

同様の質問がここここで尋ねられていますが、この問題は 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-connector-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ですか?

4

1 に答える 1