title: Reading command output with Paramiko invoke_shell/send/recv never finishes
body: <p>I am trying to use <code>send</code>/<code>recv</code> function in Paramiko. According to what I see, the line throws an exception of timeout</p>
  <blockquote>
  <p>Evaluating: self.shell.recv(1024) did not finish after 3.00 seconds.</p>
  </blockquote>
  <pre><code>tmp = shell.recv(1024)
  </code></pre>
  <p>What is wrong with the function implementation?
  My exit condition from <code>while True</code> is an exception, how can I change that to exit without an exception?</p>
  <h3>Full code:</h3>
  <pre class="lang-py prettyprint-override"><code>self.shell = self.SSHConnect(ip, username, password)
  
  def SSHConnect(self, ip, username, passowrd):
      ssh = paramiko.SSHClient()
      LOGGER.debug(msg=&quot;Open SSH Client to :&quot; + str(ip))
      try:
          ssh.set_missing_host_key_policy(policy=paramiko.AutoAddPolicy())
          ssh.connect(ip, port=22, username=username, password=passowrd, allow_agent=False, look_for_keys=True)
          if self.device_type != 'linux_host':
              session = ssh.invoke_shell()
              return session
      except Exception as ex:
          LOGGER.critical(msg=&quot;SSH Client wasn't established! Device name : &quot; + str(self.device_name))
          return None 
      
      LOGGER.info(msg=&quot;Open SSH Client to :&quot; + str(ip) + &quot; established!&quot;)
      return ssh
  
  def run_command(self,cmd):
      # New run command without throwing exception at the end:
      LOGGER.debug('Start new Run command with cmd =  ' + str(cmd))
      try:
          #Check the shell is activated before sending command:
          LOGGER.debug('Check the shell is activated before sending command: ' + cmd)
          if self.shell.get_transport().active:
              LOGGER.debug('Shell is Activated ! Running the command ')
              if self.device_type == 'linux_host':
                  stdin, stdout, stderr = self.shell.exec_command(cmd)
              else:
                  try:
                      #Command for switch of UFMAPL
                      LOGGER.debug('Sending command to UFMAPL/Switch with send()')
                      out = ''
                      self.shell.send(cmd)
                      while not self.shell.recv_ready():
                          time.sleep(3)
                      counter = 1
                      print('\ncommand is : ' + cmd + '\n' )
                      while True:
                          try:
                              print('iteration number is : #' + str(counter))
                              tmp = self.shell.recv(1024)
                              counter = counter + 1 
                              if not tmp:
                                  break
                          except Exception as e:
                              break
                          out += tmp.decode(&quot;utf-8&quot;)
                          print('After iteration #' + str(counter) + ' out = ' + out + '\n\n')
                      ansi_escape = re.compile(r'\x1B\[[0-?]*[ -/]*[@-~]')
                      out = ansi_escape.sub('', out)
                      print('Printing final value before return : ' + str(out +'\n'))
                      return out
                  except Exception as e:
                      LOGGER.error('Exception in send() : ' +str(e) )
                      return None
          else:
              LOGGER.critical('Shell is not activated !')
              return &quot;&quot;
      
          if stderr.read():
              LOGGER.critical('stderr is not empty which means the last command was failed, the command might not exist on host/switch ' )
              return stderr.read().decode('utf-8')
      
          out = stdout.read()
          if out:
              return out.decode(&quot;utf-8&quot;)
          else:
              LOGGER.critical('Run command sucussfully but return empty...')
              return out.decode(&quot;utf-8&quot;)
      except Exception as e:
          LOGGER.error('Exception received in run command : ' + str(e))
  </code></pre>
  <p><em><strong>Logs (Printing to screen):</strong></em></p>
  <pre class="lang-none prettyprint-override"><code>IM HEREEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE
  
  
  command is : enable
  
  
  iteration number is : #1
  
  After iteration #2 out =
  UFM Appliance
  
  UFM is configured as standalone.
  UFM mode: Management.
  RAID state is: Degraded ( DRIVE1:Online,SpunUp, DRIVE2:Failed )
  smg-ib-apl008-gen2 [ mgmt-sa ] &gt;
  
  
  iteration number is : #2
  
  After iteration #3 out =
  UFM Appliance
  
  UFM is configured as standalone.
  UFM mode: Management.
  RAID state is: Degraded ( DRIVE1:Online,SpunUp, DRIVE2:Failed )
  smg-ib-apl008-gen2 [ mgmt-sa ] &gt; e
  
  
  iteration number is : #3
  
  After iteration #4 out =
  UFM Appliance
  
  UFM is configured as standalone.
  UFM mode: Management.
  RAID state is: Degraded ( DRIVE1:Online,SpunUp, DRIVE2:Failed )
  smg-ib-apl008-gen2 [ mgmt-sa ] &gt; enable
  smg-ib-a
  
  
  iteration number is : #4
  
  After iteration #5 out = 
  UFM Appliance
  
  UFM is configured as standalone.
  UFM mode: Management.
  RAID state is: Degraded ( DRIVE1:Online,SpunUp, DRIVE2:Failed )
  smg-ib-apl008-gen2 [ mgmt-sa ] &gt; enable
  smg-ib-apl00
  
  
  iteration number is : #5
  
  After iteration #6 out =
  UFM Appliance
  
  UFM is configured as standalone.
  UFM mode: Management.
  RAID state is: Degraded ( DRIVE1:Online,SpunUp, DRIVE2:Failed )
  smg-ib-apl008-gen2 [ mgmt-sa ] &gt; enable
  smg-ib-apl008-gen2 [ mgmt-sa ] #
  
  
  iteration number is : #6
  </code></pre>
  <p>As you can see the debugger is stuck on <code>iteration #6</code> (freeze).
  Why does it freeze and doesn't send output?</p>
  <p><em>Enviroment details:</em></p>
  <ul>
  <li>Windows 10</li>
  <li>Eclipse latest</li>
  </ul>
  <p>I would appreciate any help here. Let me know if you need more details.</p>