2011-08-24 64 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