2014-11-01 79 views
1

我需要paramiko(python)的一些幫助。我有一個帶有非標準SSH接口的服務器,所以我使用了交互模式,並且我在同一個通道下運行了幾個命令(exec_command不適用於我)。一切都很好,但我想介紹一些每命令超時,因爲應用程序停留在沒有收到數據時的while循環。 Channel.settimeout似乎無法正常工作,因爲第一條命令之後的應用程序超時。由於線程,我無法使用信號。當我使用time()來計算數據變量爲空後的時間時,我注意到整個代碼執行掛起,很可能等待通道數據。任何建議如何解決這個將不勝感激。python paramiko timeout for commands

ssh=paramiko.SSHClient() 
    ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) 
    try: 
     connect = ssh.connect(host,username=,password=,timeout=20) 
     file=open("test.txt","w+") 
     channel = ssh.invoke_shell() 
     data = channel.recv(5000) 
     set_of_commands = ["cmd\n","reset\n"] 

     while set_of_commands is not None: 

      file.write(data) 
      # New command might be executed here if we have 'system:' 
      if re.match("system:",data) is not None: 
       try: 
        command=set_of_commands.pop() 
        channel.send(command) 
       except: 
        break 
      data=channel.recv(5000) 
+0

超時是針對TCP連接超時。 – 2014-11-03 03:55:26

+0

您是否嘗試過使用channel.recv_exit_status()? – 2014-11-03 04:04:45

回答

0

您可能可以在下面用於每個命令超時。 我參考了這篇文章。在ssh.connect API使用 Python Paramiko timeout with long execution, need full output

chan = ssh.get_transport().open_session() 

cmd = "timeout {0} {1}\n".format(timeouttime, cmd) 

chan.exec_command(cmd) 
+0

這對我不起作用,因爲我沒有運行'timeout'+命令的選項。這裏沒有CoreUtils GNU。 – ols26 2014-11-04 16:35:31

+0

我認爲你應該嘗試channel.recv_exit_status()API。 – 2014-11-05 11:53:31