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";
也许你能给我一些帮助吗?
答案 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的条款?
我必须强制性地发布这个链接 - 我仍然不时地去那里,这是我所见过的所有正则表达式中最常见的解释: