Esperar script muito rápido: adicionar um sono entre cada linha lida de um arquivo

1

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
    
por 2legit2quit 29.02.2016 / 23:49

2 respostas

1

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 #
}
    
por 01.03.2016 / 00:16
0
Então, discussões mais antigas, mas depois de lutar com 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!

    
por 02.05.2017 / 03:15