我對 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
所以我想我可能安裝了更新版本的模塊?沒有把握。
有人看到我哪里出錯了嗎?
uj5u.com熱心網友回復:
\&givePd產生對 sub 的參考givePd。當從子程式接收到某些字串時,它被傳遞給expect它以告訴它呼叫。givePd但就像訊息說的那樣,就像你在回答中說的那樣,你從來沒有定義givePd. (同樣的closeExp。)所以它顯然會失敗。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/504246.html
