web-dev-qa-db-ja.com

スクリプトが速すぎると予想します:ファイルから読み取った各行の間にスリープを追加します

スイッチコマンドを自動化しようとしています。それはほぼすべて良好ですが、expectスクリプトがスイッチコマンド(行ごとにリストされている)を含むファイルから各行を読み取るとき、スイッチは約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
2
2legit2quit

それで、古い議論ですが、ここ1日か2日にわたってexpectと格闘し、ここや他の場所のユーザーからいくつかの役立つヒントを集めた後、見つけたものを投稿することにしました。私もMacではネイティブLinuxではありませんを使用しているため、いくつかの風変わりなことがありました。このスクリプトは、bashスクリプトから次のように呼び出されます。

expect -d <filename>.expect

#!<PATH to expect> -f*.expectファイルの最上行に実装されている場合[〜#〜] and [〜#〜]あなた:

chmod +x <filename>.expectこれが機能するファイル。 -dは、追加のデバッグ情報用です。

同じ効果を達成するには、bashスクリプトでexpectexpect -df <filename>.expectとともに呼び出します。ファイルに対する実行権限は必要ありません。

デバッグ情報はveryで、次のように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

うまくいけば、これは誰か/誰でもそこに時間を節約するのに役立ちます!

2
eulerworks

whileループを使用します。

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