2013-07-12 33 views
1

我想使用perl和expect模塊自動配置服務器。我一直在使用期望模塊三天,但現在我遇到了一個我無法解決的問題。檢測一個命令的錯誤,如果命令成功使用Perl和期望,什麼都不輸出

我的問題是,當我執行一個命令,如果它成功打印沒有輸出,但打印出錯信息,如果出現問題。這樣的命令的一個例子是cd命令:

$ cd . 
$ 
$ cd sadjksajdlaskd 
sadjksajdlaskd: No such file or directory. 
$ 

我想要做的就是將命令發送到服務器,然後執行expect調用,以檢查是否印比,提示符號以外的東西。事情是這樣的:

$com->send("cd $dir"); 
$com->expect(2, 
     ["^[^$#]*", sub { 
       my $self = shift; 
       my $error = $self->match(); 
       die "ERROR: $error"; 
     }], 
     "-re", "^[$#]" 
); 

我的問題是,當我執行expect調用它會匹配對所有以前的文本,而不是針對send通話後收到的文字,所以它總是會匹配並報告錯誤。我如何預期只匹配send呼叫後收到的文本?是否可以清除預期模塊的緩衝區,或者是否可以通過其他方式實現這種錯誤檢測?

我也想知道期望模塊如何處理正則表達式。例如,如果我使用"^[$#]\$"作爲正則表達式來匹配終端的提示,那麼正則表達式的\$部分是否與行尾或實際美元符號匹配?如果我刪除了perl的\抱怨。

在此先感謝!

/Haso

編輯:我已經找到了解決:

的解決方案是使用$com->clear_accum()從而清除accumelator。我曾嘗試過使用它,但它似乎只能隨機使用,或者我不明白clear_accum()應該做什麼。

編輯:最後請注意有關clear_accum()

clear_accum()功能似乎隨意工作的原因是因爲直到expect()調用時從以前send生成的文本沒有被讀入accumelator。所以,要想真正清除所有以前的數據是先執行expect()呼叫,然後清除accumelator:

#To clear all previous data 
$com->expect(0); 
$com->clear_accum(); 

回答

0
[email protected]:~> cd banana 
bash: cd: banana: No such file or directory 
[email protected]:~:(> echo $? 
1 

即檢查錯誤代碼CD回報,0表示OK其他的東西都是錯誤的,不需要檢查提示符,順便說一下,CD命令不會生成shell所做的提示,所以這也一定是你的困惑的一部分。

嘗試$對象 - >退出狀態(),如果它是有幫助

+0

你好,謝謝你的建議,遺憾的是服務器沒有慶典。 – Hasofanten

+0

它包含某種外殼,否則「exec(cd)」不應該起作用。幾乎所有的Shell都可以返回最後一個錯誤代碼。在Unix系統中全部支持$? ,在Windows中,我不太確定,可能getLastErrorCode或這樣的。此外請注意,期望是用TCL編寫的,您可以從中完成TCL原語! –