我有一个非常小的期望脚本。流程如下
ssh
到远程计算机Enter cmd>
。Enter cmd>
提示符下,我需要运行许多命令因此我设计了这个脚本
#!/usr/bin/expect
set FULL_CMD { #cmd1 #cmd2 #cmd3 }
puts "STARTING......."
log_file myfile.log ;# <<< === append output to a file
spawn ssh tempuser\@dummyserver
match_max 100000000
expect "password:"
send "temppasswd\r"
expect "*temp*"
send "cd \/home\r"
expect "*temp*"
send "new cmd prompt\r"
expect "Enter cmd>"
foreach tempcmd $FULL_CMD {
send "${tempcmd} \r "
expect -exact "Enter cmd>\r"
send -- "\r"
expect eof }
send "q"
send "exit\r"
puts "I HAVE ENDED......."
我的问题:实际上第一个命令cmd#1
的O / P很长,我可以看到期望脚本没有等待第一个命令完成的O / P并在一段时间后发送第二个命令cmd#2
。
此脚本在cmd#1
的O / P很小的系统上运行良好,但在cmd#1
的O / P非常大(比如1000000行)的系统上,它有问题,即它发出第一个命令cmd#1
,然后是O / P,但在它返回Enter cmd>
提示符之前,脚本发出第二个命令cmd#2
如何确保仅在cmd#2
的输出完成后才发送命令cmd#1
?
答案 0 :(得分:5)
尝试在开始时设置超时:
set timeout 60
或使用-1
永远等待。
答案 1 :(得分:0)
为什么你的for循环中有“期望eof”?
foreach tempcmd $FULL_CMD {
send "$tempcmd\r"
expect "Enter cmd>"
send -- "\r" # why do you need this?
}
在开发程序时,启用调试很聪明:将其添加到顶部附近:exp_internal 1
答案 2 :(得分:0)
问题在于你的foreach tempcmd $FULL_CMD
循环:
foreach tempcmd $FULL_CMD {
send "${tempcmd} \r "
expect -exact "Enter cmd>\r"
send -- "\r"
expect eof }
问题在于您expect
"Enter cmd>\r"
\r
,但您的输出中永远不会得到expect
。
"Enter cmd>$"
$
应该是什么or '\r' or
意味着当前命令输出的结束(而不是&#39; \ n foreach tempcmd $FULL_CMD {
send "${tempcmd} \r "
expect -exact "Enter cmd>$" # Check for spaces after '>' and fix as required
send -- "\r"
# expect eof
}
eof`)
expect eof
对于{{1}},它匹配连接到生成进程输出的输入流的末尾。它只会在生成的进程终止后匹配,因此在这里没用[/ p>