NcFTP:灵活的 FTP 客户端

来源:互联网 发布:财智家庭理财软件 编辑:程序博客网 时间:2024/05/16 08:05

NcFTP:灵活的 FTP 客户端

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 的 Spoolerncftpls远程执行 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 连接问题,那么按以下列表尝试排除故障:

  1. 确认远程 FTP 服务正在运行。
  2. 确认远程 FTP 端口没有阻塞。
  3. 确认 tcp 包装器没有拒绝连接。
  4. 确认您的用户名没有在 /etc/ftpusers 中。
  5. 确认在 /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 作业或者提交许多作业。它的基本工作过程如下:

  1. 使用 ncftpput 或 ncftpget 命令提交 FTP 命令。
  2. 指定 -bb 选项在后台运行作业。然后把这些作业发送给 spooler。
  3. 使用 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 传输,解释了如何在脚本中使用客户端实用程序。

原创粉丝点击