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 を使うことで中間者攻撃のリスクを避けられます。