“Esperar” saída da ferramenta de automação para a variável shell

0
#!/bin/bash

# more commands here

expect << EOD
spawn telnet localhost 9151
expect -exact "Trying 127.0.0.1...\r
Connected to localhost.\r
Escape character is '^]'.\r"
send -- "AUTHENTICATE $COOKIE\r"
expect -exact "250 OK\r"
send -- "SIGNAL NEWNYM\r"
expect -exact "250 OK\r"
send -- "GETINFO circuit-status\r"
expect "250 OK\r"
send -- "QUIT\r"
expect -exact "250 closing connection\r
Connection closed by foreign host.\r"
EOD

# more commands here

Trata-se de Expect . O script acima estabelece uma conexão telnet com o cliente tor e depois de limpar os circuitos atuais, obtém o novo status do circuito.

GETINFO circuit-status produz algo como

250+circuit-status=
7 BUILT $D313CCBD93E756A53CD667D0A1A97E82B7740067~melco,$DA24B9CD2AA8C02B9068A168C420DC302D969937=TorExit1488,$C00DE13988B4ABC93B43617C0FADAA8E1D4A0293=nabtor BUILD_FLAGS=NEED_CAPACITY PURPOSE=GENERAL TIME_CREATED=2014-02-09T13:11:29.264485
5 BUILT $9DD5F90D641D835C4FCA7153148B156E6FD49CEE=darwinfish,$B013CA64C82EDC616BB3EC5DBE35BB7344EDFC2A=sipsrelay,$A59E1E7C7EAEE083D756EE1FF6EC31CA3D8651D7=chaoscomputerclub19 BUILD_FLAGS=IS_INTERNAL,NEED_CAPACITY,NEED_UPTIME PURPOSE=GENERAL TIME_CREATED=2014-02-09T13:11:05.263323
4 BUILT $5B8CCA69DFD88B0281D5E67C7764CA6B5177F210=IchGebDirNeuland,$A587BBB611657B0743CD9E6E70B6497BE209FFD2=RelayW,$D313B081A3EFC5492BE95AFE39F715413DD35586=ToileLibre BUILD_FLAGS=IS_INTERNAL,NEED_CAPACITY,NEED_UPTIME PURPOSE=GENERAL TIME_CREATED=2014-02-09T13:11:04.263266
2 BUILT $9DD5F90D641D835C4FCA7153148B156E6FD49CEE=darwinfish,$F16658975D729B8C4100A6DC649C5EDCAD1687A8=afo8,$35F51DCE73B988CBAE06B06312B4D1271979FE3B=thoreau BUILD_FLAGS=NEED_CAPACITY PURPOSE=GENERAL TIME_CREATED=2014-02-09T13:11:02.272687
.
250 OK

Eu verifiquei a página de manual , Explorando esperar - um kit de ferramentas baseado em Tcl para automatizar programas interativos ( O'Reilly) e SO, mas não consigo fazer o expect_out(buffer) funcionar com set , set env nem puts .

Como posso colocá-lo em uma variável para uso no meu script bash?

Como posso analisar uma parte dela (por exemplo, C00DE13988B4ABC93B43617C0FADAA8E1D4A0293 acima) e colocá-la em uma variável para o bash?

    
por 1.61803 09.02.2014 / 15:36

3 respostas

1

Como você está usando expect com um aqui-doc em um script bash, você faria:

output=$(
    expect << END
        expect script here
END
)

Para reduzir a saída, adicione log_user 0 à parte superior do corpo esperado e imprima a saída do comando GETINFO

send -- "GETINFO circuit-status\r"
expect "250 OK\r"
puts $expect_out(buffer)

Eu quero dizer isso:

output=$(
    expect << EOD
        log_user 0
        spawn telnet localhost 9151
        expect "Escape character is '^]'."
        send -- "AUTHENTICATE $COOKIE\r"
        expect "250 OK\r"
        send -- "SIGNAL NEWNYM\r"
        expect "250 OK\r"
        send -- "GETINFO circuit-status\r"
        expect "250 OK\r"
        puts $expect_out(buffer)
        send -- "QUIT\r"
        expect eof
EOD
)
    
por 16.06.2014 / 11:40
0

Você pode criar um wrapper no bash, redirecionar a saída de esperar para um arquivo, analisar o arquivo e definir variáveis. Ou variações disso.

mark5:~/test# cat test.xp
send "bla\n"
mark5:~/test# expect test.xp
bla
mark5:~/test# expect test.xp > test.out
mark5:~/test# cat test.out
bla
mark5:~/test# #now parse test.out
    
por 09.02.2014 / 16:30
0

Tarde demais eu aprendi ( variável Access de esperar script no script bash ) que ambiente vars de um filho não pode ser passado para o ambiente do pai, pelo menos da maneira que eu descrevi, ou seja, referindo-se a um var padrão espere do shell bash. Então, vou continuar usando o script expect em um var e analisar seu valor.

    
por 03.04.2015 / 21:03