期待perl的问题

时间:2011-08-24 10:19:46

标签: perl expect

我是期待perl编程的新手,必须编写一些脚本来自动执行某些任务。基本上我需要telnet到unix机器,发出一些unix命令并检查一些输出。 我已经写了一个小脚本来telnet,但我对如何检查unix命令的状态有疑问。

#!/usr/bin/perl
use Expect;
$timeout=10;
my $exp = Expect->spawn("telnet test-b -l regress")
    or die "Cannot spawn telnet: $!\n";;
my $spawn_ok;

$foo1=$exp->expect($timeout, 'Password:');
print "######Received Password prompt\n";

$exp->send("MaRtInI\n");
print "######Sent password\n";

$foo1=$exp->expect($timeout, '%');
print "######Received root prompt\n";
$exp->send("cd /var/tmp");

我怀疑如何检查cd命令是否真的成功,因为如果我给cd /var/tmp(它不存在),我会看到相同的结果,而不是cd /var/temp12。如何检查我通过cd发送的unix命令是否实际成功?

1 个答案:

答案 0 :(得分:1)

使用echo $?查找服务器端的最后一个命令退出状态 ,然后通过qr/^\d+/m处理它(m表示“从字符串或换行符开始” )。

我编写了一个示例脚本,它确实生成了一个期望的shell并尝试将chdir作为参数给出的路径,例如: perl myscript.pl /tmpperl myscript.pl /noexist

#!/usr/bin/perl -w
use strict;

use Expect;

my $exp = Expect->spawn("/bin/bash")
    or die;

$exp->send ("cd ".(shift)."; echo \$?\n");
$exp->expect(2, # hardcoded timeout
    [ qr/^0/m => sub { print "chd\n" } ], # regex => sub
    [qr/^[1-9]/m => sub {print "no chd\n"}] 
);

P.S。我想知道如何从Except中获取(捕获)(来自)(我的正则表达式)。 [ qr/(\d+)/, sub { ...($1) } ]对我不起作用。