NcFTP 既可以作为 FTP 服务器,也可以作为 FTP 客户端。但是,这两者都称为 NcFTP。在本文中,我只使用 NcFTP 客户端。因此,在我提到 NcFTP 时只是指 NcFTP 客户端。另外,客户端附带各种命令行实用程序,这让客户端非常便于在命令行上或以批处理模式使用。
NcFTP 实用程序让系统管理员能够利用 FTP 的灵活性和性能。NcFTP 可以与当前的默认 AIX® FTP 服务一起使用,目前没有发现任何问题。NcFTP 能够继续失败的传输和重新尝试,在通过有网络瓶颈的网络传输大型文件时这非常有用。NcFTP 可以输出状态行(与 SCP 很相似),显示传输的进度。但是,NcFTP 不支持任何加密,这对于某些环境可能是问题。
非常常见的安装形式是运行当前的 AIX FTP 服务器,使用 NcFTP 作为客户端。本文主要关注这种安装类型。
NcFTP 客户端附带以下实用程序:
ncftp | 主 FTP 界面 |
ncftpget | FTP get 命令行 |
ncftpput | FTP put 命令行 |
ncftpbatch | 批命令行 |
ncftpspooler | FTP 的 Spooler |
ncftpls | 远程执行 ls 命令 |
注意: 在本文中,不讨论 ncftpspooler 实用程序。
可以从 NcFTP 主页下载 NcFTP(见 参 考资料 中的链接)。
下载客户端之后,解压二进制文件,见清单 1:
# gunzip /tmp/ncftp-3.2.3-aix5.3.0-export.tar.gz |
确认 NcFTP 已经启动,如清单 2 所示。
$ ncftp -v |
根据访问的远程 FTP 主机类型不同,可能必须在主机名前面加上 ftp://,比如:
ftp://<hostname> |
注意: 对于 ncftpls 实用程序,在连接远程主机时,必须使用前面的格式。
如果遇到了 FTP 连接问题,那么按以下列表尝试排除故障:
确认可以使用 NcFTP 连接所选的远程服务器。在清单 3 中,我使用用户名 dxtans 和密码 master 连接私有主机 tardis。
$ ncftp -u dxtans -p master tardis |
如果一切正常,下面我们就可以开始探究 NcFTP 了。
清单 4 演示如何在常见的 FTP 会话中使用 NcFTP。使用 cd
命令进入本地系统的 /tmp,然后进入远程系统的 /ftproot/stats 目录。
执行两个 ls
命令,然后执行 get
命令以获取远程文件 stat_09.txt。这与普通的 FTP 会话非常相似,但是有一些额外的特点。
|
在最初调用 NcFTP 时,它在您的主目录中创建一个 .ncftp 目录。可以在这里设置 NcFTP 会话,包括任何代理设置。经常修改的文件是 prefs_v3 文件。prefs_v3 文件的含义很明了,不需要解释。查看这个文件之后,可以根据自己的 FTP 会话编辑它。每个条目都采用以下格式:
key=value |
例如,可以使用以下代码设置连接超时:
connect-timeout=20 |
还可以使用 set
命令在 NcFTP 命令行上设置首选项:
ncftp/> set connect-time 20 |
可以把常用的 FTP 目标保存为书签,见清单 5。
仔细看看清单 5,会看到建立了到远程主机 tardis 的连接,指定目标目录为 /ftproot/stats。然后终止 FTP 会话。因为这是到远程目录的新的远程连接,NcFTP 会询问是否保存这个连接和密码。我输入 yes 并把保存的会话命名为 tardis_stats。书签保存在 .ncftp 目录中的 bookmarks 文件中。
|
在下一次要使用这个远程连接时,只需作为 ncftp
的参数提供书签,见清单 6。
如果不希望每次连接新的远程目标时都看到书签提示,那么在 prefs_v3 文件中把 confirm-close
的值设置为 no。
confirm-close=no |
或者在 NcFTP 命令行上输入以下命令:
ncftp/>set confirm-close no |
|
随着时间的推移,bookmarks 文件毫无疑问会变得相当大,可能需要清理。可以使用 NcFTP 实用程序 ncftpbookmarks 编辑这个文件,它提供菜单型界面,但是不太直观。我建议使用 vi
根据需要编辑 bookmarks 文件。
在传输大文件或者网络很堵塞的情况下,有时候不可避免地会出现 FTP 失败,文件只传输了一部分。对于 FTP 来说,这通常意味着要重新提交作业并覆盖原来的传输。但是,可以使用 NcFTP 通过追加或覆盖来继续会话。如果上传或下载的文件已经存在,但是文件大小不同,NcFTP 会自动地尝试从中断的地方继续会话,并不显示提示。如果希望 NcFTP 显示提示,让您选择应该执行的操作,那么把 auto-resume 首选项设置为 no:
auto-resume=no |
清单 7 显示在设置了 auto-resume=no
的情况下 FTP 传输失败之后可以执行的操作。注意,NcFTP 探测到文件大小不一样并提示选择操作。在这个示例中,我输入 Resume (R)
以继续传输。
|
如果试图传输一个文件,但是它在本地端和远程端有相同的大小和文件名,NcFTP 会发出以下消息:
ncftp /ftproot/stats > put stat_jan |
如果相应的 FTP 服务器支持重命名功能,可以在传输之后改变上传或下载的文件的名称。使用 -z
选项进行文件重命名。基本格式是:
<get / put> -z <file to transfer> <new_filename> |
可以使用以下命令从远程服务器获取文件 stat_jan 并改名为 stat_jan_rs6.txt:
ncftp /ftproot >get -z stat_jan stat_jan_rs6.txt |
注意,在这个示例中生成了传输的状态行。它指出传输将花费的大致时间。任何传输都会生成状态行,无论是 put
还是 get
命令。在使用 ncftpput 和 ncftpget 时也会生成相似的状态行。
尽管当您在键盘前时使用 NcFTP 很方便,但是如果希望执行非交互式命令,就不太方便了,尤其是在需要通过脚本执行 FTP 会话时。但是,实用程序 ncftpls、ncftpput 和 ncftpget 提供这个任务所需的工具。
三个客户端实用程序 ncftpls、ncftpget 和 ncftpput 毫无疑问比 NcFTP 更常用。当需要通过批处理或脚本执行特殊传输时,这些实用程序非常有用。在使用这些实用程序时,不能使用书签。
ncftpls 的基本格式是:
ncftpls <authentication details /options> <-x ls flags> <ftp://remote host> |
可以使用 ncftpls 连接远程服务器并获取命令行 ls
清单。这个实用程序有两个优点:
在下面的示例中,连接远程主机 tardis 并使用 /./ 访问用户的主目录。然后,执行 ls pre_stop.sh
命令检查 pre_stop.sh 文件是否存在。
$ ncftpls -u dxtans -p master "-x ls pre_stop.sh" ftp://tardis/./ |
如果在脚本中使用 ncftpls,可能需要捕捉输出。这是因为只要连接成功,最后的退出状态码就是零。即使找不到文件,它也不会向标准输出返回错误。检查命令返回值的方法 之一是使用替换,见清单 8:
myfile=`ncftpls -u dxtans -p master "-x ls pre_stop.sh" ftp://tardis/./ |
还可以列出完整的目录清单。在下一个示例中,连接远程主机 tardis 并列出远程目录 <HOME>/gems 的目录清单。注意 -1
标志。这确保只获取文件名,不获取文件的其他属性:
$ ncftpls -u dxtans -p master -1 ftp://tardis/./gems/ |
在网络繁忙的情况下,在建立连接之前会花费一段时间。为了确保 FTP 会话不会在建立连接之前超时,使用 redial (r) 和 timeout (t) 值让 NcFTP 重新尝试连接:
r 是重试的次数。
t 是以秒为单位的超时时间。
清单 9 所示的部分脚本示例连接远程主机 tardis。尝试连接(重新拨号)两次,在每次重新拨号时尝试连接 10 秒,然后超时。如果无法连接,那么脚本退出或者继续处理脚本的其余部分。
log=mylog |
ncftpput 用于把文件或目录传输到远程主机上。ncftpput 的基本格式是:
ncftpput <authentication details/options> <remote host> <remote direc> <local files> |
下面的示例把本地文件 /home/dxtans/spec_ja 传输到远程主机 tardis 上的远程目录 /ftproot/stats。
$ ncftpput -u dxtans -p master tardis /ftproot/stats /home/dxtans/spec_ja |
ncftpget 用于从远程主机获取文件或目录。ncftpget 的基本格式是:
ncftpget <authentication details/options> <remote host> <local files> <remote direc> |
下面的示例从远程主机 tardis 上的远程目录 /ftproot/stats/pebs 获取远程文件 peb_aud.rtf,把它放在本地目录 /tmp 中。
ncftpget -u dxtans -p master tardis /tmp /ftproot/stats/pebs/peb_aud* |
注意,在前面的示例中使用 * 通配符下载与 peb_aud* 匹配的任何文件。
还可以使用 ncftpput 和 ncftpget 执行递归传输。但是,并非所有 FTP 服务器都支持递归传输,尤其是公共 FTP 服务器。要想执行递归传输,需要提供 -R
选项。清单 10 把远程主机 tardis 的远程目录 /ftproot/stats/pebs 递归传输到本地目录 /home/dxtans/hold。如果这个本地目录不存在,就创建它:
$ ncftpget -R -u dxtans -p master tardis /home/dxtans/hold/ /ftproot/stats/pebs |
有时候您可能希望关闭状态行;为此,需要使用 -V
选项。例如:
$ ncftpget -V -R -u dxtans -p master tardis /home/dxtans/hold/ /ftproot/stats/pebs |
可以使用 ncftpbatch 命令在队列中运行许多 FTP 作业或者提交许多作业。它的基本工作过程如下:
-bb
选项在后台运行作业。然后把这些作业发送给 spooler。使用以下命令在后台启动批处理:
|
使用以下命令查看 spooler 中的作业:
ncftpbatch -l |
所有与批处理相关的作业放在 spool 目录中:
|
这个目录中有一个 spool 日志文件,还包含每个批处理 FTP 作业的文件。
清单 11 提交当前目录中扩展名为 .rtf 的所有文件。使用 ncftpput 命令把这些文件发送到远程服务器 tardis 上的远程目录 /ftproot/process:
$ ncftpput -bb -u dxtans -p master tardis /ftproot/process *.rtf |
使用以下命令在后台启动 ncftpbatch 以处理作业:
$ ncftpbatch –d |
使用以下命令查看要处理的作业:
$ ncftpbatch -l |
ncftpbatch 处理作业,作业完成之后 spooler 就空了。可以通过检查日志文件 .ncftp/spool/log 了解 spooler 的活动和作业。
把许多 FTP 作业提交给队列可以节省时间,因为不需要等待前一个作业完成之后再提交下一个作业。但是请注意,如果在成批提交的 NcFTP 命令中有任何问题,比如身份验证失败或错误的 get/put
命令,作业就会停止处理。最简便的解决方法是使用 rm
命令删除 .nctp/spoolwith 目录中的作业,然后重新提交它们。
在本文中,我在命令行上提供了密码;在一般操作中不会这么做。输入密码的方式通常有两种。可以在本地端的命令行上只指定用户名,等待远程主机 提示输入密码。也可以把密码放在一个文件中,然后把它提供给变量。对于 NcFTP 实用程序 ncftpput 和 ncftpget,可以使用密码身份验证文件。使用 -f <authentication file>
选项调用这个文件。身份验证文件应该只能由用户自己读取。这个文件的格式是:
host < hostname> |
例如,示例文件可以包含以下身份验证信息:
$ cat /home/dxtans/myncftp |
以下示例通过 ncftpput 使用这个文件连接远程主机。它把本地文件 /home/dxtans/chatter.log 传输到远程目录 /ftproot/gen:
$ ncftpput -f /home/dxtans/myncftp /ftproot/gen /home/dxtans/chatter.log |
在以前的一个版本和另一种操作系统上,我发现必须在命令行上指定远程主机,如下所示:
$ ncftpput -f /home/dxtans/myncftp tardis /ftproot/gen /home/dxtans/chatter.log |
如果远程主机支持匿名 FTP 登录,就可以把密码(常常是您的电子邮件地址)放在首选项文件中。要想让 NcFTP 解析匿名用户的密码,可以在 NcFTP 命令行中设置 anon-password
值,比如:
ncftp> set anon-password david.tansley@btinternet.com |
还可以直接编辑 prefs_v3 文件:
anon-password=david.tansley@btinternet.com |
可以使用以下命令作为匿名用户连接远程主机 tardis:
$ ncftp -u anonymous tardis |
当在远程主机上遇到身份验证或文件位置问题时,就应该调试 FTP 会话。使用 -d <logfile>
选项,NcFTP 就会把调试信息发送到日志文件。在下面的示例中,调试文件称为 output.log,在当前工作目录中生成。这个示例要把本地文件 /home/dxtans/gen_rep 传输到远程机器上的 /ftproot 目录。如果需要诊断任何问题,可以通过查看日志文件了解完整的事务处理过程。请注意,调试文件中提供的信息非常详细,正是解决任何问题所需要的。
$ ncftpput -d output.log -u dxtans -p master tardis /ftproot /home/dxtans/gen_prep |
在 ncftpget 和 ncftpls 命令中也可以使用调试选项。
NcFTP 客户端是一种高效的 FTP 传输方法。可以使用 NcFTP 从命令行执行命令,这对于脚本编程非常理想,NcFTP 还可以继续失败的 FTP 传输并提供批处理机制。本文介绍了 NcFTP 客户端如何帮助实现特殊的 FTP 传输,解释了如何在脚本中使用客户端实用程序。