1

我正在尝试使用 perl 和 expect 模块自动配置服务器。我已经使用expect模块三天了,但现在我遇到了一个我无法解决的问题。

我的问题是当我执行一个命令时,如果成功则不打印输出,但如果出现问题则打印错误消息。此类命令的一个示例是以下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通话后收到的文本相匹配?是否可以清除期望模块的缓冲区,或者是否可以通过其他方式实现这种错误检测?

我也想知道 expect 模块如何处理正则表达式。例如,如果我"^[$#]\$"用作正则表达式来匹配终端的提示,\$那么正则表达式的一部分会匹配行尾还是实际的美元符号?如果我删除\perl 抱怨。

提前致谢!

/哈索

编辑:我找到了解决方案:

解决方案是使用$com->clear_accum()清除蓄能器的方法。我之前尝试过使用它,但似乎这个功能只能随机工作,或者我不明白clear_accum()应该做什么。

编辑:关于clear_accum()

clear_accum()函数似乎随机工作的原因是因为从前一个生成的文本在调用之前send不会读入累加器。expect()所以要想真正清空之前的所有数据,就是先执行一次expect()调用,然后清空累加器:

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

1 回答 1

0
akarageo@Pal4op:~> cd banana
bash: cd: banana: No such file or directory
akarageo@Pal4op:~:( > echo $?
1

即检查CD 返回的错误代码,0表示OK ,其他都是错误,不需要检查提示,顺便说一句,CD命令不会生成shell的提示,所以这也一定是你混淆的一部分。

如果有任何帮助,请尝试 $object->exitstatus()

于 2013-07-12T10:03:04.293 回答