请教perl expect 和cgi的交互问题

请教perl expect 和cgi的交互问题

我写了一个通过cgi执行expect脚本的程序,在页面上通过填写所需内容后,提交给cgi程序执行,cgi程序也获得了所提交的变量,
接着我通过expect脚本调用这些变量,但是expect脚本没有执行,请问是怎么回事?
如果在后台直接手工执行expect脚本,是没有问题的,好像通过页面来调用expect出现问题。
cgi程序如下:
read(STDIN,$buffer,$ENV{'CONTENT_LENGTH'});
@pairs=split(/&/,$buffer);
foreach $pair (@pairs){
($name,$value)=split(/=/,$pair);
$value=~tr/+//;
$value=~s/%([a-fA-F0-9][a-fA-F0-9])/pack("C",hex($1))/eg;
$form{$name}=$value;
}

foreach $key(keys %form)
{
if ($key eq "mac_zhi") { $mac=$form{$key}};
if ($key eq "ip_zhi") { $dslam_ip=$form{$key}};
if ($key eq "DSLAM_type") { $dslam_type=$form{$key}};
}
print "$mac   $dslam_ip  $dslam_type<br>";
if ($dslam_type =~ "华为5100") {print "huawei\n";system("/home1/zmr/test/ma5100.pl $mac $dslam_ip &")}

expect程序如下:
#!/usr/local/bin/perl
require ("/usr/local/lib/perl5/site_perl/5.10.0/Expect.pm");
print "Content-type:text/html\n\n";

use Expect;
my $exp = new Expect;
sleep(1);
$exp->raw_pty(1);
$exp->exp_internal(1);
$exp->log_stdout(0);
$exp->debug(3);

$mac=$ARGV[0];
$dslam_ip=$ARGV[1];
my $exp = Expect->spawn("telnet $dslam_ip");
              $exp->debug(3);
              $exp->log_stdout(1);
              $exp->restart_timeout_upon_receive(1);
$exp->log_file("/home1/zmr/test/cgi-bin/ma5100-dslam.txt");
$exp->restart_timeout_upon_receive(1);
$exp->expect(30,
            [qr/User name/=>sub {
                                                 sleep(1);
                                                 $exp->send("root\n");
                                                 sleep(1);
..........................
好像expect没有执行telnet,也没有产生ma5100-dslam.txt,请教问题在哪里?谢谢
那你就一句句调试
看究竟卡在哪一句上了
如果在后台手工执行expect程序,可以进行打印字符和telnet动作,但是通过cgi传输变量后,则只能打印字符,不能telnet,也没有看到报错
上面的问题已经解决!
原因为:我将expect脚本的权限设置为777后,就可以了,如果是755也不行,呵呵,奇怪。

现在可以执行了,但是expect脚本执行的过程都在页面里一步一步显示出来,请问:如何屏蔽掉显示呢?

use Expect;
my $exp = new Expect;
sleep(1);
$exp->raw_pty(1);
$exp->exp_internal(0);
$exp->log_stdout(0);
$exp->debug(3);

上面的这些配置,是否需要修改,谢谢。
上面的问题也解决了!
将expect的程序输出到一个临时文件中,这样页面上就不会显示expect的每步操作内容了,呵呵。
如何将内容输入到临时文件呢? 需要如何设置? 能详细点吗?
是否使用Expect,可以代替Telnet和SSH模块?

听说Expect功能是最强的,不知道是不是这样?