Linux 版 (精华区)

发信人: netiscpu (说不如做), 信区: Linux
标  题: 建立自动的FTP下载程序
发信站: 哈工大紫丁香 (Tue May 18 07:56:02 1999), 转信

"Linux公报... 让Linux更富魅力!"

---------------------------------------------------------------------------

-----如何自动通过FTP下载文件

by Manuel Arturo Izquierdo 翻译:gaia  [yangxiao@pubms.pku.edu.cn]

---------------------------------------------------------------------------

-----

    Internet不愧是广阔的信息海洋,可要想通过有限的带宽传输大量数据绝对是一种

痛苦经历.就说我自己吧.我在哥伦比亚国家天文台工作,我们的局域网接到大学的ATM主

干网上.可惜与外界的联系全靠一条带宽只有64K的线路.白天,网上有500多个用户可真

够让人头疼的,因为网络速度慢得难以忍受.夜里就不一样了.校园里没有人,所以传输速

率还算让人满意.这时你可以轻松下载大量数据(比如,整个Linux发行套件).不过, 既然

我们都是血肉之躯,总在计算机旁边熬夜也不是个办法.于是有了个想法:编个小程序, 

让计算机干活,我们睡觉.您该问了:怎么才能让Linux完成这项任务?看完我的文章您就

明白了! 

在这篇文章中,我只讨论了ftp连接,还没有做http方面的工作.如果您有好主意,请告诉

我. 

最先闪过的念头就是:利用at命令,在指定时间执行所需的操作.咱们想想一次简单的ft

p会话是怎么进行的:(粗体字是用户键入的命令) 

bash$ ftp anyserver.anywhere.net

Connected to anyserver.anywhere.net.

220 anyserver FTP server (Version wu-2.4(1) Tue Aug 8 15:50:43 CDT 1995) 

ready.

Name (anyserver:theuser): anonymous

331 Guest login ok, send your complete e-mail address as password.

Password:(an e-mail address)

230 Guest login ok, access restrictions apply.

Remote system type is UNIX.

Using binary mode to transfer files.

ftp> cd pub

ftp> bin

ftp> get anyfile.tar.gz

150 Opening BINARY mode data connection for anyfile.tar.gz (3217 bytes).

226 Transfer complete.

3217 bytes received in 0.0402 secs (78 Kbytes/sec)

ftp> bye

221 Goodbye.

bash$

你可以写一个简单的shell脚本,里面包括at命令要执行的操作步骤.为了在shell脚本中

执行ftp的内部命令,可以利用一种shell语法性质,即能在shell脚本中嵌入一些假托是

来自标准输入的内容.这叫作"here"文档: #! /bin/sh

echo This will use a "here" document to embed ftp commands in this script

# Begin of "here" document

ftp <<**

open anyserver.anywhere.net

anonymous

mymail@mailserver.net

cd pub

bin

get anyfile.tar.gz

bye

**

# End of "here" document

echo ftp transfer ended.

注意,**字符串之间的所有内容将被传送给ftp,就象是被用户键入的一样.所以这个脚本

应该打开一个到anyserver.anynet.net的ftp连接,以anonymous登录,把mymail@mailse

rver.net 作为口令,以二进制传输方式取回位于pub目录的anyfile.tar.gz 文件.看起

来这个脚本没有问题,可实际上却不能工作.为什么呢?问题就在,ftp程序不接受通过"h

ere"文档送来的用户名和口令;在这种情况下ftp将把anonymous和mymail@mailserver.

net作为"Invalid command"处理. 显然,由于没有送去用户名和口令,FTP服务器将拒绝

这一请求. 其实窍门就在ftp程序使用的一个隐藏文件,名为~/.netrc;它必须位于你的

主目录下.这个文件包含了ftp登录到某一系统中所需要的信息,由三行文本组成: 

machine  anyserver.anynet.net

login    anonymous

password mymail@mailserver.net

如果使用私人帐号进行ftp连接,password项必须是相应帐号的口令,而不能像匿名ftp那

样用e-mail 地址.这也许会留下安全漏洞,所以除用户本人之外,其他人不能有~/.netr

c的读,写和执行权限. 用 chmod命令 可以很容易地实现: chmod go-rwx .netrc 

现在,我们的脚本变成这样: 

#! /bin/sh

echo This will use a "here" document to embed ftp commands in this script

# Begin of "here" document

ftp <<**

open anyserver.anywhere.net

cd pub

bin

get anyfile.tar.gz

bye

**

# End of "here" document

echo ftp transfer ended.

ftp会从 ~/.netrc文件中抽取登录名及口令信息,并实现连接.假如我们给这个脚本起名

叫getdata, (并且用chmod ugo+x getdata 使它可执行),我们就可以设定它在指定时间

执行: bash$ at 1:00 am 

getdata 

(control-D) 

Job 70 will be executed using /bin/sh 

bash$ 

早晨你来的时候,想要的数据就会在你的机器里了! 

另一个使用这个脚本的好办法是: 

bash$ nohup getdata &

[2] 131

bash$ nohup: appending output to 'nohup.out'

bash$

nohup允许被它执行的那个进程(本例中是getdata)在用户退出后仍能运行.所以你可以

在后台下载一堆文件而自己干别的事,或者logout而不会杀死ftp子进程. 简而言之,你

可以按以下步骤一步步操作: 

把服务器名,用户(anonymous)和口令信息写进~/.netrc 文件 

确认~/.netrc文件的权限为-rwx------ 

按以下框架写一个脚本文件: 

#! /bin/sh 

ftp <<** 

open (FTP服务器名) 

(要执行的ftp命令序列...) 

bye 

** 

赋予脚本可执行权限:chmod ugo+x scriptname 

设定执行时间: 

at 1:00 am 

脚本文件名 

(control-D)

现在完事大吉了! 

此外,你还可以给这个脚本添上更多功能,让它自动更新 ~/.netrc文件,并产生一个日志

文件记录ftp花了多少时间: 

#!/bin/sh

# Makes a backup of the old ~/.netrc file

cp $HOME/.netrc $HOME/netrc.bak

# Configures a new ~/.netrc

rm $HOME/.netrc

echo machine anyserver.anywhere.net > $HOME/.netrc

echo login anonymous >> $HOME/.netrc

echo password mymail@mailserver.net >> $HOME/.netrc

chmod go-rwx $HOME/.netrc

echo scriptname log file > scriptname.log

echo Begin conection at: >> scriptname.log

date >> scriptname.log

ftp -i<<**

open anyserver.anywhere.net

bin

cd pub

get afile.tar.gz

get bfile.tar.gz

bye

**

echo End conection at: >> scriptname.log

date >> scriptname.log

# End of scriptname script

由于每此下载前都要手工建立脚本文件显得有点麻烦,我还写了一个tcl/tk8.0 程序,能

产生我们需要的脚本文件. 您还可以从ftp帮助手册里学到关于ftp内部命令的更多的知

识.   

---------------------------------------------------------------------------

-----

版权所有 (C) 1998, gaia 

出版于第33期《Linux公报》1998年10月 中文版第一期

---------------------------------------------------------------------------

-----

  

  .


--
☆ 来源:.哈工大紫丁香 bbs.hit.edu.cn.[FROM: bin@mtlab.hit.edu.cn]
[百宝箱] [返回首页] [上级目录] [根目录] [返回顶部] [刷新] [返回]
Powered by KBS BBS 2.0 (http://dev.kcn.cn)
页面执行时间:3.692毫秒