こんにちは。
pythonのsshtunnelモジュールを利用して、エックスサーバのMySQLサーバにアクセスしようとしているのですが、うまくいきません。
コードは下記になります。
from sshtunnel import SSHTunnelForwarder import mysql.connector with SSHTunnelForwarder( ("~~.xsrv.jp",10022), ssh_pkey="~/~/id_rsa", ssh_username="ssh_username", ssh_password="ssh_password", remote_bind_address=("mysql~~.xserver.jp", 3306) ) as ssh: config = { "user": "db_user", "host": "mysql~~.xserver.jp", "password": "db_password" } con_obj = mysql.connector.connect(**config) cur_obj = con_obj.cursor() cur_obj.execute("select * from table1;") a = cur_obj.fetchone() print(a) con_obj.close() cur_obj.close()
上記コードを実行すると次のようなエラーメッセージが出ます。
DatabaseError: 2003 (HY000): Can't connect to MySQL server on 'mysql~~.xserver.jp' (60)
ssh接続まではできていると思うですが、MySQLへの接続がうまくいっていないと思われます。
ご教示頂ければ幸いです。
(以下追記1)
色々と調べてみるとエックスサーバとそのMySQLの構成は以下のようになっているようです。
メインサーバ => IPアドレスA(複数のホスト名有りもIPアドレスは一つに紐づいている)
MySQLサーバ => IPアドレスB
MySQLユーザのホスト => メインサーバに紐づいている
なので、今まで実験して見た下記プログラムでうまくいっていないのかなと思うのですが、他に具体的なやり方浮かばず、立ち往生しています。
①SSHサーバ=メインサーバ、リモートサーバ=MySQLサーバ、python-mysqlのホスト設定=localhost
=>MySQLのユーザ設定から拒否されている
②SSHサーバ=メインサーバ、リモートサーバ=MySQLサーバ、python-mysqlのホスト設定=MySQLサーバ
=>MySQLのユーザ設定から拒否されている(このMySQLユーザが利用できるホストがおかしい)
③SSHサーバ=メインサーバ、リモートサーバ=メインサーバ、python-mysqlのホスト設定=MySQLサーバ
=>理由不明もうまくいかず...
(追記2)
全てエラー内容はCan't connect to MySQL server on '~~'
となります。
セット内容とエラーコードは以下になります。
①SSHサーバ=メインサーバ、リモートサーバ=MySQLサーバ、python-mysqlのホスト設定=localhost
with SSHTunnelForwarder( ("~~xsrv.jp",10022), ssh_pkey="~/~~/id_rsa", ssh_username="ssh_username", ssh_password="ssh_password", remote_bind_address=("mysql~~.xserver.jp", 3306) ) as ssh: print("a") config = { "host": "localhost", "port": ssh.local_bind_port, "user": "db_user", "password": "db_password" } #DB処理
'a'は出力され、その後に以下エラーコードが出る
DatabaseError: 2003 (HY000): Can't connect to MySQL server on 'mysql~~.xserver.jp' (60)
②SSHサーバ=メインサーバ、リモートサーバ=MySQLサーバ、python-mysqlのホスト設定=MySQLサーバ
with SSHTunnelForwarder( ("~~xsrv.jp",10022), ssh_pkey="~/~~/id_rsa", ssh_username="ssh_username", ssh_password="ssh_password", remote_bind_address=("mysql5009.xserver.jp", 3306) ) as ssh: print("a") config = { "host": "mysql~~.xserver.jp", "port": ssh.local_bind_port, "user": "db_user", "password": "db_password" } #DB処理
'a'は出力され、以下エラーが出る
DatabaseError: 2003 (HY000): Can't connect to MySQL server on 'mysql~~.xserver.jp' (60)
③SSHサーバ=メインサーバ、リモートサーバ=メインサーバ、python-mysqlのホスト設定=MySQLサーバ
with SSHTunnelForwarder( ("~~xsrv.jp",10022), ssh_pkey="~/~~/id_rsa", ssh_username="ssh_username", ssh_password="ssh_password", remote_bind_address=("localhost", 3306) ) as ssh: print("a") config = { "host": "mysql~~.xserver.jp", "port": ssh.local_bind_port, "user": "db_user", "password": "db_password" } #DB処理
'a'は出力され、その後に以下エラーコードが出る
DatabaseError: 2003 (HY000): Can't connect to MySQL server on 'mysql~~.xserver.jp' (60)
DatabaseErrorで、print("a")
は出力されているので、SSHは無事に繋がっているとは思うのですが、つなぐ場所がおかしいのかなと考えています。
SSHサーバに手動で繋いだ上だと"mysql -h mysql~~.xserver.jp -u db_user -p db_password
で入れて言います。
また、手動でメインサーバにSSH接続した上で以下設定でmysql-connector-pythonを実行すると接続することができます。
config = { "host": "mysql~~.xserver.jp", "user": "db_user", "password": "db_password" }
(mysql.connector.connetでhost=localhostと設定した場合は、もちろん'mysql~~.xserver.jp'の部分が'localhost'に変わります。)
結果的に解決策は分からなかったですが、いろんな環境を見直して改めて状況を整理してみようと思います。
一旦解決という形で締めさせてもらいます。
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/12/25 16:41
2018/12/26 00:04
2018/12/26 15:18
2018/12/30 06:05