📝
python3で多段ssh接続を使用してMySQLからデータを取得する
経路
ローカル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