shell脚本在bash中从ftp服务器下载文件

我必须编写一个shell脚本来为bash shell从ftp服务器传输文件
ftp服务器 – fileserver@example.com
用户user1
密码pass1

现在在/ dir1 / dir2在FTP服务器我有以下forms的文件夹
0.7.1.70
0.7.1.71
0.7.1.72

我必须从最新的文件夹,即0.7.1.72复制文件“file1.iso”在这种情况下。 我也必须在复制时检查文件的完整性,即假设文件正在上传到服务器,那时如果我在这种情况下开始复制,复制将不会完成。

我必须每4小时完成一次。 这可以通过做一个cron工作来完成。 请帮忙

我已经做到了这一点,我登上了ftp服务器文件夹到我的本地机器。 检查文件是否已经完全上传或没有我检查大小后,每隔50秒5次,如果是相同的,那么我正在复制,否则在4小时后运行脚本…我一直保持一个文本文件“foldernames .txt“其中有我从中复制所需的文件的所有这些文件夹的名称..所以我检查是否通过检查在foldername.text文件中的名称添加到服务器的新文件夹.. **

每一件事情工作正常只有问题现在是..假设文件正在被下载一个当时有一些networking故障..我将如何确保我已经完全下载文件….我试图使用md5sum和chksum但是在安装文件夹上计算需要很长时间。 请帮忙

这是我的脚本..

#!/bin/bash # # changing the directory to source location echo " ########### " >> /tempdir/pvmscript/scriptlog.log echo `date`>> /tempdir/pvmscript/scriptlog.log echo " script is strting " >> /tempdir/pvmscript/scriptlog.log cd /var/mountpt/pvm-vmware # # array to hold the name of last five folders of the source location declare -a arr i=0 for folder in `ls -1 | tail -5 `; do arr[i]=$folder #echo $folder i=$((i+1)) done echo " array initialised " >> /tempdir/pvmscript/scriptlog.log # #now for these 5 folders we will check if their name is present in the list of copied # folder names # echo " checking for the folder name in list " >> /tempdir/pvmscript/scriptlog.log ## $(seq $((i-1)) -1 0 for j in $(seq $((i-1)) -1 0 ) ; do var3=${arr[$j]} #var4=${var3//./} echo " ----------------------------------------" >> /tempdir/pvmscript/scriptlog.log echo " the folder name is $var3" >> /tempdir/pvmscript/scriptlog.log # # checking if the folder name is present in the stored list of folder names or not # # foldercheck=$(grep $var3 /tempdir/pvmscript/foldernames.txt | wc -l) # if test $foldercheck -eq 1 then echo " the folder $var3 is present in the list so will not copy it " >> /tempdir/pvmscript/scriptlog.log foldercheck=" " continue else # echo " folder $var3 is not present in the list so checking if it has the debug.iso file ">> /tempdir/pvmscript/scriptlog.log #enter inside the new folder in source # cd /var/mountpt/pvm-vmware/$var3 # # writing the names of content of folder to a temporary text file # ls -1 > /var/temporary.txt #checking if the debug.iso is present in the given folder var5=$(grep debug.iso /var/temporary.txt | wc -l) var6=$(grep debug.iso //var/temporary.txt) # check1="true" # # if the file is present then checking if it is completely uploaded or not # rm -f /var/temporary.txt if test $var5 -eq 1 then echo " it has the debug.iso checking if upload is complete ">>/tempdir/pvmscript/scriptlog.log # # getting the size of the file we are checking if size of the file is constant or changing # after regular interval # var7=$(du -s ./$var6 |cut -f 1 -d '.') #echo " size of the file is $var7" sleep 50s # # checking for 5 times at a regular interval of 50 sec if size changing or not # # for x in 1 2 3 4 5 ;do var8=$(du -s ./$var6 |cut -f 1 -d '.') # #if size is changing exit and check it after 4 hrs when the script will rerun #echo " size of the file $x is $var7" if test $var7 -ne $var8 then check1="false" echo " file is still in the prossess of being uploadig so exiting will check after 4 hr " >> /tempdir/pvmscript/scriptlog.log break fi sleep 50s done # #if the size was constant copy the file to destination # if test $check1 = "true" then echo " upload was complete so copying the debug.iso file " >> /tempdir/pvmscript/scriptlog.log cp $var6 /tempdir/PVM_Builds/ echo " writing the folder name to the list of folders which we have copied " >> /tempdir/pvmscript/scriptlog.log echo $var3 >> /tempdir/pvmscript/foldernames.txt echo " copying is complete " >> /tempdir/pvmscript/scriptlog.log fi #else #echo $foldercheck >> /vmfs/volumes/Storage1/PVM_Builds/foldernames.txt else echo " it do not have the debug.iso file so leaving the directory " >>/tempdir/pvmscript/scriptlog.log echo $var3 >> /tempdir/pvmscript/foldernames.txt echo fi #rm -f /var/temporary.txt fi done 

一些意见和要求澄清在这里,看下面的休息一个可能的答案。

(很好的工作更新你的问题。)

这些文件有多大?

这些文件是否可以控制其创建的启动时间(例如,数据库备份)。

这也有助于获得更多的细节这些文件,即大小,MB,GB,TB,PB? 以及创建它们的源代码,db-backup或者???。

您的担心是理论上的,对最坏情况进行积极的探索,或者如果您有实际问题,多久会有什么后果?

您的SLA是一个不切实际的/难以实现的管理梦想吗? 如果是这样,那么你必须开始创建文档,以显示当前系统将需要X额外的资源(人,硬件,编程等)来纠正系统中的缺陷。


如果要传输的文件是由源系统创建的数据文件,则有一种技术是让源系统创建一个在主文件发送之后发送的“标志”文件。

它可能包含像

  filename : TradeData_2012-04-13.dat recCount : 777777 fileSize : 37604730291 workOfDate: 2012-04-12 md5sum : .... 

因此,现在您的系统等待发现标志文件已经交付,因为您正在使用标准的命名约定为您收到的每个文件,并使用文件中嵌入的立场日期戳。 当文件到达时,脚本会计算每个相关的细节,并将它们与存储在标志文件中的值进行比较。

如果你不能安排这个级别的详细信息,至少是通用标志文件,每天每个文件,或每日每批文件(当所有文件完成时发送),可以跟随测试比较新文件和一套对你的特定情况有意义的测试,…以下一些:

  • 文件必须至少为X大
  • 文件必须至少有N个记录
  • 文件永远不会比昨天的文件小
  • 等等

那么你的辩护就是“我们没有完全控制这些文件,但是我们检查了X,Y,Z,并通过了这些测试,这就是为什么我们加载了它们”。


虽然rsync可能是好的,但是我没有看到如何,鉴于上面提到的一些场景,你会确定开始加载文件是安全的,因为rsync可能会开始向文件添加更多的数据。


通过脚本阅读,如果你不能从你的源获得详细的标志文件,你是在正确的轨道上。 格伦·杰克曼的解决方案看起来用更少的代码完成相同的目标。 你可以把它放在一个scriptFile'getRemotedata.sh'或类似的文件中,并放在一个while循环中,只有当'getRemotedata.sh'成功退出时才会退出。 我想我会想要一些类型的通知,它已经花了3 * normalTime运行。 但是,当您尝试涵盖所有条件时,它会变得非常复杂。 有第三方工具可以管理文件下载,但我们从来没有预算购买,所以我不能推荐任何。

我希望这有帮助。


PS欢迎来到StackOverflow(SO)请记住阅读FAQ( http://tinyurl.com/2vycnvr) ,使用灰色三角形( http://img.zgserver.com/linux/kygEP.png)投票选出好的Q / A,并接受答案,解决您的问题,如果有的话,按复选标记, http://img.zgserver.com/linux/removed.png

FTP协议不够健壮。 它不涉及原子性,无法知道在下载文件时是否仍在上传文件。 如果你需要这个功能,你需要调查使用rsync下载和上传。

 #!/bin/sh if mkdir /tmp/download_in_process 2>/dev/null; then echo "cannot start, download in process" exit 1 fi latest=$(ftp hostname << END1 | tail -1 user user1 pass1 cd /dir1/dir2 ls END1 ) ftp hostname << END2 user user1 pass1 cd /dir1/dir2/$latest get file1.iso END2 rmdir /tmp/download_in_process