Paramiko でリモートサーバーへファイルを安全に転送する
Paramiko は Python 標準の sftp モジュールより高機能で、SSH を通じた暗号化通信を扱えるライブラリです。以下では、認証鍵を使って安全にファイルをアップロード・ダウンロードする例を示します。
import paramiko
from pathlib import Path
def secure_transfer(host, port, username, key_path, local_path, remote_path):
try:
private_key = paramiko.RSAKey.from_private_key_file(key_path)
# SSH クライアントの作成
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.RejectPolicy()) # 未登録ホストは拒否
ssh.connect(hostname=host, port=port, username=username, pkey=private_key)
# SFTP セッション開始
with ssh.open_sftp() as sftp:
sftp.put(local_path, remote_path) # アップロード
print(f'Successfully uploaded: {local_path} → {remote_path}')
ssh.close()
except paramiko.AuthenticationException:
print('認証エラー: 鍵またはユーザー情報を確認してください')
except paramiko.SSHException as e:
print(f'SSH エラー: {e}')
except FileNotFoundError:
print('ローカルまたはリモートのファイルパスが正しくありません')
except Exception as e:
print(f'予期しないエラー: {e}')
# 使用例
if __name__ == '__main__':
host = 'example.com'
port = 22
username = 'ubuntu'
key_path = str(Path.home() / '.ssh' / 'id_rsa')
local_path = '/path/to/local/file.txt'
remote_path = '/home/ubuntu/file.txt'
secure_transfer(host, port, username, key_path, local_path, remote_path)
RejectPolicy で未知のホスト鍵を拒否Path オブジェクトで明示この方法は SSH 経由で通信するため、転送内容・認証情報ともに暗号化されます。特に自動スクリプトでは、AutoAddPolicy ではなく RejectPolicy を使うことで中間者攻撃のリスクを避けられます。