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 ...