请教perl expect模块中关于$timeout的问题

请教perl expect模块中关于$timeout的问题

我用perl expect模块编写了一个从BRAS设备上提取在线用户数的程序,对于在线用户数不多的BRAS设备,程序没有问题;而对于超过1万在线用户数的BRAS提取时,则中途自动退出了,不知道是什么原因。
报错如下:
     Timed out waiting for an EOF from spawn id(6).
spawn id(6) closed.
Pid 29452 of spawn id(6) exited, Status: 0x01
Closing spawn id(6).
at /usr/local/lib/perl5/site_perl/5.8.5/Expect.pm line 1415
        Expect::hard_close('Expect=GLOB(0x339200)') called at /usr/local/lib/perl5/site_perl/5.8.5/Expect.pm line 1605
        Expect:ESTROY('Expect=GLOB(0x339200)') called at ./zlj.pl line 72
        eval {...} called at ./zlj.pl line 72
Closing .
at /usr/local/lib/perl5/site_perl/5.8.5/Expect.pm line 1415
        Expect::hard_close('Expect=GLOB(0x2b091') called at /usr/local/lib/perl5/site_perl/5.8.5/Expect.pm line 1605
        Expect:ESTROY('Expect=GLOB(0x2b091') called at /usr/local/lib/perl5/site_perl/5.8.5/Expect.pm line 0
        eval {...} called at /usr/local/lib/perl5/site_perl/5.8.5/Expect.pm line 0
closed.
#
根据上面的报错信息,我理解是这样的:
由于time out时间到了,所以自动退出。我的程序中相关部分如下:
     $exp->expect(100,          100为我设置的timeout时间,但是在这里好像没有起作用
            [qr/gin/=>sub {
                               sleep(1);
                               $exp->send("test\n";
                               exp_continue;
                          }],
            [qr/assword/=>sub {
                                sleep(1);
                                $exp->send("test\n";
                                sleep(1);
                                $exp->expect(">";
                                $exp->send("en\n";
                                sleep(1);
                                $exp->expect(":";
                                $exp->send("test2\n";
                                exp_continue;
                               }],
            [qr/#/=>sub {
                               $exp->send("terminal length 0\n";
                                sleep(2);
                                $exp->send("show pppoe\n";
                                sleep(100);        我设置了休息100秒,给上面的命令show pppoe留出足够的时间来将1万多的在线用户显示完,但是程序实际运行不到100秒就出现了上面的错误,然后退出了。
                                $exp->send("terminal length 47\n";
                                sleep(2);
                                 $exp->send("exit\n";sleep(1);
                        $exp->send("exit\n");sleep(1);
                        }]
         );

请高手赐教,谢谢!
将sleep(100)改成expect方式看看
我将sleep(100)改成$exp->expect("#");
还是不成功
我将程序改成普通的expect匹配方式,即:
$exp->expect("gin");

                               $exp->send("test\n");
    $exp->expect("assword");
                                $exp->send("test\n");
                                sleep(1);
                        $exp->expect(">");
                                $exp->send("en\n");
                                sleep(1);
                        $exp->expect(":");
                                $exp->send("test2\n");
                        $exp->expect("#");
                        $exp->send("terminal length 0\n");
                        $exp->expect("#");
                        $exp->send("show pppoe\n");
                                $exp->expect("#");
                        $exp->send("terminal length 47\n");
                                sleep(2);

结果程序连第一次的"gin"都不能匹配到,执行了几次都是不能匹配,这里出现了我以前避开的一个问题:
我以前编写自动登陆的程序时,如果直接用普通的expect 方式,就会匹配不到,而如果按照$exp->expect(100,
            [qr/gin/=>sub {
                               sleep(1);
                               $exp->send("test\n");
                               exp_continue;
                          }],
这样的匹配方式就可以匹配到,以前一直没管它,我觉得现在又面临了这个问题。可能实际上,就是普通的expect匹配方式一直写的不对,所以请赐教。
精确匹配显然不能匹配到, 将expect方式全改用正则匹配.

贴一段成功的交互应答看看

打开exp_internal看看...
应该可以看到为什麽结束..

另外不要用sleep....
除非你碰到command下下去後, 提示符马上跳出来...但是command 的输出..还要等一下..
这时才用sleep等待...