Perl实现FTP上传,达到分布式文件同步的功能
目的使用到Perl脚本。以使在几台Linux上同步各文件。 环境Perl版本(5.8.0、5.20.1) 逻辑1: 定义FTP目标如: $source{".77.76"}{"SERVER"}="10.10.77.76"; $source{".77.76"}{"PATH"}="/usr/mpsp/lizhiqiang/"; $source{".77.76"}{"USERNAME"}="mpsp"; $source{".77.76"}{"PASSWORD"}="mpsp1234"; 2:使用循环,连上所有的FTP目标(因为分布式机器众多)foreach $tab (keys(%source))继而拿到在1中定义的参数 my $server = $source{$tab}{"SERVER"}; my $path = $source{$tab}{"PATH"}; my $username = $source{$tab}{"USERNAME"}; my $password = $source{$tab}{"PASSWORD"}; 3:开始进行FTP登录等所有操作。参考3.1 理论如下:#!/usr/bin/perl #使用模块Net::FTP use Net::FTP; #创建新的FTP连接 $ftp = Net::FTP->new ( "ftp##",#ftp地址 Timeout => 30 ) or die "Could not connect.n"; #登录用的用户名和密码 $username = 'name'; $password = 'passwd'; #登录到FTP服务器 $ftp->login($username,$password) or die "Could not login.n"; #切换目录 $ftp->cwd('/www/entrez'); #指定远程的文件和本地的文件 $remotefile = "emotefile"; $localfile = "localfile"; #使用get/put方法下载/上传文件 $ftp->put($localfile,$remotefile) or die "Could not put remotefile:$remotefilen"; #$ftp->get($remotefile,$localfile) or die "Could not put localfile:$localfilen"; #退出FTP服务器 $ftp->quit; 参考3.2 实例如下:use Net::FTP; $server = "10.10.38.214"; $path = "/usr/mpsp/lizhiqiang/test1/"; $user = "mpsp"; $password = "mpsp1234"; $ftp = Net::FTP->new($server,Timeout => 30 ) or die "Could not connect.".$server."n"; $ftp->login($user,$password) ; $ftp->cwd($path); $file ="foobarbatbar_a.txt"; $ftp->put($file); PS:里面的逻辑顺序,是不能前后改变了。比如切换目录和登录,绝对不能change。 $ftp->login($user,$password) ; $ftp->cwd($path); 4、循环目录下的文件,使之一个一个全都上传上去。循环目录的方法,也有很多,这里使用了如下: @files=<D:/test/foo/bar/bat/*.*>; foreach my $upfl(@files){ print $upfl."n"; $ftp->put($upfl) or die "Could not put file:$upfln"; print $upfl." iiiiiiiiis put OK!n"; } 即如下: use Net::FTP; $server = "10.10.38.214"; $path = "/usr/mpsp/lizhiqiang/test1"; $user = "mpsp"; $password = "mpsp1234"; $ftp = Net::FTP->new($server,Timeout => 30 ) or die "Could not connect.".$server."n"; $ftp->login($user,$password) ; $ftp->cwd($path); @files=<D:/test/foo/bar/bat/*.*>; foreach my $upfl(@files){ print $upfl."n"; $ftp->put($upfl) or die "Could not put file:$upfln"; print $upfl." iiiiiiiiis put OK!n"; } #$ftp->put($file->stringify) $ftp->quit; 5:全部代码如下#!/usr/bin/perl -w use Net::FTP; use warnings; #use Path::Class; ##getTime YYYYMMDDHHMMSS sub getTime() { my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst)=localtime(); $year+=1900; $mon++; return $year.&format($mon).&format($mday).&format($hour).&format($min).&format($sec); } ##format sub format(){ my ($in) = @_; if($in<10){ $in = "0".$in; } return $in; } ##getYestoday YYYYMMDD sub getYestoday(){ my $lastHourTime = time - 24*60*60; my ($sec,$isdst)=localtime($lastHourTime); $year+=1900; $mon++; return $year.&format($mon).&format($mday); } print getTime()." - ====================n"; print getTime()." - === start stat ! ===n"; print getTime()." - ====================n"; ##1.1 init ftp #ftp log #$source{".5.151"}{"SERVER"}="10.10.5.151"; #$source{".5.151"}{"PATH"}="/duizhang/up/mer/collate/"; #$source{".5.151"}{"USERNAME"}="mpsp"; #$source{".5.151"}{"PASSWORD"}="mpsp1234"; # #$source{".5.152"}{"SERVER"}="10.10.5.152"; #$source{".5.152"}{"PATH"}="/duizhang/up/mer/collate/"; #$source{".5.152"}{"USERNAME"}="mpsp"; #$source{".5.152"}{"PASSWORD"}="mpsp1234"; # #$source{".5.154"}{"SERVER"}="10.10.5.154"; #$source{".5.154"}{"PATH"}="/duizhang/up/mer/collate/"; #$source{".5.154"}{"USERNAME"}="mpsp"; #$source{".5.154"}{"PASSWORD"}="mpsp1234"; $source{".77.76"}{"SERVER"}="10.10.77.76"; $source{".77.76"}{"PATH"}="/usr/mpsp/lizhiqiang/"; $source{".77.76"}{"USERNAME"}="mpsp"; $source{".77.76"}{"PASSWORD"}="mpsp1234"; $source{".38.214"}{"SERVER"}="10.10.38.214"; $source{".38.214"}{"PATH"}="/usr/mpsp/lizhiqiang/test20141110/"; $source{".38.214"}{"USERNAME"}="mpsp"; $source{".38.214"}{"PASSWORD"}="mpsp1234"; ##1.2 upload files to 151,152,154. foreach $tab (keys(%source)) { my $server = $source{$tab}{"SERVER"}; my $path = $source{$tab}{"PATH"}; my $username = $source{$tab}{"USERNAME"}; my $password = $source{$tab}{"PASSWORD"}; print getTime(). " - start ftp key[".$tab ."] server[".$server."] path[".$path."]n"; my $ftp = Net::FTP->new($server,Timeout => 30 ) or die "Could not connect.".$server."n"; $ftp->login($username,$password) or die "Could not login.n"; $yestday = getYestoday(); $pathyearsday = $path.$yestday; if( !$ftp->cwd($pathyearsday)){ print "no filepath: $pathyearsday"."n"; $ftp-> mkdir($pathyearsday); print $pathyearsday ." building is ok!"."n"; } $ftp->cwd($pathyearsday); @files=<D:/test/foo/bar/$yestday/*.*>; #@files=</usr/mpsp/lizhiqiang/$yestday/*.*>; #@files=</duizhang/up/mer/collate/$yestday/*.*>; foreach my $upfl(@files){ $ftp->put($upfl) or die " Could not put file :$upfln"; } $ftp->quit; print getTime(). " - end ftp key[".$tab ."] server[".$server."] path[".$pathyearsday."]n"; } print getTime()." - ====================n"; print getTime()." - === finish stat ! ==n"; print getTime()." - ====================n"; 6: 运行6.1 在windows下运行直接使用自带命令行 perl ftp.pl 查看214下和76下的相关目录下,有没有相关文件,即表示是否成功 6.2 在linux下运行先使用ftp上传工具(ssh),上传到相关目录 然后建立sh文件,如下: /usr/mpsp/lizhiqiang/ftp.pl >> "/usr/mpsp/lizhiqiang/test/logtest.log."`date +%Y%m%d` 2>&1 在linux下运行相关命令 chmod 77 ftp.pl chmod 77 ftp.sh ./ ftp.sh 查看相关目录下,有没有相关文件即可。 6. 在OSX 10.10.2下运行一般系统会自带perl? perl -v 如果没有,参照 http://perl.linuxtoy.org/how-to-get-perl.html 运行: 用cd 命令进入你放ftp.pl的目录
|