NcFTP:灵活的 FTP 客户端
2010-06-08 00:00:00 来源:WEB开发网NcFTP 既可以作为 FTP 服务器,也可以作为 FTP 客户端。但是,这两者都称为 NcFTP。在本文中,我只使用 NcFTP 客户端。因此,在我提到 NcFTP 时只是指 NcFTP 客户端。另外,客户端附带各种命令行实用程序,这让客户端非常便于在命令行上或以批处理模式使用。
NcFTP 概述
NcFTP 实用程序让系统管理员能够利用 FTP 的灵活性和性能。NcFTP 可以与当前的默认 AIX® FTP 服务一起使用,目前没有发现任何问题。NcFTP 能够继续失败的传输和重新尝试,在通过有网络瓶颈的网络传输大型文件时这非常有用。NcFTP 可以输出状态行(与 SCP 很相似),显示传输的进度。但是,NcFTP 不支持任何加密,这对于某些环境可能是问题。
非常常见的安装形式是运行当前的 AIX FTP 服务器,使用 NcFTP 作为客户端。本文主要关注这种安装类型。
NcFTP 客户端附带以下实用程序:
表 1. NcFTP 实用程序
ncftp | 主 FTP 界面 |
ncftpget | FTP get 命令行 |
ncftpput | FTP put 命令行 |
ncftpbatch | 批命令行 |
ncftpspooler | FTP 的 Spooler |
ncftpls | 远程执行 ls 命令 |
注意:在本文中,不讨论 ncftpspooler 实用程序。
安装 NcFTP
可以从 NcFTP 主页下载 NcFTP。
下载客户端之后,解压二进制文件,见清单 1:
清单 1. 解压二进制文件
# gunzip /tmp/ncftp-3.2.3-aix5.3.0-export.tar.gz
# cd /opt
# tar –xvf /tmp/ncftp-3.2.3-aix5.3.0-export.tar
确认 NcFTP 已经启动,如清单 2 所示。
清单 2. 启动 NcFTP
$ ncftp -v
$ Usage: ncftp [flags] [<host> | <directory URL to browse>]
Flags:
-u XX Use username XX instead of anonymous.
-p XX Use password XX with the username.
-P XX Use port number XX instead of the default FTP service port (21).
-j XX Use account XX with the username (rarely needed).
-F Dump a sample $HOME/.ncftp/firewall prefs file to stdout and exit.
Program version: NcFTP 3.2.3/433 Jul 28 2009, 10:02 AM
Library version: LibNcFTP 3.2.3 (July 23, 2009)
Build system: AIX Voltigeur 3 5 000D3A9F4C00
根据访问的远程 FTP 主机类型不同,可能必须在主机名前面加上 ftp://,比如:
ftp://<hostname>
注意:对于 ncftpls 实用程序,在连接远程主机时,必须使用前面的格式。
如果遇到了 FTP 连接问题,那么按以下列表尝试排除故障:
确认远程 FTP 服务正在运行。
确认远程 FTP 端口没有阻塞。
确认 tcp 包装器没有拒绝连接。
确认您的用户名没有在 /etc/ftpusers 中。
确认在 /etc/ftpaccess.ctl 中没有拒绝这个主机或用户。
以交互方式使用 NcFTP
确认可以使用 NcFTP 连接所选的远程服务器。在清单 3 中,我使用用户名 dxtans 和密码 master 连接私有主机 tardis。
清单 3. 连接远程服务器
$ ncftp -u dxtans -p master tardis
NcFTP 3.2.3 (Jul 28, 2009) by Mike Gleason (http://www.NcFTP.com/contact/).
Connecting to 192.168.4.10...
Logging in...
Password Ok, User logged in
Logged in to tardis.
Current remote directory is /.
ncftp/>
如果一切正常,下面我们就可以开始探究 NcFTP 了。
清单 4 演示如何在常见的 FTP 会话中使用 NcFTP。使用 cd 命令进入本地系统的 /tmp,然后进入远程系统的 /ftproot/stats 目录。
执行两个 ls 命令,然后执行 get 命令以获取远程文件 stat_09.txt。这与普通的 FTP 会话非常相似,但是有一些额外的特点。
清单 4. Ftp_connect
$ ncftp -u dxtans -p master tardis
NcFTP 3.2.3 (Jul 28, 2009) by Mike Gleason (http://www.NcFTP.com/contact/).
Connecting to 192.168.4.10...
Logging in...
Password Ok, User logged in
Logged in to tardis.
ncftp / > lcd /tmp
ncftp / > cd /ftproot/stats
Change directory ok
ncftp /ftproot/stats > ls
desktop.ini pebs/ spec_ja stat_09.txt stat_jan.rtf
ncftp /ftproot/stats > ls -l
-------rw- 48 Jan 18 13:58 desktop.ini
d------rwx 0 Jan 23 02:36 pebs
-------rw- 564 Jan 23 08:17 spec_ja
-------rw- 61 Jan 18 13:53 stat_09.txt
-------rw- 18927 Mar 23 2004 stat_jan.rtf
ncftp /ftproot/stats > get stat_09.txt
在最初调用 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 文件中。
清单 5. 书签
$ ncftp -u dxtans -p master tardis /ftproot/stats
NcFTP 3.2.3 (Jul 28, 2009) by Mike Gleason (http://www.NcFTP.com/contact/).
Connecting to 192.168.4.10...
Logging in...
Password Ok, User logged in
Logged in to tardis.
Current remote directory is /ftproot/stats.
ncftp /ftproot/stats > quit
You have not saved a bookmark for this site.
Would you like to save a bookmark to:
ftp://dxtans:PASSWORD@tardis/ftproot/stats/
Save? (yes/no) yes
Enter a name for this bookmark, or hit enter for "tardis": tardis_stats
You logged into this site using a password.
Would you like to save the password with this bookmark?
Save? [no] yes
Bookmark "tardis_stats" saved
在下一次要使用这个远程连接时,只需作为 ncftp 的参数提供书签,见清单 6。
如果不希望每次连接新的远程目标时都看到书签提示,那么在 prefs_v3 文件中把 confirm-close 的值设置为 no。
confirm-close=no
或者在 NcFTP 命令行上输入以下命令:
ncftp/>set confirm-close no
清单 6. 装载书签
$ ncftp tardis_stats
NcFTP 3.2.3 (Jul 28, 2009) by Mike Gleason (http://www.NcFTP.com/contact/).
Connecting to 192.168.4.10...
Logging in...
Password Ok, User logged in
Logged in to tardis.
Change directory ok
Current remote directory is /ftproot/stats.
ncftp /ftproot/stats >
随着时间的推移,bookmarks 文件毫无疑问会变得相当大,可能需要清理。可以使用 NcFTP 实用程序 ncftpbookmarks 编辑这个文件,它提供菜单型界面,但是不太直观。我建议使用 vi 根据需要编辑 bookmarks 文件。
在传输大文件或者网络很堵塞的情况下,有时候不可避免地会出现 FTP 失败,文件只传输了一部分。对于 FTP 来说,这通常意味着要重新提交作业并覆盖原来的传输。但是,可以使用 NcFTP 通过追加或覆盖来继续会话。如果上传或下载的文件已经存在,但是文件大小不同,NcFTP 会自动地尝试从中断的地方继续会话,并不显示提示。如果希望 NcFTP 显示提示,让您选择应该执行的操作,那么把 auto-resume 首选项设置为 no:
auto-resume=no
清单 7 显示在设置了 auto-resume=no 的情况下 FTP 传输失败之后可以执行的操作。注意,NcFTP 探测到文件大小不一样并提示选择操作。在这个示例中,我输入 Resume (R) 以继续传输。
清单 7. 继续传输
ncftp /ftproot/stats > put stat_jan
The remote file "stat_jan" already exists.
Local: 102400000 bytes, dated Tue Jan 19 19:19:19 GMT 2010.
Remote: 57347024 bytes, dated Tue Jan 19 19:24:28 GMT 2010.
[O]verwrite? [R]esume? [A]ppend to? [S]kip? [N]ew Name?
[O!]verwrite all? [R!]esume all? [S!]kip all? [C]ancel > R
stat_jan: 97.66 MB 938.15 kB/s
如果试图传输一个文件,但是它在本地端和远程端有相同的大小和文件名,NcFTP 会发出以下消息:
ncftp /ftproot/stats > put stat_jan
The remote file "stat_jan" already exists.
Local: 102400000 bytes, dated Tue Jan 19 19:19:19 GMT 2010.
(Files are identical, skipped)
如果相应的 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
stat_jan_rs6.txt: ETA: 2:11 19.77/ 97.66 MB 610.62 kB/s
注意,在这个示例中生成了传输的状态行。它指出传输将花费的大致时间。任何传输都会生成状态行,无论是 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 清单。这个实用程序有两个优点:
可以在执行 FTP 会话之前运行这个实用程序,从而在执行上传或下载之前确认远程主机 FTP 服务正在运行。
还可以检查远程主机上的文件或目录是否存在。
在下面的示例中,连接远程主机 tardis 并使用 /./ 访问用户的主目录。然后,执行 ls pre_stop.sh 命令检查 pre_stop.sh 文件是否存在。
$ ncftpls -u dxtans -p master "-x ls pre_stop.sh" ftp://tardis/./
-rwxrwxrwx 1 apps staff 14 Aug 25 08:51 pre_stop.sh
如果在脚本中使用 ncftpls,可能需要捕捉输出。这是因为只要连接成功,最后的退出状态码就是零。即使找不到文件,它也不会向标准输出返回错误。检查命令返回值的方法之一是使用替换,见清单 8:
清单 8. 使用替换
myfile=`ncftpls -u dxtans -p master "-x ls pre_stop.sh" ftp://tardis/./
if [ "$myfile" != "" ]
then
echo "file present"
# do processing here
else
echo "no file present"
exit 1
fi
还可以列出完整的目录清单。在下一个示例中,连接远程主机 tardis 并列出远程目录 <HOME>/gems 的目录清单。注意 -1 标志。这确保只获取文件名,不获取文件的其他属性:
$ ncftpls -u dxtans -p master -1 ftp://tardis/./gems/
shrm.sh
lgett.sh
myfile.txt
在网络繁忙的情况下,在建立连接之前会花费一段时间。为了确保 FTP 会话不会在建立连接之前超时,使用 redial (r) 和 timeout (t) 值让 NcFTP 重新尝试连接:
r 是重试的次数。
t 是以秒为单位的超时时间。
清单 9 所示的部分脚本示例连接远程主机 tardis。尝试连接(重新拨号)两次,在每次重新拨号时尝试连接 10 秒,然后超时。如果无法连接,那么脚本退出或者继续处理脚本的其余部分。
清单 9. 重新尝试连接
log=mylog
ncftpls –r2 -t10 -u dxtans -p master ftp://tardis/./
if [ $? -ne 0 ]
then
echo "Could not connect to FTP server" >>$log
exit 1
else
echo "NCFTP connect test OK" >>$log
fi
# carry on ncftp commands here..
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
/home/dxtans/spec_ja: 564.00 B 3.26 kB/s
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*
/home/dxtans/holding/peb_aud.rtf: 18.48 kB 102.92 kB/s
注意,在前面的示例中使用 * 通配符下载与 peb_aud* 匹配的任何文件。
还可以使用 ncftpput 和 ncftpget 执行递归传输。但是,并非所有 FTP 服务器都支持递归传输,尤其是公共 FTP 服务器。要想执行递归传输,需要提供 -R 选项。清单 10 把远程主机 tardis 的远程目录 /ftproot/stats/pebs 递归传输到本地目录 /home/dxtans/hold。如果这个本地目录不存在,就创建它:
清单 10. 递归传输
$ ncftpget -R -u dxtans -p master tardis /home/dxtans/hold/ /ftproot/stats/pebs
/home/dxtans/hold/pebs/peb_post2.rtf: 18.48 kB 101.53 kB/s
/home/dxtans/hold/pebs/peb_pre.txt: 0.00 B 0.00 B/s
/home/dxtans/hold/pebs/peb_runin.rtf: 18.48 kB 101.09 kB/s
/home/dxtans/hold/pebs/peb_runoff.rtf: 18.48 kB 103.80 kB/s
/home/dxtans/hold/pebs/pre_post.txt: 0.00 B 0.00 B/s
/home/dxtans/hold/pebs/mth/prepost.txt: 23.01 B 108.00 kB/s
/home/dxtans/hold/pebs/mth/pre_run2.txt: 22.01 B 106.00 kB/s
有时候您可能希望关闭状态行;为此,需要使用 -V 选项。例如:
$ ncftpget -V -R -u dxtans -p master tardis /home/dxtans/hold/ /ftproot/stats/pebs
批处理
可以使用 ncftpbatch 命令在队列中运行许多 FTP 作业或者提交许多作业。它的基本工作过程如下:
使用 ncftpput 或 ncftpget 命令提交 FTP 命令。
指定 -bb 选项在后台运行作业。然后把这些作业发送给 spooler。
使用 ncftpbatch 处理 spooler 中的 FTP 作业。
使用以下命令在后台启动批处理:
ncftpbatch -d
使用以下命令查看 spooler 中的作业:
ncftpbatch -l
所有与批处理相关的作业放在 spool 目录中:
.ncftp/spool
这个目录中有一个 spool 日志文件,还包含每个批处理 FTP 作业的文件。
清单 11 提交当前目录中扩展名为 .rtf 的所有文件。使用 ncftpput 命令把这些文件发送到远程服务器 tardis 上的远程目录 /ftproot/process:
清单 11. 提交 .rtf 文件
$ ncftpput -bb -u dxtans -p master tardis /ftproot/process *.rtf
Spooled; sending remotely as /ftproot/process/peb_post2.rtf.
Spooled; sending remotely as /ftproot/process/peb_pre.rtf.
Spooled; sending remotely as /ftproot/process/stat_jan.rtf.
使用以下命令在后台启动 ncftpbatch 以处理作业:
$ ncftpbatch –d
使用以下命令查看要处理的作业:
$ ncftpbatch -l
---Scheduled-For-----Host----------------------------Command--------------------
2010-01-23 21:06 tardis PUT stat_jan.rtf
ncftpbatch 处理作业,作业完成之后 spooler 就空了。可以通过检查日志文件 .ncftp/spool/log 了解 spooler 的活动和作业。
把许多 FTP 作业提交给队列可以节省时间,因为不需要等待前一个作业完成之后再提交下一个作业。但是请注意,如果在成批提交的 NcFTP 命令中有任何问题,比如身份验证失败或错误的 get/put 命令,作业就会停止处理。最简便的解决方法是使用 rm 命令删除 .nctp/spoolwith 目录中的作业,然后重新提交它们。
密码
在本文中,我在命令行上提供了密码;在一般操作中不会这么做。输入密码的方式通常有两种。可以在本地端的命令行上只指定用户名,等待远程主机提示输入密码。也可以把密码放在一个文件中,然后把它提供给变量。对于 NcFTP 实用程序 ncftpput 和 ncftpget,可以使用密码身份验证文件。使用 -f <authentication file> 选项调用这个文件。身份验证文件应该只能由用户自己读取。这个文件的格式是:
host < hostname>
user <user name>
pass <user password>
例如,示例文件可以包含以下身份验证信息:
$ cat /home/dxtans/myncftp
host tardis
user dxtans
pass master
以下示例通过 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
NcFTP 3.2.3 (Jul 28, 2009) by Mike Gleason (http://www.NcFTP.com/contact/).
Connecting to 192.168.4.10...
Logging in...
Password Ok, User logged in
Logged in to 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
/home/dxtans/gen_prep: 573.00 B 6.71 kB/s
在 ncftpget 和 ncftpls 命令中也可以使用调试选项。
结束语
NcFTP 客户端是一种高效的 FTP 传输方法。可以使用 NcFTP 从命令行执行命令,这对于脚本编程非常理想,NcFTP 还可以继续失败的 FTP 传输并提供批处理机制。本文介绍了 NcFTP 客户端如何帮助实现特殊的 FTP 传输,解释了如何在脚本中使用客户端实用程序。
更多精彩
赞助商链接