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

Ben*_*Ben 11 python ssh paramiko

我正在调试一些代码,这将导致我不断登录/退出一些外部sftp服务器.有没有人知道如果代码中引发了非paramiko异常,paramiko是否会自动关闭外部服务器上的ssh/sftp会话?我无法在文档中找到它,并且因为必须在每次迭代中尽早建立连接,所以我不希望最终得到20个开放连接.

acu*_*ich 19

不,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()
Run Code Online (Sandbox Code Playgroud)

  • 如果你在`try`块中调用`subprocess`或`os`,那么无论生成异常的是什么,都会始终调用`finally`块.如果你想要它更漂亮,那么你可能想要将客户端包装在`Context Manager`中并使用`with`语句.http://docs.python.org/reference/datamodel.html#context-managers (2认同)

小智 16

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

with SSHClient() as ssh:
   ssh.connect(...)
   ssh.exec_command(...)
Run Code Online (Sandbox Code Playgroud)

而不是手动关闭.

  • 这比 `try: ... finally: ...` 好多了! (3认同)