📝

python3で多段ssh接続を使用してMySQLからデータを取得する

2023/09/26に公開

経路

ローカルPC → 踏み台サーバ1 → 踏み台サーバ2 → MySQL

準備

  • sshtunnelをインストール
pip3 install sshtunnel
  • pymysqlをインストール
pip3 install PyMySQL

コードを書く

  • MySQLに接続する
from sshtunnel import SSHTunnelForwarder
from pymysql import connect

ssh_args1 = {
    "ssh_address_or_host" : ("踏み台サーバ1のIPアドレス", 22),
    "ssh_username" : "踏み台サーバ1のユーザ名"),
    "ssh_pkey" : "踏み台サーバ1のSSH認証用秘密鍵",
    "remote_bind_address" : ("踏み台サーバ2のIPアドレス", 22),
    "local_bind_address" : ("localhost", 10022)
}

ssh _args2 = {
    "ssh_address_or_host" : ("localhost", 10022), #ssh_args1を使用
    "ssh_username" : "踏み台サーバ2のユーザ名"),
    "ssh_pkey" : "踏み台サーバ2のSSH認証用秘密鍵",
    "remote_bind_address" : ("MySQLサーバのIPアドレス", 3306),
    "local_bind_address" : ("localhost", 13306)
 }
 
 db_args = {
     "host" : "localhost",
     "port": "13306",
     "user" : "root", #MySQLのユーザ名
     "password" : "MySQLのパスワード"
 }
 
 connectServer1 = SSHTunnelForwarder(**ssh_args1)
 connectServer2 = SSHTunnelForwarder(**ssh_args2)
 
 connectServer1.start() #踏み台1を経由して踏み台2にトンネル
 connectServer1.start() #前述のトンネルを使用してMySQLサーバに接続
 
 connectDB = connect(**db_args) #MySQLにログイン
  • MySQLからデータを取得
sql = '''SELECT * FROM XXX''' #実行するSQL文

with connectDB.cursor() as cursor:
    cursor.execute(sql)
    rows = cursor.fetchall() #全件取得
    for row in rows:
        print(row)
  • 接続を閉じる
connectDB.close()

connectServer2.stop()
connectServer1.stop()

Discussion