読者です 読者をやめる 読者になる 読者になる

SFTP で任意のディレクトリ以下のリモートファイルをコピーする

Python

これもそんなに難しい話ではないです。SFTP で Python ってググったらたくさん paramiko がヒットするし、サンプルコードがたくさんみつかります。正直公式ドキュメントは見づらいのでいちおうソースコード軽く読んだりしたけど。
公式ドキュメント::API Documentation
公式ドキュメントの具体的なメソッド::paramiko.SFTPClient
参考::pythonからsftpを使いたい - 雲雀は高く空を舞い - ひよこの会
参考::PythonでSSH接続とSFTPファイル転送

導入

pip でいいです

pip install paramiko

前提条件

こんな感じにディレクトリがあるとします

(hoge)[atasatamatara@dev  ~]$ tree testdir/
testdir/
└── testdir2
    ├── hoge.py
    ├── moge.py
    └── toge.py

コード

コメント読んでください

# coding: utf-8
import os

import paramiko

# いちおう定数にしている
USER = 'atasatamatara'
HOST = '192.168.56.101'
# 任意のディレクトリ名
DIRNAME = 'testdir2'

def main():
    """main"""
    # ssh 接続を確立する
    sshconn = paramiko.SSHClient()
    # 秘密鍵を登録
    sshconn.load_host_keys(os.path.expanduser('~/.ssh/known_hosts'))
    # ssh 接続を確立
    sshconn.connect(HOST , username=USER)
    # SFTP 接続を確立する
    sftpconn = sshconn.open_sftp()

    # 任意のディレクトリの下に移動
    sftpconn.chdir('/home/atasatamatara/testdir')
    for _files in sftpconn.listdir():
        # 任意のディレクトリ名が含まれる場合
        if DIRNAME in _files:
            # そのディレクトリから再度ファイルリストを取得
            # iterate してコピーする
            for _file in sftpconn.listdir(_files):
                sftpconn.get(os.path.join('/home/atasatamatara/testdir', DIRNAME, _file),
                             os.path.join('/Users/atasatamatara/testdir/', _file))

    # コネクションを close する
    sftpconn.close()
    sshconn.close()

if __name__ == "__main__":
    main()

まあ要は get(remotepath, localpath) だとファイル単位になるので仕方ないから for でぐるぐるまわして os.path.join でつくってやればディレクトリ以下のをコピーできますねって感じ。まあそれだけです。