Perl期望已执行命令的输出

Perl期望已执行命令的输出,perl,expect,Perl,Expect,我写了一个执行ls命令的小脚本。现在我想将该命令的输出存储在一个变量中,以便在进一步的perl脚本中使用它。不幸的是,我无法从ls命令获取输出 my ($core) = "servername"; my $tel_con = "ssh ".$core. " -l $user"; $ssh = Expect->spawn("$tel_con"); $ssh->log_stdout(1); unless ( $ssh->expect( 5, -r

我写了一个执行ls命令的小脚本。现在我想将该命令的输出存储在一个变量中,以便在进一步的perl脚本中使用它。不幸的是,我无法从ls命令获取输出

my ($core) = "servername";
    my $tel_con = "ssh ".$core. " -l $user";

    $ssh = Expect->spawn("$tel_con");
    $ssh->log_stdout(1);

    unless ( $ssh->expect( 5, -re => '$' ) ) {
            return "Never connected " . $ssh->exp_error() . "\n";
    }
    sleep 1;
    $ssh->send_slow(0, "ls -l\r");
    $ssh->clear_accum();
    my $str = $ssh->exp_after();
    print "STR = '$str'\n";

也许你能给我一些帮助吗?

你可以在一个单独的过程中调用expect,通过qx获取输出,或者打开一个管道

什么是发送慢?根据此命令发送ls命令的方式,可以以不同的方式接收输出


命令的错误输出很可能存储在$?变量,可能是字节移位。

Expect似乎会将所有内容重定向到STDOUT并在内部记录。由于您使用
$ssh->log_stdout(1)
启用了输出,因此您应该能够直接从
stdout
获取
ls-l
的结果(可能通过将标准输出重定向到变量)。您还可以看到try从内部日志中获取数据。只需确保在执行
清除\u accum()
之前获取输出即可

From:
$object->send_slow($delay,@strings)

。。。在每个字符之后,将检查$object以确定它是否有任何新数据准备就绪,如果有,则更新累加器以备将来expect()调用,并在适当设置log\u STDOUT和log\u group的情况下将输出打印到STDOUT和@listen\u group

外行术语

我必须强制性地发布这个链接——我仍然时不时地去那里,这是我所发现的所有regex中最普通的解释:


如果您不能或不想使用Net::OpenSSH,您可以执行以下操作:

my @output = $exp->expect(5);
print 'OUT: '.$output[3].'END';

要获得整个输出(包括使用的命令、返回字符串、控制台信息)

也许您可以给我一个简短的示例?示例:将expect代码复制到一个额外的文件ssh.pl中,然后执行my$ls_content=qx(ssh.pl$args);对不起,我真的是个新手。所以我用ls_content=qx(ssh.pl)调用上面发布的脚本?谢谢。你能给我一个小的代码示例吗?我尝试了以下方法:$telnet=Expect->spawn($tel_-con”)$telnet->debug(3)$telnet->exp_internal(1)$telnet->log\u stdout(0)$telnet->set_组($ret)$telnet->log_组(1)$telnet->expect(0);除非($telnet->expect(5,-re=>“$”){return“从未连接”。$telnet->exp_error()。“\n”}睡眠1$telnet->send_slow(0,“ls-l\r”);my$str=$telnet->before();打印“STR='$STR'\n”;打印“ret=$ret\n”;
my @output = $exp->expect(5);
print 'OUT: '.$output[3].'END';