perl Expect.pm:expect()给出“意外子例程”错误

zpgglvta  于 2022-11-15  发布在  Perl
关注(0)|答案(1)|浏览(106)

我对Perl还是个新手,正在为一些事情而挣扎。最近,另一个开发人员离开了我的公司,我的老板让我修复一个Perl脚本,这个脚本是我以前的同事写的,但没有记录下来。这个脚本在过去运行得很好。我基本上理解了他的代码,但是调用Expect.pm:expect()让我感到困惑。
这个脚本的目的是从远程服务器上scp一个文件。

#!/usr/bin/env perl

# Lots of use statements here, including:
use Expect;

# We set a lot of variables here...

# We use expect->spawn() to spawn an scp session into the remote machine
my $scp_exp = Expect->spawn("scp", "$account\@$remoteIP:$dir/$file", "$local_dir/");

# We set the parity
$scp_exp->raw_pty(1);

# We call expect() for the SCP session
$scp_exp->expect($timeout, [qr/.*[pP]assword:/, \&givePd, $pd],
        [qr/.*[pP]assword: /, \&givePd, $pd],
        [qr/100%/, \&closeExp],
        [qr/No such file or directory/, sub{exp_continue}],
        [qr/$prompt/, \&closeExp]);

大部分内容我都理解,但最后一行($scp_exp->expect())让我完全摸不着头脑。我假设当脚本scp发送到远程机器时,我们必须给予expect()一个超时,然后为远程机器可能给出的所有输出准备expect()man page for expect()讨论了@matched_patterns数组,但我没有完全理解这一讨论。
当脚本运行时,我得到的输出字符串如下:

Password: Undefined subroutine &main::givePd called at /usr/share/perl5/Expect.pm line 759.

我假设我的脚本执行得很好,但是当expect()在远程机器上发出命令时,“givePd”字符串使远程主机感到困惑,因此expect()抛出一个错误,一切都崩溃停止。
顺便说一句,对字符串“givePd”的唯一引用在上面的代码摘录中显示。所以这不是一个变量或不正确设置的东西。
还有一件事我应该提一下。我正在一台新的Ubuntu机器上运行我同事的脚本,这台机器以前从未成功运行过这个脚本。事实上,当我第一次运行这个脚本时,我意识到我需要使用apt-get install来安装Expect.pm模块:

sudo apt-get install -y libexpect-perl

所以我想有可能我安装了一个更新版本的模块?不确定。
有人知道我哪里错了吗?

nkcskrwz

nkcskrwz1#

\&givePd产生了一个对subgivePd的引用。这个引用被传递给expect,告诉它在从子程序接收到特定字符串时调用givePd。但是就像消息中说的,就像你在答案中说的,你从来没有定义过givePd。(closeExp也是如此。)所以它显然会失败。

相关问题