内容

名称

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

什么是 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" 的 Firewall 选项,或将 Net::Config 中的 ftp_firewall 选项设置为相同形式的字符串来解决此问题。

是否可以更改 FTP 服务器上文件的权限?

答案是“可能”。FTP 协议没有指定在远程主机上更改文件权限的命令。但是,许多服务器确实允许您通过 SITE 命令运行 chmod 命令。这可以通过以下方式完成

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

我看到脚本调用了 message 方法,但找不到它的文档?

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。保留所有权利。