Domanda

Sono auto-interazione con una sessione SSH e un programma ERP utilizzando Aspettatevi.

Piuttosto che fare affidamento su un'espressione regolare per catturare una variabile nel mio script aspettarsi sarebbe possibile dopo aver ricevuto una certa sequenza di tasti da un utente di catturare una regione dello schermo, ad esempio un campo, in una variabile nel codice? Inviare il server di alcuni altri comandi e inviare di nuovo il campo?

Inserisci un numero d'ordine è contenuto a 6, 12, 6, 18 (dove 6 è la riga e 12-18 sono le colonne) contenente il numero d'ordine 6 cifre. Voglio ottenere quel numero ordine fila 6 colonne da 12 a 18 che a copiare in una variabile. Quindi consentire all'utente di interagire ancora un po '(o si aspettano una mossa in un altro menu), poi ri-inviare il numero d'ordine in un altro menu.

Quindi credo che la mia domanda è: sono i contenuti della schermata corrente in un buffer? (Non l'intera sessione) Si può estrarre solo un certo elemento di dati che esisterebbe solo in quel campo di riga e colonna sullo schermo?

Esempio pseudocodice:

#!/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

                }
                ~~
        }
È stato utile?

Soluzione

No, non si può afferrare qualcosa fuori dello schermo in un particolare riga / colonna. Tuttavia, pensare a come le informazioni ottenuto allo schermo, in primo luogo. Se si tratta di un'applicazione basata tty utilizzando curses Era uscita stdout con sequenze di escape speciali che hanno indotto ad apparire in quella riga / colonna. Quindi, 'aspetta' quelle specifiche sequenze di escape per ottenere ciò che è in quella posizione.

Altri suggerimenti

In realtà il term_expect programma di esempio che viene fornito con Aspettatevi può fare esattamente questo. Emula un terminale cursore indirizzabile e permette di testare uscita in posizioni specifiche dello schermo. Nella mia distribuzione ActiveTcl è in demo / Aspettatevi / term_expect.

Per l'output di debug del mio ERP ho scoperto che potevo usare exp_internal per ottenere i caratteri di output.

exp_internal -f file 0

L'output di che mi ha dato: (il mio numero inserito essendo 076.338)

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

Così ora ho bisogno di capire l'espressione regolare per ottenere il campo. Ho avuto questa:

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

, ma ora ho bisogno di incorporare questa:

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

Con un po 'regex che rappresentasse questo:

\r\n\u001b[1;14H

E poi una volta che ho memorizzato nella variabile $ numero d'ordine, ho bisogno di qualche modo di isolare solo i caratteri prima della stringa di terminazione e memorizzare quelle di una variabile.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top