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

20 投票
3 回答
56437 浏览
提问于 2025-04-17 00:11

我正在调试一些代码,这段代码需要我不断地登录和登出一些外部的sftp服务器。有人知道如果在代码中出现了非paramiko的异常,paramiko是否会自动关闭外部服务器上的ssh/sftp会话吗?我在文档里找不到相关信息,而且因为每次迭代都需要很早就建立连接,我不想最后搞得有20个打开的连接。

3 个回答

50

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

撰写回答