web-dev-qa-db-ja.com

paramikoは非paramiko例外でssh接続を閉じますか

私はいくつかのコードをデバッグしています。その結果、いくつかの外部sftpサーバーに常にログイン/ログアウトします。コードで非paramiko例外が発生した場合に、paramikoが外部サーバー上のssh/sftpセッションを自動的に閉じるかどうかを誰かが知っていますか?ドキュメントでそれを見つけることができません。接続は各反復のかなり早い段階で行う必要があるため、20の接続が開いたままになることは望ましくありません。

13
Ben

いいえ、paramikoはssh/sftpセッションを自動的に閉じません。例外がparamikoコードによって生成されたかどうかは関係ありません。 paramikoコードには、例外をキャッチして自動的に閉じるものは何もないので、自分で行う必要があります。

次のようにtry/finalブロックでラップすることで、確実に閉じることができます。

client = None
try:
    client = SSHClient()
    client.load_system_Host_keys()
    client.connect('ssh.example.com')
    stdin, stdout, stderr = client.exec_command('ls -l')
finally:
    if client:
        client.close()
20
aculich

SSHClient()はコンテキストマネージャーとして使用できるため、次のことができます。

with SSHClient() as ssh:
   ssh.connect(...)
   ssh.exec_command(...)

手動で閉じないでください。

20
Todor Buyukliev