48951


SSHTunnelを使って、mysql serverに接続しようとしています。  
構成は A:自宅のPC、 B:sshするサーバ、 C:mysqlが立っているサーバ、となっており、A→B→Cの順番に繋げようとしています。  
Cのmysqlの立っているサーバは、Bのサーバのipアドレスからのみアクセスできるように設定してあります。  
そのため、SSHTunnelを使って、Bを経由して、Cのサーバに接続を試みようとしています。

以下のコードを実行すると、タイムアウトになってしまい、2003のエラーがでます。  
Portが違っているとタイムアウトになると思いますが、Cのサーバはmysqlサーバ標準の3306でアクセスできるようになっています。  
remote_bind_address、local_bind_addressなどが怪しいと思っていますが、エラーがでてしまう原因は分かるでしょうか。

因みにterminal上で次のようなことを実行した場合は問題なく、mysql serverにアクセスできます。

[code]

    ssh ssh_user@ssh_server_host_name -p 22 
    mysql -h mysql_server_host_name -P 3306 -u mysql_user -p
    
[/code]

python3.7での実装

[code]

    # -*- coding: utf-8 -*-
    from sshtunnel import SSHTunnelForwarder
    # モジュール読み込み
    import pymysql.cursors
    
    # SSH関連の設定
    with SSHTunnelForwarder(
      ("ssh_server_host_name", 22),
      ssh_username="ssh_user",
      ssh_password="ssh_pass",
      remote_bind_address=('mysql_server_host_name', 3306)
     ) as server:
        print("connected server")
    
        # # MySQLに接続する
        conn = pymysql.connect(host='mysql_server_host_name',
                               user='mysql_user',
                               password='pass',
                               db='db_name',
                               charset='utf8',
                               port=server.local_bind_port,
                               cursorclass=pymysql.cursors.DictCursor)
        # select
        # SQLを実行する
        cursor = conn.cursor()
        sql = "show tables"
        cursor.execute(sql)
    
        # Select結果を取り出す
        rets = cursor.fetchall()
        for r in rets:
            print(r)
    
        # MySQLから切断する
        conn.close()
    
[/code]

エラーメッセージ

[code]

    Traceback (most recent call last):
      File "/Users/user/venv/lib/python3.7/site-packages/pymysql/connections.py", line 582, in connect
        **kwargs)
      File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/socket.py", line 727, in create_connection
        raise err
      File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/socket.py", line 716, in create_connection
        sock.connect(sa)
    socket.timeout: timed out
    
    During handling of the above exception, another exception occurred:
    
    Traceback (most recent call last):
      File "/Users/user/PycharmProjects/bitflyerPredict/database.py", line 25, in <module>
        cursorclass=pymysql.cursors.DictCursor)
      File "/Users/user/PycharmProjects/bitflyerPredict/venv/lib/python3.7/site-packages/pymysql/__init__.py", line 94, in Connect
        return Connection(*args, **kwargs)
      File "/Users/user/PycharmProjects/bitflyerPredict/venv/lib/python3.7/site-packages/pymysql/connections.py", line 327, in __init__
        self.connect()
      File "/Users/user/PycharmProjects/bitflyerPredict/venv/lib/python3.7/site-packages/pymysql/connections.py", line 629, in connect
        raise exc
    pymysql.err.OperationalError: (2003, "Can't connect to MySQL server on '(hostname)' (timed out)")
    
[/code]


CC BY-SA 4.0
2018-10-03T05:30:33.120
48921
2018-10-04T05:20:00.977
30337
question
python mysql python3 ssh
SSHTunnelを使ったmysql serverへの接続でタイムアウトエラー


localhostの server.local_bind_port に mysql 接続してみるとどうでしょうか？

[code]

      conn = pymysql.connect(host='localhost',
                               user='mysql_user',
                               password='pass',
                               db='db_name',
                               charset='utf8',
                               port=server.local_bind_port,
                               cursorclass=pymysql.cursors.DictCursor)
    
[/code]

SSHのポートフォワーディングで、リモートホストのMysql(3306)がlocalhostの local_bind_port
になる感じです。ターミナルの実行したコマンドは、ssh で対話的にログインした先で、mysql コマンドを実行しているので 両者は微妙に異ります。


CC BY-SA 4.0
2018-10-04T05:20:00.977
48951
2018-10-04T05:20:00.977
5008
48921
answer