Question

J'écris un script Attendez-vous et je avoir du mal à faire face à l'invite du shell (sous Linux). Mon Attendez-vous de script engendre rlogin et le système distant utilise ksh. L'invite sur le système distant contient le répertoire courant suivi par " > " (espace supérieur à l'espace). Un extrait de script pourrait être:

send "some command here\r"
expect " > "

Cela fonctionne pour des commandes simples, mais les choses commencent à mal tourner lorsque la commande que je envoie dépasse la largeur du terminal (ou plus précisément, ce que pense ksh est la largeur du terminal). Dans ce cas, ksh fait un peu bizarre défilement horizontal de la ligne de commande interactive qui semble réécrire l'invite et tenir un supplément « > » dans la sortie. Naturellement, cela provoque le script expect à se confondre et désynchronisés quand il semble y avoir plus d'une invite à la sortie après l'exécution d'une commande (mon script contient plusieurs paires send / de expect).

Je l'ai essayé de changer PS1 sur le système distant à quelque chose de plus distinctif comme « prompt> » mais un problème similaire se pose qui me indique ce n'est pas la bonne façon de résoudre ce problème.

Qu'est-ce que je pense de l'aide pourrait est la possibilité pour le script à dire attendre à ce que « Je sais que je suis bien synchronisé avec le système distant à ce point, donc vider la mémoire tampon d'entrée maintenant. » La déclaration de expect a le drapeau -notransfer qui ne pas Rejeter le tampon d'entrée, même si le motif correspond, donc je pense que je dois à l'opposé de cela.

Y at-il d'autres techniques utiles que je peux utiliser pour faire la coquille à distance se comporter de manière plus prévisible? Je comprends que Expect passe par beaucoup de travail à faire en sorte que la session donné naissance à apparaît pour être interactif au système distant, mais je préfère que quelques-unes des fonctionnalités interactives plus ennuyeux (comme le défilement horizontal de ksh) est désactivée.

Était-ce utile?

La solution

Si vous voulez jeter toute la production a Expect vu jusqu'à présent, essayez

expect -re $

Ceci est un match regexp sur $, ce qui signifie la fin de la mémoire tampon d'entrée, donc il suffit de sauter tout reçu à ce jour. Plus de détails sur le Attendez-vous à la page de manuel.

Autres conseils

Vous pouvez essayer "set -o multiligne" ou columns = 1000000 (ou une autre valeur suffisamment grande).

J'ai eu des difficultés avec ksh et attendre dans le passé. Ma solution était d'utiliser autre chose que ksh pour une coquille de connexion.

Si vous pouvez modifier la connexion à distance autre que ksh (en utilisant la commande chsh ou de montage / etc / passwd) alors vous pouvez essayer cela avec / bin / sh comme shell.

Une autre alternative consiste à dire KSH que le terminal est un terminal muet - désavouer de faire tout traitement spécial.

$ export TERM=""

pourrait faire l'affaire.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top