paramiko 是否会在非 paramiko 异常时关闭 ssh 连接

问题描述 投票:0回答:3

我正在调试一些代码,这将导致我不断地登录/注销一些外部 sftp 服务器。有谁知道如果代码中引发非 paramiko 异常,paramiko 是否会自动关闭外部服务器上的 ssh / sftp 会话?我在文档中找不到它,并且由于必须在每次迭代中尽早建立连接,所以我不希望最终有 20 个打开的连接。

python ssh paramiko
3个回答
47
投票

SSHClient() 可以用作上下文管理器,所以你可以这样做

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

并且不手动关闭。


34
投票

不,paramiko 不会自动关闭 ssh / sftp 会话。异常是由 paramiko 代码还是其他方式生成并不重要; paramiko 代码中没有任何内容可以捕获任何异常并自动关闭它们,因此您必须自己执行此操作。

您可以通过将其包装在 try/finally 块中来确保它被关闭,如下所示:

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()

0
投票

根据文档这里

“(...)Paramiko 注册垃圾收集钩子,它将尝试自动为您关闭连接,但这目前并不可靠。使用后未能显式关闭客户端可能会导致进程结束挂起!

© www.soinside.com 2019 - 2024. All rights reserved.