Perl期望执行命令的输出

时间:2011-10-24 14:35:34

标签: 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, -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";

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

6 个答案:

答案 0 :(得分:2)

use Net::OpenSSH;

my $ssh = Net::OpenSSH->new($core, user => $user);
$ssh->error and die $ssh->error;

my $output = $ssh->capture('ls -l');

print "command output:\n$output\n\n";

答案 1 :(得分:1)

如果您不能或不想使用Net :: OpenSSH,您可以这样做:

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

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

答案 2 :(得分:0)

您可以在单独的流程中调用expect并通过qx获取输出或打开管道

答案 3 :(得分:0)

什么是send_slow?根据此命令如何发送ls命令,可以以不同方式接收输出。

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

答案 4 :(得分:0)

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

来自CPAN$object->send_slow($delay, @strings);

  
    

...在每个字符$对象之后,将检查它是否准备好任何新数据,如果是,请更新累加器以供将来的expect()调用,并将输出打印到STDOUT和@listen_group,如果log_stdout和log_group适当设置。

  

答案 5 :(得分:0)

Layman的条款?

我必须强制性地发布这个链接 - 我仍然不时地去那里,这是我所见过的所有正则表达式中最常见的解释:

http://www.anaesthetist.com/mnm/perl/Findex.htm