Pergunta

Estou interagindo automaticamente com uma sessão SSH e um programa de ERP usando o espera.

Em vez de depender de uma expressão regular para capturar uma variável no meu script, seria possível receber uma certa tecla de um usuário para capturar uma região de tela, digamos um campo, em uma variável no código? Enviar ao servidor alguns outros comandos e reenviar o campo?

Digamos que um número de pedido esteja contido em 6, 12, 6, 18 (onde 6 é a linha e 12-18 são as colunas) contendo meu número de ordem de 6 dígitos. Quero obter o número do pedido das colunas da linha 6 12 a 18 Copie isso em uma variável. Em seguida, permita que o usuário interaja um pouco mais (ou espere uma mudança para outro menu) e, em seguida, faça novamente o número do pedido em outro menu.

Então, acho que minha pergunta é: o conteúdo da tela atual em um buffer? (não a sessão inteira) Você pode extrair apenas um determinado elemento de dados que existiria apenas nessa linha de linhas e colunas na tela?

Amostra 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

                }
                ~~
        }
Foi útil?

Solução

Não, você não pode pegar algo fora da tela em uma linha/coluna específica. No entanto, pense em como as informações chegaram à tela em primeiro lugar. Se for um aplicativo baseado em TTY, usando maldições, foi emitido para o STDOUT com sequências de fuga especiais que o fizeram aparecer nessa linha/coluna. Então, 'espere' essas seqüências de fuga específicas para obter o que está nessa posição.

Outras dicas

Na verdade termo_expect Exemplo de programa que vem com o esperado pode fazer exatamente isso. Ele emula um terminal adjunto do cursor e permite testar a saída em locais específicos da tela. Na minha distribuição do ActiveTCL, está em demos/espera/termin_expect.

Para depurar a saída do meu ERP, descobri que poderia usar exp_internal Para obter caracteres de saída.

exp_internal -f file 0

A saída disso me deu: (meu número inserido sendo 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

Então agora eu preciso descobrir o regex para obter o campo. Eu tive isso:

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

Mas agora preciso incorporar isso:

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

Com algum regex que representaria isso:

\r\n\u001b[1;14H

E depois que eu tenho isso armazenado na variável $ OrderNumber, preciso de alguma forma isolar apenas os caracteres antes da sequência de terminação e armazená -los em uma variável.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top