Home

pythonでssh

update: 2019-07-29

python

実務で使える?sshテクニックをご紹介。 サーバのリソースを参照するが、わざわざサーバにデプロイするまでもない(あるいはできない)プログラムの作成に役立つはず..?

Fabric

Fabric2でpython3系に対応してます。本記事でも2のほうを扱ってます。

Fabricに関しては下記がわかりやすかったです。

Pythonタスクランナー Fabric 2 の紹介 - 前編 Fabricの概要 -

とりあえずssh系のタスクを実行するためのパッケージという認識でOK。ってことで実例を以下にあげます。タスクランナーとしての側面はここでは触れません。

多段ssh

local->BASTION->DEST パスフレーズを設定している想定。

from fabric import Connection
with Connection(DEST,
                user=USER,
                gateway=Connection(BASTION,
                                   user=USER,
                                   port=PORT,connect_timeout=10,
                                   connect_kwargs={'passphrase':PASS}
                                  ),
                connect_kwargs={'passphrase':PASS}
          ) as conn:
        with conn.cd('/usr/local/'):
            # ワークディレクトリを移動する場合はコンテキストで
            conn.run('pwd')

ポートフォワーディング

DBのポートをlocalhostのポートに割り当てた後、そのlocalhostのポートに対してアクセス。ここではpostgresを想定。 local:PORT_L->(SERVER)->DB:5432

import psycopg2
from fabric import Connection
with Connection(SERVER,
                user=USER,
                port=PORT,
                connect_timeout=10,
                connect_kwargs={'passphrase':PASS}
               ).forward_local(local_port=PORT_L,
                               remote_port=5432,
                               remote_host=DB):
    conn_pg = psycopg2.connect(f"host=localhost port={PORT_L} dbname=??? user=??? password=???")
    cur = conn_pg.cursor()
    cur.execute("select 'connected'")