目錄

名稱

libnetFAQ - libnet 常見問題

描述

取得此文件

此文件與 libnet 發行版一同發行,也可在 libnet 網頁上取得

https://metacpan.org/release/libnet

如何為此文件做出貢獻

您可以在 CPAN 要求追蹤器回報更正、新增及建議

https://rt.cpan.org/Public/Bug/Report.html?Queue=libnet

作者及著作權資訊

著作權 (C) 1997-1998 Graham Barr。保留所有權利。此文件為免費文件;您可以根據 Perl 本身的條款重新發行或修改,亦即根據 GNU 通用公共授權條款或 Artistic 授權條款,如 LICENCE 檔案中所述。

Steve Hay <shay@cpan.org> 自 1.22_02 版開始維護 libnet。

免責聲明

此資訊提供時秉持善意,並希望對您有所幫助,但無法保證其正確性、最新性,或適用於任何特定目的。作者不承擔與此資訊或其使用相關的任何責任。

取得及安裝 libnet

什麼是 libnet?

libnet 是 perl5 模組的集合,全部與網路程式設計相關。大多數可用的模組提供網際網路社群中使用的熱門伺服器端客戶端協定的客戶端。

我需要哪個版本的 perl?

此版本的 libnet 需要 Perl 5.8.1 或更新版本。

我需要哪些其他模組?

正常使用時不需要非核心模組,除了 os390,它需要 Convert::EBCDIC。

AUTH 支援需要 Authen::SASL。

SSL 支援需要 IO::Socket::SSL 版本 2.007 或更新版本。

IPv6 支援需要 IO::Socket::IP 版本 0.25 或 IO::Socket::INET6 版本 2.62。

libnet 支援哪些機器?

libnet 本身是一個完全由 Perl 程式碼組成的套件,因此它應該可以在任何執行 Perl 的機器上執行。

哪裡可以取得最新的 libnet 發行版本

最新的 libnet 發行版本總是會在 CPAN 上,您可以在下列位置找到它

https://metacpan.org/release/libnet

使用 Net::FTP

如何從 FTP 伺服器下載檔案?

摘自張貼在 comp.lang.perl.misc 的一篇文章範例

#!/your/path/to/perl

# a module making life easier

use Net::FTP;

# for debugging: $ftp = Net::FTP->new('site','Debug',10);
# open a connection and log in!

$ftp = Net::FTP->new('target_site.somewhere.xxx');
$ftp->login('username','password');

# set transfer mode to binary

$ftp->binary();

# change the directory on the ftp site

$ftp->cwd('/some/path/to/somewhere/');

foreach $name ('file1', 'file2', 'file3') {

# get's arguments are in the following order:
# ftp server's filename
# filename to save the transfer to on the local machine
# can be simply used as get($name) if you want the same name

  $ftp->get($name,$name);
}

# ftp done!

$ftp->quit;

如何以二進位模式傳輸檔案?

若要傳輸檔案而不進行 <LF><CR> 轉譯,Net::FTP 提供了 binary 方法

$ftp->binary;

如何取得遠端 FTP 伺服器上檔案的大小?

如何取得遠端 FTP 伺服器上檔案的修改時間?

如何變更遠端伺服器上檔案的權限?

FTP 協定沒有用於變更遠端伺服器上檔案權限的指令。但是,有些 ftp 伺服器可能允許透過 SITE 指令發出 chmod 指令,例如

$ftp->quot('site chmod 0777',$filename);

不過,這並不保證一定會成功。

我可以執行類似 ftp 指令的 reget 操作嗎?

如何從 FTP 伺服器取得目錄清單?

變更目錄為「」不會失敗?

傳遞參數「」給 ->cwd() 會產生與在沒有任何參數的情況下呼叫 ->cwd() 相同的效果。開啟偵錯(請參閱下方),您將會看到發生了什麼事

$ftp = Net::FTP->new($host, Debug => 1);
$ftp->login;
$ftp->cwd("");

會產生

Net::FTP=GLOB(0x82196d8)>>> CWD /
Net::FTP=GLOB(0x82196d8)<<< 250 CWD command successful.

我位於 SOCKS 防火牆之後,但防火牆選項無法運作?

防火牆選項僅支援一種防火牆類型。支援的類型為 ftp 代理程式。

若要透過 SOCKS 防火牆使用 Net::FTP 或 libnet 發行版中的其他模組,您必須使用 socks 函式庫編譯 perl,以建立一個 socks 化的 perl 可執行檔。

我位於 FTP 代理程式防火牆之後,但無法存取外部機器?

Net::FTP 實作最普遍的 ftp 代理程式防火牆方法。實作的架構是您使用 user@hostname 登入防火牆

我聽過另一種防火牆類型,它需要使用帳戶登入防火牆,然後再使用 user@hostname 進行第二次登入。您仍然可以使用 Net::FTP 穿越這些防火牆,但必須採取更手動的方法,例如

$ftp = Net::FTP->new($firewall) or die $@;
$ftp->login($firewall_user, $firewall_passwd) or die $ftp->message;
$ftp->login($ext_user . '@' . $ext_host, $ext_passwd) or die $ftp->message.

我的 ftp 代理程式防火牆未在連接埠 21 上偵聽

FTP 伺服器通常在與其他 FTP 伺服器相同的連接埠號碼 (連接埠 21) 上偵聽。但沒有理由一定要這樣做。

如果您傳遞一個連接埠號碼給 Net::FTP,它會假設這是最終目的地的連接埠號碼。預設情況下,Net::FTP 會始終嘗試在連接埠 21 上連線到防火牆。

Net::FTP 使用 IO::Socket 開啟連線,而 IO::Socket 允許將連接埠號碼指定為主機名稱的一部分。因此,這個問題可以透過傳遞類似 "hostname:1234" 的防火牆選項,或將 Net::Config 中的 ftp_firewall 選項設定為相同格式的字串來解決。

是否可以變更 FTP 伺服器上檔案的檔案權限?

答案是「也許」。FTP 協定未指定用於變更遠端主機上檔案權限的指令。然而,許多伺服器確實允許您透過 SITE 指令執行 chmod 指令。這可以使用以下方式執行

$ftp->site('chmod','0775',$file);

我看到腳本呼叫方法訊息,但找不到文件說明?

Net::FTP 與 libnet 中的其他幾個套件一樣,繼承自 Net::Cmd,因此 Net::Cmd 中描述的所有方法在 Net::FTP 物件中也可用。

Net::FTP 為什麼不實作 mput 和 mget 方法

簡短的回答是,因為它們很容易自己實作。長篇的回答是,要以支援多個平台正確的方式撰寫這些方法,所需的程式碼實在太多。以下是一些如何自己實作這些方法的範例。

sub mput { my($ftp,$pattern) = @_; foreach my $file (glob($pattern)) { $ftp->put($file) or warn $ftp->message; } }

sub mget { my($ftp,$pattern) = @_; foreach my $file ($ftp->ls($pattern)) { $ftp->get($file) or warn $ftp->message; } }

使用 Net::SMTP

電子郵件地址中 @ 之後的字元為何不能用作主機名稱?

電子郵件地址中 @ 之後的字元不一定是主機名稱,而是郵件網域。若要找出郵件網域的主機名稱,您需要進行 DNS MX 查詢

Net::SMTP 為什麼不執行 DNS MX 查詢?

Net::SMTP 實作 SMTP 協定。DNS MX 查詢不屬於此協定的一部分。

verify 方法總是傳回 true?

嗯,它可能看起來是這樣,但事實並非如此。如果命令成功,verify 方法會傳回 true。如果您傳遞 verify 一個伺服器通常必須轉送至另一台電腦的地址,則該命令會成功,類似於

252 Couldn't verify <someone@there> but will attempt delivery anyway

只有當您傳遞一個伺服器直接傳遞的網域中的地址,且該地址不存在時,此命令才會失敗。

除錯腳本

如何除錯使用 Net::* 模組的腳本?

大多數 libnet 用戶端類別允許將選項傳遞給建構函式,在多數情況下,其中一個選項稱為 Debug。傳遞此選項並指定非零值將開啟協定追蹤,並將其傳送至 STDERR。此追蹤有助於查看傳送至遠端伺服器和接收回來的回應的命令。

#!/your/path/to/perl

use Net::FTP;

my $ftp = new Net::FTP($host, Debug => 1);
$ftp->login('gbarr','password');
$ftp->quit;

這個腳本會輸出類似

Net::FTP: Net::FTP(2.22)
Net::FTP:   Exporter
Net::FTP:   Net::Cmd(2.0801)
Net::FTP:   IO::Socket::INET
Net::FTP:     IO::Socket(1.1603)
Net::FTP:       IO::Handle(1.1504)

Net::FTP=GLOB(0x8152974)<<< 220 imagine FTP server (Version wu-2.4(5) Tue Jul 29 11:17:18 CDT 1997) ready.
Net::FTP=GLOB(0x8152974)>>> user gbarr
Net::FTP=GLOB(0x8152974)<<< 331 Password required for gbarr.
Net::FTP=GLOB(0x8152974)>>> PASS ....
Net::FTP=GLOB(0x8152974)<<< 230 User gbarr logged in.  Access restrictions apply.
Net::FTP=GLOB(0x8152974)>>> QUIT
Net::FTP=GLOB(0x8152974)<<< 221 Goodbye.

前幾行告訴你 Net::FTP 使用的模組及其版本,當使用者回報錯誤時,這對我來說是有用的資料。最後七行顯示與伺服器的通訊。每一行有三個部分。第一部分是物件本身,如果你使用多個物件,這有助於區分輸出。第二部分是 <<<< 來顯示來自伺服器的資料,或 &gt&gt&gt&gt 來顯示傳送至伺服器的資料。該行的其餘部分是傳送的指令或接收到的回應。

作者和版權

版權所有 (C) 1997-1998 Graham Barr。保留所有權利。