我想使用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();
你好,謝謝你的建議,遺憾的是服務器沒有慶典。 – Hasofanten
它包含某種外殼,否則「exec(cd)」不應該起作用。幾乎所有的Shell都可以返回最後一個錯誤代碼。在Unix系統中全部支持$? ,在Windows中,我不太確定,可能getLastErrorCode或這樣的。此外請注意,期望是用TCL編寫的,您可以從中完成TCL原語! –