Pregunta

Estoy de auto-interactuando con una sesión SSH y un programa ERP utilizando esperar.

En lugar de confiar en una expresión regular para capturar una variable en mi guión esperar que sería posible después de recibir una cierta combinación de teclas de un usuario para capturar una región de la pantalla, por ejemplo un campo, en una variable en el código? Enviar el servidor algunos otros comandos y vuelva a enviar el campo?

Say un número de orden está contenida a los 6, 12, 6, 18 (donde 6 es la fila y 12-18 son las columnas) que contiene mi número de orden de 6 dígitos. Quiero conseguir ese número de orden de la fila 6 columnas 12 a 18 que copiar en una variable. Luego permitir al usuario interactuar un poco más (o esperar un movimiento en otro menú), a continuación, volver a enviar el número de pedido en otro menú.

Así que supongo que mi pregunta es: ¿son los contenidos de la pantalla actual en un búfer? (No toda la sesión) ¿Se puede extraer sólo un cierto elemento de datos que sólo existiría en esa fila y columna rango en la pantalla?

pseudocódigo de la muestra:

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

                }
                ~~
        }
¿Fue útil?

Solución

No, no se puede tomar algo fuera de la pantalla en una fila / columna en particular. Sin embargo, pensar en cómo la información llegó a la pantalla en el primer lugar. Si se trata de una aplicación basada en el uso de TTY maldiciones que era la salida estándar con secuencias de escape especiales que hizo que apareciera en esa fila / columna. Así, 'esperar' esas secuencias específicas de escape para conseguir lo que está en esa posición.

Otros consejos

En realidad, el term_expect programa de ejemplo que viene con esperar puede hacer exactamente esto. Emula un terminal cursor direccionable y que permite la salida de prueba en lugares específicos de la pantalla. En mi distribución ActiveTcl está en demostraciones / cuente / term_expect.

Para la salida de depuración de mi ERP descubrí que podía usar exp_internal para obtener caracteres de salida.

exp_internal -f file 0

La salida de la que me dio: (mi número introducido siendo 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

Así que ahora tiene que averiguar la expresión regular para obtener el campo. Tenía esta:

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

pero ahora tengo que incorporar esta:

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

Con un poco de expresiones regulares que representaría a esto:

\r\n\u001b[1;14H

Y a continuación, una vez que tengo que almacena en la variable $ número de pedido, tengo que de alguna manera aislar sólo los caracteres antes de la cadena de finalización y almacenar los de una variable.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top