$exp->Expect::spawn(....); $exp->send(cmd); $exp->expect($timeout ,'-re',$prompt);
如果命令的输出非常多时,Expect会一组一组的将返回结果读取到缓存中
每次读取2048个字节。
每次读取完就追加到缓存,然后用缓存的数据匹配
p
r
o
m
p
t
;
因
为
每
次
都
是
读
取
一
部
分
便
来
匹
配
,
那
么
就
会
出
现
c
m
d
的
输
出
没
有
读
完
,
但
是
prompt ; 因为每次都是读取一部分便来匹配,那么就会出现cmd的输出没有读完,但是
prompt;因为每次都是读取一部分便来匹配,那么就会出现cmd的输出没有读完,但是prompt却匹配上了,而结束expect。
看起来也很合理,但是如果我们的 $prompt 里面有’$'结尾符号时,这种匹配方式就会出问题。
如:$prompt = '[\$%#>]\s*$'
那么匹配到的就未必是我们想要的东西。
在Net::SSH::Expect里面也存在这个问题,因为SSH这个包底层就是调用的Expect.pm
解决方法:
连续发送两条命令,第二次发送一个静态的数据,(echo SSH_TEST_CMD) ,先等待“SSH_TEST_CMD’’,再等待$prompt