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つ宣言しなければならないらしく、
その引数には、ダウンロードしたバイト数、ファイルのバイト数が入っていました。