Esperar uso de saída

1

Eu fiz um script e ficou assim:

#!/usr/bin/expect -f
set ip [lindex $argv 0];
spawn ssh name@server
expect "assword"
set timeout 0.5
send "password\r"
expect "xxxxx"
set timeout 1
send "telnet $ip\r"
expect "assword"
send "password\r"
expect "xxxxxx"
send "xxxxxxx\r"
.
.
.
.

O script continua em um ponto em que minha saída é exibida assim:

Last update from 1.1.1.1 1d06h ago
  Routing Descriptor Blocks:
  * 1.1.1.1 from 2.2.2.2

Eu preciso descobrir como extrair esse IP que sempre será exclusivo ( 1.1.1.1 ) e colocá-lo automaticamente em meu script para que eu possa continuar.

    
por inscripted 06.05.2018 / 12:04

1 resposta

0

Existem duas instâncias de 1.1.1.1 ; supondo que a primeira instância seja compatível, primeiro será necessário escrever um script simples que gere a saída necessária e também inclua prompts falsos, feitos mais ou menos pelo dispositivo remoto:

#!/usr/bin/env expect
proc prompt {} { puts "prompt"; gets stdin; }
prompt
puts "Last update from 1.1.1.1 1d06h ago"
puts "  Routing Descriptor Blocks:"
puts "  * 1.1.1.1 from 2.2.2.2"
prompt

Eu chamei esse script de generator ; então também precisa de outro script que chame e interaja com esse script. Mas primeiro um desvio sobre como iterar rapidamente as alterações nesses scripts; em outro terminal eu estava correndo:

$ (echo consume; echo generate) | entr ./consume
...

que executa o script consume a qualquer momento em qualquer um dos scripts consume ou generate . Então eu posso mexer com os scripts para interagir com os prompts, encontrar a saída necessária e aplicar uma expressão regular (leia o regexp(n) manual):

#!/usr/bin/env expect
spawn -noecho ./generate

expect -ex prompt
send -- "before\r"

expect -ex prompt
# this is what I used to confirm that the required prompt block
# had been matched
#puts ">>>$expect_out(buffer)<<<"

regexp {Last update from ([^ ]+) } $expect_out(buffer) unused theip
puts ">>>$theip<<<"

send -- "after\r"
expect eof

este método assume que a saída desejada é preparada por prompts; outra opção seria expect the Last update ... line com uma expressão regular, mas isso pode ser mais complicado. Além disso, essa correspondência de endereço IP poderia realmente corresponder a qualquer coisa; use uma expressão regular mais exata se precisar validar se o texto realmente é um endereço IP.

Diversas preocupações:

  • Seus tempos limite são muito baixos; o que acontece se algum dos sistemas ou redes envolvidos for lento e a saída demorar mais do que o tempo limite determinado para chegar?
  • Não há muita verificação de erros, o que acontece se o sistema ssh lançar um erro ou prompt de chave do host ou ...
por 06.05.2018 / 16:52

Tags