2011-08-23 50 views
9

我正在调试一些代码,这将导致我不断登录/退出某些外部sftp服务器。有谁知道如果paramiko自动关闭外部服务器上的ssh/sftp会话,如果在代码中引发了非paramiko异常?我无法在文档中找到它,并且由于每次迭代都必须尽早完成连接,因此我不想以20个打开的连接结束连接。paramiko关闭ssh连接上一个非paramiko例外

回答

15

不,paramiko不会自动关闭ssh/sftp会话。如果例外由paramiko编码或其他方式产生,这并不重要; paramiko代码中没有捕获任何异常并自动关闭它们,所以你必须自己做。

可以确保它被封闭在一个尝试它包裹/ 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没有提出例外情况,但在其他地方出现问题时,可以通过“subprocess”或“os”等方式说明。我想我可以在每个异常中都放置一个'client.close()',但这不是很漂亮。 – Ben

+2

如果你将调用放在'try'块内的'subprocess'或'os',那么无论产生什么异常,总是会调用finally子块。如果你想让它变得更漂亮,那么你可能想要将客户端包装在一个'Context Manager'中并使用'with'语句。 http://docs.python.org/reference/datamodel.html#context-managers – aculich

+0

这位先生是一个点,所以+1!不回答这个问题,并且如果所有的终端都是相同的,那么把每个单独的东西放在'try ... finally'块中是没有意义的。但是,把呼叫放到一个班级里面没什么问题,所以我总是很干净地关闭它。 – Ben

3

SSHClient()可以作为一个上下文管理器,所以你可以做

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

而不是手动关闭。