Назад | Перейти на главную страницу

Ожидайте, что сценарий будет слишком быстрым: добавьте паузу между каждой строкой, прочитанной из файла

Я пытаюсь автоматизировать команды переключения. Это почти все хорошо, но когда ожидаемый скрипт читает каждую строку из файла, содержащего мои команды переключения (перечисленные строка за строкой), переключатель, кажется, останавливается примерно после 10 или 15 команд, я думаю, что буфер слишком мал.

Как я могу добавить засыпание между каждой командой, читаемой из файла? Спасибо!!

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

Итак, старое обсуждение, но после борьбы с expect за последние день или два и собрав несколько полезных советов от пользователей здесь и в других местах, я решил опубликовать то, что нашел. Я тоже на Mac не родной Linux для этого так некоторые вещи были причудливыми. Этот сценарий вызывается из bash сценарий с:

expect -d <filename>.expect

Если #!<PATH to expect> -f реализован в верхней строке вашего *.expect файл И ты:

chmod +x <filename>.expect ваш файл будет работать. В -d для дополнительной отладочной информации.

Вызов expect с участием: expect -df <filename>.expect в вашем сценарии bash для достижения того же эффекта, и вам не нужны исполняемые права для файла.

Информация об отладке очень полезно увидеть ваш expect операторы, переменные и т.д., например:

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:"

Вот короткий сценарий bash (только пример, но он полезен, если вам нужно делать более сложные вещи или просто вызывать его из bash почему-то)

#!/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

Здесь 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

Надеюсь, это поможет кому-то / кому-нибудь сэкономить время!

Использовать while цикл:

set fp [open "datfile"]
while {[gets $fp line] >= 0} {
  puts $line
  #sleep 3
  # but better to wait for the prompt
  expect #
}

ваш сценарий должен выглядеть так:

set passwd {your_login_password_here}
set en "enable"
#
spawn telnet $rtr
expect {
    timeout { puts " ###   $rtr  TIMEOUT   ###"
              exit
    } 
    "ername:" { send "$env(USER)\r"  
                expect {
                   {*ssword} { send "$passwd\r" }
                }
     }
}
expect {
   {*>}  { send "$en\r"
           expect {
              "ername:" { send "$env(USER)\r"
                         expect {
                             {*ssword} { send "$passwd\r" }
                         }
               }
               "*ssword" { send "$passwd\r" }
           }
   }
}
expect {
   "#"  { send "conf t\r" }
}
set load_cmd [open "open "/home/room.txt" r]
set cmd_list [split [read $load_cmd] "\n"]
close $load_cmd
expect {
        {#} { foreach command $cmd_list {
                if {$command != ""} {
                   send "$command\n"
                }
              } 
        } 
}
interact