2014-06-09 15 views
6

Trudno mi zrozumieć, jak działa funkcja recv().Jak działa funkcja paramiko Channel.recv()?

http://docs.paramiko.org/en/1.13/api/channel.html#paramiko.channel.Channel.recv

Rozumiem to odbiera kawałek do danych przy każdym wywołaniu funkcji, ale może ktoś rozwinąć struktury i wielkości tych danych? Powiedzmy, mogę wysłać polecenie date, zauważam:

  • 1-te odczytu dostaje: "Date"
  • 2-ta odczytu pobiera: rzeczywista odpowiedź (Pn cze 9 12:04:17 CDT 2014)
  • 3rd odczytu gets: prompt

Ale w jaki sposób obsługuje on debugowanie wiadomości, które pojawiają się losowo na terminalu?

Czy poprzedni wzór jest prawdziwy, o ile faktyczna odpowiedź jest mniejsza niż maksymalna liczba bajtów (nbytes)?

Co stanie się, jeśli przekroczy on nbytes?

Jak na życzenie, dodałem fragment poniższy kod:

while reads<maxReads: 
    resp = self.__chan.recv(maxBytes) 
    print resp 
    self.__buffer += resp 
    if resp.endswith('$ ') or resp.endswith('# '): 
     break 
    reads += 1 
+1

Należy otrzymać do nbytes. Wszystko większe i zajmie maksymalną porcję bajtów. Coś mniej i zwróci wszystko, ponieważ jest mniejsze niż maksymalny rozmiar. Następnym razem, gdy wywołasz channel.recv, będzie on kontynuowany tam, gdzie został przerwany ostatni. Nie ma znaczenia, gdzie w poleceniu zostało przerwane, zajmie tylko określoną maksymalną liczbę bajtów. Wszelkie monity wysyłane do stderr będą musiały używać recv_stderr. Nie jestem pewien, czy to odpowie na twoje pytanie. – Bob

+0

ummm jeden z nich :) ... Wysyłając polecenie, a wywołanie recv następnie dostaje mi samo polecenie, a nie rzeczywistą odpowiedź – user3388884

+0

możemy zobaczyć kod, w którym wysyłasz i recv? Może być coś prostego w tym, jak to napisałeś, być może nie zauważyłeś. – MikeRixWolfe

Odpowiedz

0

Kanał recv() odpowiada socket.recv(), to nie ma żadnej konkretnej struktury lub rozmiaru, to czyta wszystko, co dane zostały wysłane ze zdalnego serwera, nie przekraczając maxBytes.

można powszechnie używać recv() w pętli, aż pojawi się kawałek danych Czekasz na:

def _wait_for_data(self, options, verbose=False): 
    chan = self.chan 
    data = "" 
    while True: 
     x = chan.recv(1024) 
     if len(x) == 0: 
      self.log("*** Connection terminated\r") 
      sys.exit(3) 
     data += x 
     if verbose: 
      sys.stdout.write(x) 
      sys.stdout.flush() 
     for i in range(len(options)): 
      if re.search(options[i], data): 
       return i 
    return -1