加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

用Perl脚本实现FTP的文件下载

发布时间:2020-12-16 00:12:42 所属栏目:大数据 来源:网络整理
导读:先讲一下项目背景,及系统需求。 客户想每小时获取一下公司为其准备的生产数据,但数据是分布在不同的系统及不同的文件夹下。考虑到安全因素,也不可能把所有的服务器都暴露给客户。 怎么办呢?可以考虑把分布在不同服务器的数据定时集中收集起来,放在一个

先讲一下项目背景,及系统需求。

客户想每小时获取一下公司为其准备的生产数据,但数据是分布在不同的系统及不同的文件夹下。考虑到安全因素,也不可能把所有的服务器都暴露给客户。

怎么办呢?可以考虑把分布在不同服务器的数据定时集中收集起来,放在一个共享给客户的文件夹下,供客户来读取。

上图是实现FTP文件下载的架构,注意Unix客户端一般默认就有ftp服务,所以你只需打开服务就好。

而windows客户端一般需要安装ftp服务及perl语言环境。

而作为共享给客户的FTP服务器,需要用任务管理器调用Perl脚本。以确保每小时从服务器机台获得数据。

下面,解释一下Perl脚本的实现。


#!/usr/bin/perl

use Net::FTP;
use POSIX;
use Digest::MD5;


两个调用参数

################
$arg1 = $ARGV[0];

$arg2 = $ARGV[1];

################


# 下面五行分别指出数据在不同系统的存放路径,第五行是FTP文件夹的存放路径
$hosts_file="hosts";
$Dir_tester_lcx = '/opt/ltx_nic/user_data';
$Dir_tester_hp = '/var/opt/hp93000/soc/diagnostic';
$Dir_tester_tera_win = '/Program Files/Teradyne/IG-XL/logs';

$Dir_server = '/export/np101/System/automation/Tester_Hardware/Data';


open(DAT,"$hosts_file") || die ("Could not open file $hosts_file");

#声明一个数组存放系统信息

@raw_data = <DAT>;

close (DAT);

#制作时间戳

$minute = strftime('%M',localtime);
$hour = strftime('%H',localtime);
$date = strftime('%d',localtime);
$date_without_zero = strftime("%-d",localtime);
$month = strftime('%m',localtime);
$month_without_zero = strftime("%-m",localtime);
$year = strftime('%Y',localtime);

#提取数组信息,将不同的系统信息进行归类,大概有11类操作系统及机台系统

foreach $data (@raw_data)

{
if ($data =~ /LTXC/) {
? ? my $position = rindex ($data,"LTXC");
? ? $data = substr ($data,$position,5);
? ? push(@LTX,"$data");

}

elsif ($data =~ /LHT-/) {

? ? ? ?my $position = rindex ($data,"LHT-");
? ? ? ?$data = substr ($data,6);
? ? ? ?push(@LHT,"$data");

? ? ? ?}

elsif ($data =~ /LMX-/) {

? ? ? ?my $position = rindex ($data,"LMX-");
? ? ? ?$data = substr ($data,6);
? ? ? ?push(@LMX,"$data");

? ? ? ?}

elsif (($data =~ /HP93K/) && (!($data =~ /L/))){

? ? ? ?my $position = rindex ($data,"HP93K");
? ? ? ?$data = substr ($data,7);
? ? ? ?push(@HP93,"$data");

? ? ? ?}

elsif (($data =~ /HP93K/) && ($data =~ /L/)){

? ? ? ?my $position = rindex ($data,8);
? ? ? ?push(@HP93,"$data");
? ? ? ?} elsif ($data =~ /HPPS-/){
? ? ? ?my $position = rindex ($data,"HPPS-");
? ? ? ?$data = substr ($data,7);
? ? ? ?push(@HPPS,"$data");

? ? ? ?}

elsif ($data =~ /HPQD-/){

? ? ? ?my $position = rindex ($data,"HPQD-");
? ? ? ?$data = substr ($data,7);
? ? ? ?push(@HPQD,"$data");

? ? ? ?}

elsif ($data =~ /HPLC-/){

? ? ? ?my $position = rindex ($data,"HPLC-");
? ? ? ?$data = substr ($data,7);
? ? ? ?push(@HPLC,"$data");

? ? ? ?}

elsif ($data =~ /IFLEXC/){

? ? ? ?my $position = rindex ($data,"IFLEXC");
? ? ? ?$data = substr ($data,8);
? ? ? ?push(@IFLEX,"$data");

? ? ? ?}

elsif ($data =~ /UFLEX-/){

? ? ? ?my $position = rindex ($data,"UFLEX-");
? ? ? ?$data = substr ($data,8);
? ? ? ?push(@UFLEX,"$data");

? ? ? ?}

elsif ($data =~ /UFHD-/){

? ? ? ?my $position = rindex ($data,"UFHD-");
? ? ? ?$data = substr ($data,7);
? ? ? ?push(@UFLEX,"$data");

? ? ? ?}

elsif (($data =~ /CAT-ddd/) && (!($data =~ /T$/)) && (!($data =~ /isolated/))){

? ? ? ?my $position = rindex ($data,"CAT-");
? ? ? ?$data = substr ($data,7);
? ? ? ?push(@CAT,"$data");

? ? ? ?}

elsif (($data =~ /CAT-dd/) && (!($data =~ /T$/)) && (!($data =~ /isolated/))){

? ? ? ?my $position = rindex ($data,6);
? ? ? ?push(@CAT,"$data");

? ? ? ?}

elsif (($data =~ /TGR-/) && (!($data =~ /T$/))) {

? ? ? ?my $position = rindex ($data,"TGR-");
? ? ? ?$data = substr ($data,6);
? ? ? ?push(@TGR,"$data");
? ? ? ?}

}


#根据$arg1,确定要收集那些机台的数据
if (($arg1 =~ /^LTXC$/) || ($arg1 =~ /^LHT$/) || ($arg1 =~ /^LMX$/) || ($arg1 =~ /^HP93$/) || ($arg1 =~ /^HP93L$/) || ($arg1 =~ /^HPPS$/) || ($arg1 =~ /^HPQD$/) || ($arg1 =~ /^HPLC$/) || ($arg1 =~ /^IFLEXC$/) || ($arg1 =~ /^UFLEX$/) || ($arg1 =~ /^UFHD$/) ?|| ($arg1 =~ /^CAT$/) || ($arg1 =~ /^TGR$/)) ?{
print "Collecting for all $arg1n";
@tester = @$arg1;

}

elsif (($arg1 =~ /^LTXCd$/) || ($arg1 =~ /^LHT-dd$/) || ($arg1 =~ /^LMX-dd$/) || ($arg1 =~ /^HP93KCd$/) || ($arg1 =~ /^HP93KCdL$/) || ($arg1 =~ /^HPPS-dd$/) || ($arg1 =~ /^HPQD-dd$/) || ($arg1 =~ /^HPLC-dd$/) || ($arg1 =~ /^IFLEXCdd$/) || ($arg1 =~ /^IFLEXCd$/) || ($arg1 =~ /^UFLEX-dd$/) || ($arg1 =~ /^UFHD-dd$/) || ($arg1 =~ /^CAT-dd$/) || ($arg1 =~ /^CAT-ddd$/)|| ($arg1 =~ /^TGR-dd$/) ) ?{

? ? ? ?print "Collecting tester $arg1n";
? ? ? ?@tester = ("$arg1");

}

elsif ($arg1 =~ /^ALL$/) {

print "Collecting for all testern";
@tester = (@LTX,@LHT,@LMX,@HP93,@HPPS,@HPQD,@HPLC,@IFLEX,@UFLEX,@UFHD,@CAT,@TGR);

}

else {

? ? ? ?print "Usage Tester_config_download.pl var1n";
? ? ? ?print "var1 = HPPS ? ? ?--> run for all HPPSn";
? ? ? ?print "var1 = HPPS-01 ? --> run for HPPS-01n";
? ? ? ?print "var1 = ALL --> run for all testern";
? ?print "supported tester platforms are LTX,LHT,LMX,HP93,HPPS,HPQD,HPLC,IFLEX,UFLEX,UFHDn";
? ? ? ?exit 1

}


#根据不同的机台类型在服务器上建立相应的目录
@tester = sort(@tester);
foreach $element (@tester){
? ? ? ?if( !-d "$Dir_server/$element") {
? ? ? ? mkdir "D:/inetpub/ftproot/OTPMS/$element";
}

chdir "D:/inetpub/ftproot/OTPMS/$element";
print "D:/OTPMS/$elementn";

if ( (!($element =~ /CAT/)) && (!($element =~ /TGR/)) ) ?{

print "starting ftp to $element n";

#建立连接

$ftp = connect_ftpserver();
# 开始下载文件
$ftp->binary();
? hosts_retry:
? $err=0;

? if ($element =~ /LTXC*|LHT-*|LMX-*/) {
? ? ? $ftp->cwd($Dir_tester_lcx);
? ? ? print "$Dir_tester_lcxn";
? ? ? mget($ftp,".iu_all_output");

? }

? elsif ($element =~ /^HP93KCd$/) {

? ? ? $ftp->cwd($Dir_tester_hp);
? ? ? mget($ftp,"di_log_file_$year.$month.$date*");

? }

? elsif ($element =~ /^HP93KCdL$/) {

? ? ? $ftp->cwd($Dir_tester_hp);
? ? ? mget($ftp,"di_log_file_$year.$month.$date*");

? }

? elsif($element =~ /HPPS-*|HPQD-*|HPLC-*/){

? ? ? $ftp->cwd($Dir_tester_hp);
? ? ? mget($ftp,"di_log_file_$year.$month.$date*");

? }

? elsif($element =~ /IFLEXC*|UFLEX-*|UFHD-*/){

? ? ? $ftp->cwd($Dir_tester_tera_win) or warn $ftp->message;
? ? ? print "$Dir_tester_tera_winn";
? ? ? mget($ftp,"IGXLEventLog.$month.$date.$year*");

}

? ?$ftp->quit();

}


if ($element =~ /LTXC*|LHT-*|LMX-*/) {
? ?$file = "$Dir_server/$element/.iu_all_output";

}

elsif ($element =~ /^HP93KCd$/) {

? ?$file = "$Dir_server/$element/di_log_file";

}

elsif (($element =~ /^CAT-dd$/) || ($element =~ /^CAT-ddd$/) || ($element =~ /^TGR-/)) {

? ?$file = "$Dir_server/$element/Tconfig";

}


if (($element =~ /LTXC*|LHT-*|LMX-*/) || ($element =~ /^HP93KCd$/) || ($element =~ /^CAT-dd$/) || ($element =~ /^CAT-ddd$/) || ($element =~ /^TGR-/) ) {
if ( -f $file) {
open(FILE,$file) or die "Can't open '$file': $!";

binmode (FILE);

#文件进行MD5加密

$file_md5sum=Digest::MD5->new->addfile(*FILE)->hexdigest;

close(FILE);

print "$file_md5sum $file n";
system ("touch $file_$year_$month_$date");
$md5test2 = 0;
foreach my $element2 (`ls $file_$year_$month_$date*`) {
? ?open(FILE2,$element2) ?or die "Can't open '$element2': $!";
? ?binmode (FILE2);
? ?$file2_md5sum=Digest::MD5->new->addfile(*FILE2)->hexdigest;
? ?close(FILE2);
? ?print "$file2_md5sum $element2 n";
? ?if ($file_md5sum eq $file2_md5sum) {

? ? ? ?$md5test2 = 1;

? ?}

? ?else {

? ? ? ?$md5test1 = 0;
? ?}
? ?if ($element2 =~ /^$file_$year_$month_$date$/) {
? ? ? ?print "Deleting $element2";
? ? ? ?system ("rm $element2");
? ?}
}
? ? ? ?if (($md5test1 == 0) && ($md5test2 != 1)) {
? ? ? ? ? ? system ("cp $file $file_$year_$month_$date_$hour:$minute");
? ? ? ? }

? ?}

}

sub mget {
? ?my ($ftp,$pattern) = @_;
? ?$ftp->binary();

? ?my @array = $ftp->ls($pattern) or $ftp->message;

? ?foreach my $file (@array) {
? ? ? ?$ftp->get($file) or $err=1;
? ? ? ?#$ftp->message();
? ? ? ?if($err == 1) {
? ? ? ? ? ?if($ftp_freq == 3) {
? ? ? ? ? ? ? ?print "FTP fail more then 3 times,".localtime()."n";
? ? ? ? ? ? ? ? ? ?exit 2;
? ? ? ? ? ? ? ?}
? ? ? ? ? ? ? ?++$ftp_freq;
? ? ? ? ? ? ? ?print "Download failed,".$element.localtime()."n";
? ? ? ? ? ? ? ?$ftp->quit();
? ? ? ? ? ? ? ?$ftp = connect_ftpserver();
? ? ? ? ? ? ? ?$ftp->ascii();
? ? ? ? ? ? ? ?$ftp->binary();
? ? ? ? ? ? ? ?goto hosts_retry;
? ? ? ?}
? ? ? ?print "Download file $file from ".$element." is done at ".localtime()."n";
? ?}

}

#连接服务器函数

sub connect_ftpserver {
connect_retry:
}
sub connect_ftpserver {
connect_retry:
? ? ? ?my $err=0;

? ? ?my $ftp = Net::FTP->new("$arg2") or $err=1;
? ? ? ?if($err==1) {
? ? ? ? ? ? ? ?print "Connection failedn";
? ? ? ? ? ? ? ?next;
? ? ? ?}
? ? ? ?$err=0;
? ? ? ?if($element =~ /LTXC*/) {
? ? ? ?$ftp->login("root","SyncMaster") or $err=1
? ? ? ?} elsif($element =~ /LHT-*/) {
? ? ? ?$ftp->login("login_name","login_password") or $err=1
? ? ? ?} elsif($element =~ /LMX-*/) {
? ? ? ?$ftp->login("login_name","login_password") or $err=1
? ? ? ?} elsif($element =~ /HP93K*/) {
? ? ? ?$ftp->login("root","SyncMaster") or $err=1
? ? ? ?} elsif($element =~ /HPPS-*/){
? ? ? ?$ftp->login("login_name","login_password") or $err=1
? ? ? ?} elsif($element =~ /HPQD-*/){
? ? ? ?$ftp->login("login_name","login_password") or $err=1
? ? ? ?} elsif($element =~ /HPLC-*/){
? ? ? ?$ftp->login("login_name","login_password") or $err=1
? ? ? ?} elsif($element =~ /IFLEXC*|UFLEX-*|UFHD-*/){
? ? ? ?$ftp->login("root","root123") or $err=1;
? ? }
? ? ? ?if($err==1) {
? ? ? ? ? ? ? ?print "Login failed,".localtime()."n";
? ? ? ? ? ? ? ?next;
? ? ? ?}
? ? ? ?return $ftp;
? ?}
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读