Attendez-vous - obtenir la variable de la région d'écran en fonction de la ligne et de la colonne

StackOverflow https://stackoverflow.com/questions/1988811

Question

Je-interaction automatique avec une session SSH et un programme ERP en utilisant Attendez-vous.

Au lieu de se fier à une expression régulière pour capturer une variable dans mon script expect serait-il possible à la réception d'une certaine combinaison de touches d'un utilisateur pour capturer une zone de l'écran, par exemple un champ, dans une variable dans le code? Envoyer le serveur d'autres commandes et renverrons le champ?

Dis un numéro de commande est contenu à raison de 6, 12, 6, 18 (où 6 est la ligne et 12-18 sont les colonnes) contenant mon six chiffres du numéro de commande. Je veux obtenir ce numéro d'ordre de la ligne 6 colonnes 12 à 18 copie qui dans une variable. Ensuite, permettre à l'utilisateur d'interagir un peu plus (ou attendre un déménagement dans un autre menu), puis envoyer de nouveau le numéro de commande dans un autre menu.

Je suppose que ma question est: Est-ce le contenu de l'écran courant dans un tampon? (Pas toute la session) Pouvez-vous extraire juste un certain élément de données qui existerait seulement à cette ligne et plage colonne à l'écran?

Echantillon pseudocode:

#!/usr/bin/expect -f
set env(TERM) vt100
spawn ssh -Y user@domain
#... set user/pass and other vars...
#... send commands to log into ERP
#don't time out
set timeout -1 
        interact {
                -reset $CTRLZ {exec kill -STOP [pid]}
                $CTRLA   {   
                        exp_send "menu_address\ry\r"
                }
                $CTRLO   {   
                        #...acquire order number variable...
                        #...some code I don't understand yet...

                        exp_send "menu_exit_sequence\r"
                        exp_send "menu_address\r"
                        exp_send $ordernumvar

                }
                ~~
        }
Était-ce utile?

La solution

Non, vous ne pouvez pas saisir quelque chose hors de l'écran à une ligne / colonne particulière. Cependant, pensez à la façon dont l'information a à l'écran en premier lieu. Si c'est une application basée sur TTY utilisant malédictions, il était sortie stdout avec des séquences d'échappement spéciales qui ont causé à apparaître à cette ligne / colonne. Donc, « attendre » ces séquences d'échappement spécifiques pour obtenir ce qui est à cette position.

Autres conseils

En fait, le term_expect Exemple de programme qui vient avec attendre peut faire exactement cela. Il émule un terminal adressable curseur et vous permet de tester la sortie à des emplacements d'écran spécifiques. Dans ma distribution de ActiveTcl il est dans les démos / Attendez-vous / term_expect.

Pour déboguer la sortie de mon ERP j'ai trouvé que je pouvais utiliser exp_internal pour obtenir des caractères de sortie.

exp_internal -f file 0

La sortie de qui m'a donné: (mon numéro étant entré 076338)

spawn id exp0 sent <0>^M
spawn id exp6 sent <0>^M
spawn id exp0 sent <7>^M
spawn id exp6 sent <7>^M
spawn id exp0 sent <6>^M
spawn id exp6 sent <6>^M
spawn id exp0 sent <3>^M
spawn id exp6 sent <3>^M
spawn id exp0 sent <3>^M
spawn id exp6 sent <3>^M
spawn id exp0 sent <8>^M
spawn id exp6 sent <8>^M
spawn id exp0 sent <\r>^M
spawn id exp6 sent <\r\n\u001b[1;14H>^M

Alors maintenant, je dois comprendre l'expression rationnelle pour obtenir le terrain. J'ai eu ceci:

-nobuffer -re {^([a-zA-Z0-9]{1})?[0-9]{5}$} {
    set ordernumber $interact_out(0,string)
}

mais maintenant je dois intégrer ceci:

^([a-zA-Z0-9]{1})?[0-9]{5}

Avec une regex qui représenterait ceci:

\r\n\u001b[1;14H

Et puis une fois que j'ai que stocké dans la variable $ de numéro de commande, je dois isoler en quelque sorte seulement les caractères avant la chaîne de terminaison et stocker ces données dans une variable.

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