deuxième “envoyer la commande” attendons à ce que le script n'est pas en attente pour terminer la Sortie de la première commande
J'ai un très petit script expect . Le flux est comme suit
ssh
à la machine à distance- Exécuter une commande et après l'exécution de la commande, vous serez dans un autre prompt ( invite de nom est
Enter cmd>
. - Sur le
Enter cmd>
invite, j'ai besoin d'exécuter de nombreuses commandes
J'ai donc conçu ce script
#!/usr/bin/expect
set FULL_CMD { #cmd1 #cmd2 #cmd3 }
puts "STARTING......."
log_file myfile.log ;# <<< === append output to a file
spawn ssh tempuser\@dummyserver
match_max 100000000
expect "password:"
send "temppasswd\r"
expect "*temp*"
send "cd \/home\r"
expect "*temp*"
send "new cmd prompt\r"
expect "Enter cmd>"
foreach tempcmd $FULL_CMD {
send "${tempcmd} \r "
expect -exact "Enter cmd>\r"
send -- "\r"
expect eof }
send "q"
send "exit\r"
puts "I HAVE ENDED......."
Mon problème: Fait l'O/P de la première commande cmd#1
est très long et je peux voir que le fait de s'attendre script n'est pas d'attente pour l'O/P de la première commande complète et envoie le deuxième commande cmd#2
après un certain temps.
Ce script fonctionne très bien sur les systèmes où l'O/P de cmd#1
est petit, mais sur les systèmes où l'O/P de cmd#1
est très grand (disons 1000000 lignes), il a du mal, à savoir les questions de la première commande cmd#1
et l'O/P suit, mais avant de revenir à Enter cmd>
invite, le script questions de la deuxième commande cmd#2
Comment puis-je m'assurer que la commande cmd#2
est envoyée seulement après la sortie de cmd#1
complète?
Vous devez vous connecter pour publier un commentaire.
Essayez de définir un délai d'attente au départ:
ou de l'utilisation
-1
à attendre indéfiniment.Pourquoi avez-vous "attendent des expressions du folklore" dans ta boucle for?
Il est intelligent, alors que le développement de votre programme, pour activer le débogage: ajouter cette près de la partie supérieure:
exp_internal 1
Le problème réside dans votre
foreach tempcmd $FULL_CMD
boucle:Le problème, c'est que vous êtes
expect
ing"Enter cmd>\r"
, mais vous n'obtiendrez jamais le\r
dans votre sortie.Ce que vous devriez
expect
est"Enter cmd>$"
, où la$
implique la fin de la commande en cours de sortie (et non pas '\nor '\r' or
eof`).Comme pour
expect eof
, elle correspond à la fin du flux d'entrée qui est reliée à la sortie du processus générés dynamiquement. Il ne fait correspondre une fois le engendré un processus se termine, il n'est donc pas utiliser ici