2016-06-29 20 views
0

Ich schreibe ein kleines Automatisierungsprogramm, um Verbindung durch SSH zu einem Remote-Server, aktivieren Sie ein PERL-Skript und interagieren mit dem Skript (die Menüs für den Benutzer zur Auswahl generieren) . Ich habe eine vordefinierte Liste von Antworten von Benutzern, und ich habe das PERL-Skript durchgegangen und die Eingabeaufforderungen für Menüs notiert, um es in "pexpect" zu verwenden. jetzt, ich habe:Pexpect manchmal getroffen, manchmal fehlschlägt und bei Timeout

global MYTIMEOUT 
print "starting building" 
child.sendline('/root/myscripts/perl/_build_.pl') 
child.expect('username',timeout=MYTIMEOUT) 
child.sendline(value_dict['myname']) 
child.expect('reason',timeout=MYTIMEOUT) 
child.sendline(value_dict['myreason']) 
child.expect(value_dict["branch"],timeout=MYTIMEOUT) 
child.sendline(branch_number) 
child.expect('enter revision',timeout=MYTIMEOUT) 
child.sendline('\n') 
child.expect('choose customers',timeout=MYTIMEOUT) 
child.sendline(value_dict['customers']) 
child.expect('choose number',timeout=MYTIMEOUT) 
child.sendline(value_dict['component_list']) 

Also das erwarten mit dem username,reason,branch and revision alle gut funktionieren, und wenn ich die Log-Datei des Kindes öffnen, kann ich es deutlich sehen, dass sie auf ihre korrekten Linien reagieren. danach wird vom PERL-Skript etwas Code ausgeführt, etwa 5-6 Sekunden, in dem er an die Shell-Informationen für die ausführende Person ausgibt, nach denen ich die 'choose customers' and 'choose number' sendline ignoriere, was ich geschrieben habe, und für Kunden sendet einen [return] -Wert, und wenn es zu erwarten, wählen Sie Nummer, es sendet nichts, und schließlich Timeout.

Irgendeine Möglichkeit, die Sendeline zu zwingen, mir zu gehorchen? oder stellen Sie sicher, dass der expect Catch wie es das Muster fangen sollte?

EDIT: hinzugefügt Informationen

+0

Ihre Aufgabe würde wahrscheinlich einfacher werden, wenn Sie nur das Remote-Programm ändern, um diese Optionen über die Befehlszeile zu akzeptieren! – salva

+0

das Remote-Programm ist nicht meins zu ändern, es ist aus einer anderen Abteilung und sollte nicht geändert werden. Wie auch immer, das Problem war das Token gesendet, Sie können meine Antwort sehen. trotzdem danke :) –

Antwort

1

das Problem war child.sendline('\n'), das Programm erwartet und Taste gedrückt geben, aber die Protokolle durchlaufen, die ich sah genau in dem Automatisierungsprotokoll, ich zwei neue Zeilen bekam, während in der normalen Ausgabe, Ich hatte eine neue Zeile.

es mit dem Rest des Flusses danach und das ist, warum ich seltsame nichts und newline.

änderte es zu child.sendline('') löste es.

danke für jeden, der versucht hat.