Use um loop while
:
set fp [open "datfile"]
while {[gets $fp line] >= 0} {
puts $line
#sleep 3
# but better to wait for the prompt
expect #
}
Estou tentando automatizar os comandos de troca. É quase tudo de bom, mas quando o script espera lê cada linha do arquivo que contém meus comandos switch (listados linha por linha), o switch parece parar após cerca de 10 ou 15 comandos, eu acho que o buffer é muito pequeno. >
Como posso adicionar uma suspensão entre cada comando lido no arquivo? Obrigado !!
set fp [open "/home/room.txt" r]
set data [read $fp]
set timeout -60
spawn telnet 10.91.60.14
match_max 100000
sleep 2
expect *
send -- "^Y"
sleep 2
send -- "password\r"
sleep 2
send -- "^[\[A"
send -- "^[\[A"
send -- "\r"
sleep 1
send -- "enable\r"
send -- "configure terminal\r"
sleep 1
expect *
sleep 2
**send -- "$data"**
sleep 2
interact
Use um loop while
:
set fp [open "datfile"]
while {[gets $fp line] >= 0} {
puts $line
#sleep 3
# but better to wait for the prompt
expect #
}
expect
nos últimos dois dias e reunir várias dicas úteis dos usuários aqui e em outros lugares, decidi postar o que eu encontrara. Eu também estou em um Mac não nativo Linux para isso, então algumas coisas eram peculiares.
Este script é chamado de um script bash
com:
expect -d <filename>.expect
Se #!<PATH to expect> -f
for implementado na linha superior do seu arquivo *.expect
E você:
chmod +x <filename>.expect
do seu arquivo, isso funcionará.
O -d
é para informações adicionais de depuração.
Ligue para o expect
com:
expect -df <filename>.expect
no seu script bash para obter o mesmo efeito e você não precisa de direitos executáveis no arquivo.
As informações de depuração são muito úteis para ver as suas declarações expect
, variáveis, etc., da seguinte forma:
spawn <program> <args>
parent: waiting for sync byte
parent: telling child to go ahead
parent: now unsynchronized from child
spawn: returns {29747}
expect: does "" (spawn_id exp10) match glob pattern "Please enter
passphrase:"? no
Please enter passphrase:
expect: does "Please enter passphrase: " (spawn_id exp10) match glob
pattern "Please enter passphrase:"? yes
expect: set expect_out(0,string) "Please enter passphrase:"
expect: set expect_out(spawn_id) "exp10"
expect: set expect_out(buffer) "Please enter passphrase:"
Aqui está o short bash script, (apenas um exemplo, mas útil se você precisar fazer coisas mais complexas ou apenas chamá-lo de bash
por algum motivo)
#!/bin/bash
expect -d exp.expect "$WORD"
RET=$?
if [ $RET -eq 1 ]; then
#mac specific, sheer laziness, allows me to do other stuff...
#use esay or similar on Linux
say "Query was found, expect returned success"
echo ***************************************************
echo ******************FOUND!***************************
fi
exit 0
Aqui está o script expect
:
#!/usr/bin/expect -f
#capture logs for debugging
log_file -a log_file.txt
#dont timeout, let the program run its course, (was mandatory for me)
set timeout -1;
#capture all of our output for debugging
set output [ open "output.txt" "RDWR" ];
#This procedure is called repeatedly with the next word
proc check_word {w} {
#kickoff our other program we are going to talk to
spawn <program> <args>
#we want this one to go regardless, the next 2 are mutex
expect "Please enter passphrase:" { send "$w\r"; send_user "\nSENDING: $w\r"; send_user "\nOutput BUFFER: $expect_out(buffer)\n" }
#These are mutually exclusive, either worked or not, can be grouped
expect {
"scrypt: Passphrase is incorrect" { send_user "\n*FAILED*\n"; close }
-re {anders} { send_user "$expect_out(buffer)\n"; close; exit 1 }
}
#wait for the process to end, timeout is set to never expire
wait
}
#open the file to take the words from, (happens before proc above)
set input [ open "words.txt" "RDONLY" ];
#while there are still words, (we exit on a match) ...keep going....
while {[gets $input word] != -1} {
check_word $word;
}
#close input file, TODO do this upon success in expect call too?
close $input
close $words
#EOF
Espero que isso ajude alguém / alguém a economizar tempo!