pythonのparamikoで、SFTP関連の処理を行うときに、タイムアウトを設定するやり方をまとめます。
コード全文
import paramiko
import time
start_time = 0
def _timer(a, b):
# 時間差取得
t = time.time() - start_time
if t > 5:
# getにかかる時間が5秒以上だったらタイムアウトエラー
raise TimeoutError
HOST = '127.0.0.1'
PORT = 22 # SFTPのポート
USER = 'test'
PASSWORD = 'test'
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect(HOST, PORT, USER, PASSWORD, timeout=5.0)
sftp = ssh.open_sftp()
remote_path = 'sample.txt'
local_path = 'local_sample.txt'
# getする前の時間を取得
start_time = time.time()
try:
sftp.get(remote_path, local_path, callback=_timer)
except TimeoutError:
print('タイムアウトエラーです。')
ssh.close()
SSH接続時のタイムアウト
sshオブジェクトを使って、コネクションオブジェクトを作るときに、
引数を追加することでタイムアウトの設定ができます。
引数の値は秒単位で設定しています。
ssh.connect(HOST, PORT, USER, PASSWORD, timeout=5.0)
getでのタイムアウト
getでのファイル取得時に、タイムアウト処理を行う場合は、
コールバック関数でタイムアウト処理をすることができます。
sftp.get(remote_path, local_path, callback=_timer)
コールバック関数の中身は、
ファイル取得の経過時間を求めて、その時間でエラーを発生させています。
コールバック関数の引数は2つ宣言しなければならないらしく、
その引数には、ダウンロードしたバイト数、ファイルのバイト数が入っていました。

