我对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()准备?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所以我想我可能安装了一个更新版本的模块?不确定。
有人看到我哪里出错了吗?
发布于 2022-08-24 16:18:19
\&givePd生成对子givePd的引用。这将传递给expect,让它在从子程序接收到某些字符串时调用givePd。但是就像消息说的,就像你在回答中所说的,你从来没有定义过givePd。( closeExp.)所以很明显它会失败。
https://stackoverflow.com/questions/73476480
复制相似问题