スイッチコマンドを自動化しようとしています。それはほぼすべて良好ですが、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
それで、古い議論ですが、ここ1日か2日にわたってexpect
と格闘し、ここや他の場所のユーザーからいくつかの役立つヒントを集めた後、見つけたものを投稿することにしました。私もMacではネイティブLinuxではありませんを使用しているため、いくつかの風変わりなことがありました。このスクリプトは、bash
スクリプトから次のように呼び出されます。
expect -d <filename>.expect
#!<PATH to expect> -f
が*.expect
ファイルの最上行に実装されている場合[〜#〜] and [〜#〜]あなた:
chmod +x <filename>.expect
これが機能するファイル。 -d
は、追加のデバッグ情報用です。
同じ効果を達成するには、bashスクリプトでexpect
をexpect -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
うまくいけば、これは誰か/誰でもそこに時間を節約するのに役立ちます!
while
ループを使用します。
set fp [open "datfile"]
while {[gets $fp line] >= 0} {
puts $line
#sleep 3
# but better to wait for the Prompt
expect #
}