2012-05-27 13 views
2

我使用python paramiko(包裹在pysftp中),並且似乎存在一個問題,如果它在ssh期間無法驗證,它將掛起很長時間。我無法找到一種方法來設置連接的超時時間,並且我正在騎自行車穿越很多機器,因此一臺可以ping通但不可用ssh(一種無法通過cmdline ssh訪問)的計算機正在懸掛一切。使用此:Paramiko ssh_config參數

ssh -o ServerAliveInterval=1 -o ServerAliveCountMax=1 <host> 

我至少可以得到它在1秒鐘後報錯了,而無需等待很長一段時間的paramiko中的認證,消亡以及引發異常。但是,我無法弄清楚如何將這些ssh_config選項傳遞給paramiko(或者更好地將連接超時應用)。我嘗試過使用SSHConfig模塊並讀取配置文件,但它似乎並不適用於任何地方的數據,似乎更多地用於主機別名。

任何幫助將不勝感激,一直在四處尋找信息/幫助了很多小時。

回答

1

使用SSHClient.connect()與指定的套接字超時建立初始連接,然後使用其傳輸創建SFTPClient

連接成功

>>> import paramiko 
>>> client = paramiko.SSHClient() 
>>> client.load_system_host_keys() 
>>> client.connect(hostname='localhost', port=22, username='user', password='****', timeout=5.0) 
>>> sftp = paramiko.SFTPClient.from_transport(client.get_transport()) 
>>> dirlist = sftp.listdir('.') 

超時連接

>>> import paramiko 
>>> client = paramiko.SSHClient() 
>>> client.load_system_host_keys() 
>>> client.connect(hostname='slowhost', username='user', password='****', timeout=1.0) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "/usr/lib/python2.7/site-packages/paramiko/client.py", line 296, in connect 
    sock.connect(addr) 
    File "/usr/lib64/python2.7/socket.py", line 222, in meth 
    return getattr(self._sock,name)(*args) 
socket.timeout: timed out 
+0

您好,感謝您的答覆!是的,這就是我在第二次使用超時連接的情況下做的事情,但是它並沒有超時。我這樣做: >>>進口的paramiko >>>客戶端= paramiko.SSHClient() >>> client.load_system_host_keys() >>> client.connect(主機名= node.hostname,超時= 1.0) – user1420676

+0

,它只是掛在那兒很長一段時間,然後: 回溯(最近通話最後一個): 文件「」,1號線,在 文件「/usr/lib/pymodules/python2.6/ paramiko/client.py「,第327行,連接 self._auth(用戶名,密碼,pkey,key_filenames,allow_agent,look_for_keys) 文件」/usr/lib/pymodules/python2.6/paramiko/client.py「, 481行,在_auth raise saved_exception paramiko.SSHException:不存在會話 我不確定它在做什麼,但我很確定它在auth_handler的wait_for_response中。現在我只是使用子進程.Popen – user1420676

+0

對不起,問題不在於TCP連接,而是在TCP連接建立之後進行SSH協商。你可能能夠得到更多的細節,如果你看看paramiko日誌:'paramiko.util.log_to_file('paramiko.log')' – mhawke