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 通用公共许可证或艺术许可证的条款,如 LICENCE 文件中所述。
Steve Hay <[email protected]> 从 1.22_02 版本开始维护 libnet。
本信息以诚意提供,并希望它可能有用,但不能保证其正确性、最新性或适合任何特定目的。作者对本信息或其使用不承担任何责任。
libnet 是一个 perl5 模块集合,它们都与网络编程相关。大多数可用的模块提供了互联网社区中使用的流行服务器-客户端协议的客户端。
此版本的 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 本身是一个完全用 perl 代码编写的发行版,因此它应该可以在任何运行 perl 的机器上运行。
最新的 libnet 版本始终在 CPAN 上,您可以在以下位置找到它
https://metacpan.org/release/libnet
一个来自 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 服务器可能允许通过 SITE 命令发出 chmod 命令,例如
$ftp->quot('site chmod 0777',$filename);
但这不能保证有效。
将 "" 作为参数传递给 ->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.
防火墙选项仅用于支持一种类型的防火墙。支持的类型是 ftp 代理。
要通过 SOCKS 防火墙使用 Net::FTP 或 libnet 发行版中的任何其他模块,您必须通过使用 socks 库编译 perl 来创建一个 socks 化的 perl 可执行文件。
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 服务器通常监听与任何其他 FTP 服务器相同的端口号,即端口 21。但没有理由必须如此。
如果您将端口号传递给 Net::FTP,则它假定这是最终目标的端口号。默认情况下,Net::FTP 将始终尝试连接到端口 21 上的防火墙。
Net::FTP 使用 IO::Socket 打开连接,而 IO::Socket 允许将端口号指定为主机名的一部分。因此,可以通过传递类似 "hostname:1234"
的 Firewall 选项,或将 Net::Config 中的 ftp_firewall
选项设置为相同形式的字符串来解决此问题。
答案是“可能”。FTP 协议没有指定在远程主机上更改文件权限的命令。但是,许多服务器确实允许您通过 SITE
命令运行 chmod 命令。这可以通过以下方式完成
$ftp->site('chmod','0775',$file);
Net::FTP 与 libnet 中的几个其他包一样,继承自 Net::Cmd,因此 Net::Cmd 中描述的所有方法也适用于 Net::FTP 对象。
简短的答案是,因为它们很容易自己实现。长答案是,为了以支持多个平台的方式编写这些方法,需要太多代码。以下是一些关于如何自己实现这些方法的示例。
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; } }
电子邮件地址中 @ 符号后的部分不一定是主机名,它是一个邮件域名。要查找邮件域名的连接主机名称,需要进行 DNS MX 查询。
Net::SMTP 实现 SMTP 协议。DNS MX 查询不属于此协议的一部分。
看起来似乎是这样,但实际上并非如此。verify 方法在命令成功时返回 true。如果传递给 verify 的地址是服务器通常需要转发到另一台机器的地址,则命令将成功,并返回类似以下内容:
252 Couldn't verify <someone@there> but will attempt delivery anyway
只有当传递给它的地址属于服务器直接交付的域名,并且该地址不存在时,此命令才会失败。
大多数 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 使用的模块及其版本,当用户报告错误时,这些数据对我有用。最后七行显示了与服务器的通信。每行都有三个部分。第一部分是对象本身,这对于在使用多个对象时分离输出很有用。第二部分是 <<<<
用于显示来自服务器的数据,或者 >>>>
用于显示发送到服务器的数据。行的其余部分是正在发送的命令或接收到的响应。
版权所有 (C) 1997-1998 Graham Barr。保留所有权利。