概要

Pythonで、SFTPでリモートマシンにファイルを送るスクリプトを作成した。


背景と目的

Pythonで、SFTPでリモートマシンにファイルを送る必要が出たので、スクリプトを作成する。


詳細

1.準備

以下が参考になった。

paramikoをインストール。

pip install paramiko


2.コーディング

まず、モジュールのインポートと送信元と送信先情報を定義。

import paramiko
import os

# 設定
HOST = 'ホスト名'
USER = 'ユーザー名'
PSWD = 'パスワード'
LOCAL_DIR = "送信元フォルダ"
REMOTE_DIR = "送信先フォルダ"

次に、あるディレクトリ以下にある全ファイルをあるディレクトリに送信する関数として以下を定義。

def put_files(sftp, localdir, remotedir):
    for name in os.listdir(localdir):
        localpath = os.path.join(localdir, name).replace("\\", "/")
        remotepath = os.path.join(remotedir, name).replace("\\", "/")
        if os.path.isdir(localpath):
            # フォルダのとき
            if not name in sftp.listdir(remotedir):
                # リモートに当該ディレクトリがないときは作成
                sftp.mkdir(remotepath)
            # 再帰的に実行
            put_files(sftp, localpath, remotepath)
        else:
            # ファイルの時
            print os.path.join(remotedir, name).replace("\\", "/")
            sftp.put(localpath, remotepath)

上記関数を呼び出して実行するスクリプト部分。

if __name__ == "__main__":

    # SSHクライアントを作成
    ssh = paramiko.SSHClient()
    ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
    ssh.connect(HOST, username=USER, password=PSWD)

    # SFTPクライアント作成
    sftp = ssh.open_sftp()

    # 送信
    put_files(sftp, LOCAL_DIR, REMOTE_DIR)

    # 終了
    sftp.close()

    # close
    ssh.close()


まとめ

上記スクリプトを実行したところ、ちゃんと送信できた。