スポンサーリンク

[python] paramikoのSFTPでタイムアウト処理を設定する

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つ宣言しなければならないらしく、

その引数には、ダウンロードしたバイト数、ファイルのバイト数が入っていました。

 

関連記事