SFTP で任意のディレクトリ以下のリモートファイルをコピーする
これもそんなに難しい話ではないです。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 でつくってやればディレクトリ以下のをコピーできますねって感じ。まあそれだけです。