2016-06-29 4 views
0

J'écris un petit programme d'automatisation pour se connecter via ssh à un serveur distant, activer un script PERL et interagir avec le script (qui génère des menus pour l'utilisateur à choisir) . J'ai une liste de réponses prédéfinie par l'utilisateur, et j'ai parcouru le script PERL et noté les invites du menu afin de l'utiliser dans "pexpect". maintenant, je:pexpect parfois atteint, échoue parfois et quitte à l'expiration

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']) 

Ainsi, l'attendent avec le username,reason,branch and revision tous fonctionnent très bien, et quand j'ouvre le fichier journal de l'enfant, je peux le voir clairement qu'ils répondent à leurs bonnes lignes. après cela, il y a du code en cours d'exécution par le script PERL, environ 5-6 secondes, dans lequel il renvoie à l'information shell pour la personne qui l'exécute, après quoi, j'obtiens 'choose customers' and 'choose number' le sendline ignore ce que j'ai écrit, et pour les clients envoie une valeur [retour], et quand il arrive à s'attendre à choisir un nombre, il n'envoie rien, et finit par expirer. Un moyen de forcer le sendline à m'obéir? ou assurez-vous que les captures s'attendent à ce qu'elles soient attrapées?

EDIT: ajout d'informations

+0

Votre tâche deviendrait probablement plus simple si vous modifiez simplement le programme distant pour accepter ces options depuis la ligne de commande! – salva

+0

le programme à distance n'est pas le mien à changer, il est de département différent et ne devrait pas être changé. de toute façon, le problème était le jeton envoyé, vous pouvez voir ma réponse vers le bas. Merci quand même :) –

Répondre

1

le problème child.sendline('\n'), le programme prévu et entrez appuyé sur la touche, mais en passant par les journaux de près je l'ai vu dans le journal d'automatisation, j'ai eu deux nouvelles lignes, alors que dans la sortie normale, J'ai eu une nouvelle ligne.

il a foiré avec le reste du flux après cela et c'est pourquoi j'ai eu des choses bizarres et newline.

en le changeant en child.sendline('') l'a résolu.

merci pour ceux qui ont essayé.