WEB开发网
开发学院服务器FTP服务器 NcFTP:灵活的 FTP 客户端 阅读

NcFTP:灵活的 FTP 客户端

 2010-06-08 00:00:00 来源:WEB开发网   
核心提示:NcFTP 既可以作为 FTP 服务器,也可以作为 FTP 客户端,NcFTP:灵活的 FTP 客户端,但是,这两者都称为 NcFTP,NcFTP 还可以继续失败的 FTP 传输并提供批处理机制,本文介绍了 NcFTP 客户端如何帮助实现特殊的 FTP 传输,在本文中,我只使用 NcFTP 客户端

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 界面
ncftpgetFTP get 命令行
ncftpputFTP put 命令行
ncftpbatch批命令行
ncftpspoolerFTP 的 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 传输,解释了如何在脚本中使用客户端实用程序。

Tags:NcFTP 灵活 FTP

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接