2013-04-30 14 views
6

Nie wiem co się dzieje, ale nie otrzymuję kompletnego wyniku z wykonanego polecenia zdalnego prawdopodobnie dlatego, że oczekuje się, że bufor wewnętrzny zostanie wykonany.Jak uzyskać pełne dane wyjściowe, gdy rozmiar bufora wewnętrznego przekroczył oczekiwany rozmiar (bufor)?

proc SendCommands { Commands } { 
      global prompt log errlog 
        foreach element [split $Commands ";"] { 
            expect { 
              -re $prompt 
              {send -- "$element\r"} 
              } 
            set outcome "$expect_out(buffer)" 
          foreach line [split $outcome \n] { 
             foreach word [regexp -all -inline {\S+} $line] { 

              if {([string index [string trimleft $line " "] 0 ] == "%")} { 
               puts "$outcome" 
               exit 1 
              } 
             } 
          } 
        puts "$outcome" 
        } 

    } 

    set timeout 30 

    foreach host [ split $hosts "\;" ] { 
      spawn ssh -o "StrictHostKeyChecking no" "[email protected]$host" 
    match_max 10000000 

    expect { 
     timeout { send_user "\nFailed to get password prompt\n"; exit 1 } 
     eof { send_user "\nSSH failure for $host\n"; exit 1 } 
      "*?assword:*" 
      { 
      send -- "$password\r" 
      } 

    } 


    expect { 
       timeout { send_user "\nLogin incorrect\n"; exit 1 } 
       eof { send_user "\nSSH failure for $host\n"; exit 1 } 

     -re "$prompt" 
      { send -- "\r" } 
      } 
    set timeout 300 
    SendCommands "$Commands" 
    } 

to jak mam je wykonuje:

./sendcommand aehj SWEs-elmPCI-B-01.tellus comnet1 "terminal length 0;show int description" "(.*#)$" 

Dostaję pełną moc tylko wtedy, gdy usunę log user 0 ale kiedy używam stawia polecenie w sendcommands fucnction wyżej i uzyskać około 90 procent o 10 procentach końcowych danych na końcu nie jest pokazane.

w jedną stronę myślę, że należy użyć negacji regex w spodziewać, ale nie wydaje się działać.

        expect { 
              -re ! $prompt 
              {puts $expect_outcome(buffer)} 
              } 

EDIT: mam wszystkie dane wyjściowe raz, gdy jej wykonywany około 5 lub 7 razy

Odpowiedz

1

Po krótkim poszukiwaniu wpadłem na to i wydaje się działać, ale daj mi znać żadnej execptions lub lepszych odpowiedzi :

ustawić match_max = 1.000 następnie

expect { 
      -re $prompt 
      {send -- "$element\r"} 

    full_buffer { 
     append outcome $expect_out(buffer) 
     exp_continue 
    } 

            } 
append outcome $expect_out(buffer) 
puts $outcome 

ale kiedy ustawić match_max = 10000 lub 100 nie powiedzie się ponownie