10

paramikoを使用して、いくつかのファイルをダウンロードして処理する必要があるSFTPサーバーに接続しています。

サーバーのタイムアウトは5分に設定されていますが、ファイルの処理にタイムアウトよりも時間がかかる場合があります。したがって、他のファイルを処理するためにサーバーの作業ディレクトリを変更したい場合sftp.chdir(target_dir))、接続がタイムアウトしたという例外が発生します。

ファイルbuildbdist.win32eggparamikosftp://ftp.py、138行目、_write_allでEOFError()を発生させます

これに対抗するために、キープアライブをアクティブ化するのが最善のオプションだと思ったので、トランスポートで「set_keepalive」を使用して30秒に設定しました。

ssh = paramiko.SSHClient()
ssh.set_missing_hostkey_policy(paramiko.AutoAddPolicy())
ssh.connect(ssh_server, port=ssh_port, username=ssh_user, password=password)
transport = ssh.get_transport()
transport.set_keepalive(30)
sftp = transport.open_sftp_client()

しかし、何も変わりません。この変更による影響はまったくありません。set_keepaliveここの概念を誤解しているのか、サーバー(アクセス権がない)がキープアライブパケットを無視しているのかはわかりません。

これはこの問題に対処する正しい方法ではありませんか、それとも別のアプローチを試す必要がありますか?lsセッションを存続させるためにサーバーにコマンドを「手動で」送信するという考えは好きではありません。

4

1 に答える 1

6

サーバーが非アクティブでタイムアウトしている場合、クライアント側からできることはほとんどありません(セッションがタイムアウトしないように、単純なコマンドを時々送信する以外は)。

ダウンロードと処理のステップを分割して、最初に必要なものをすべてダウンロードし、非同期で、またはすべてのダウンロードが完了した後に処理できるようにすることを検討しましたか?

于 2011-03-23T13:40:37.103 に答える