2011-08-24 67 views
0

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

#!/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

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

我写了一个样例脚本,它生成一个expect'ed 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) } ]没有为我工作。

+0

嗨...感谢您的帮助,但可以请你解释一下,这是如何工作的,我的理解。具体来说,换档命令的目的是什么? – user496934

+0

恩,对不起。我使用它来获取脚本的第一个参数,所以用法是'perl script.pl/tmp'。有关更多信息,请参阅'perldoc -f shift',默认情况下它使用'@ ARGV'或'@ _'。 – Dallaylaen