您的位置:首页 > 编程语言 > PHP开发

Perl实现FTP上传,达到分布式文件同步的功能

2014-11-11 16:14 489 查看

目的

使用到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:$remotefile\n";
#$ftp->get($remotefile,$localfile) or die "Could not put localfile:$localfile\n";
#退出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 ="foo\\bar\\bat\\bar_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:$upfl\n"; 
		   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:$upfl\n"; 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,$min,$hour,$mday,$mon,$year,$wday,$yday,$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 :$upfl\n";
}

$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的目录

(让ftp.pl可执行) 敲 chmod +x ftp.pl

敲(注意是一点加一斜杠) ./ftp.pl

7:其它遍历文件的方法

如下 6.1 :

#!/usr/bin/perl
use strict;
use warnings;
use File::Copy ;

use Path::Class;

my $dir = dir('foo/bar','bat'); # foo/bar
#my $dir = dir('foo/bar','bat'); # foo/bar
#目录2个空,一个空,都可以的。
#在哪一个里面,都可以加子目录路径的

# Iterate over the content of foo/bar
while (my $file = $dir->next) {
    
    # See if it is a directory and skip
    next if $file->is_dir();
    
    # Print out the file name and path
    
	print $file->stringify . "\n";
	print $file ."\n";
	# print unlink $file  or warn "failed on"."\n";
	#rename $file,"new" or warn "failed on $file:$!"."\n";
	#copy($file,"foo/bar/bat") or warn "could not copy files :$!"."\n" ;
	
}


如下 6.2:

use Path::Class;
use Net::FTP;
use File::Glob ':glob';
@list = bsd_glob('foo\bar\bat\*.*');
foreach (@list){
my $file = $_;
print "$file\n";
}


4 总结

其实接触Perl,两天还不到,参考文件,大都从官网和同事帮助,才完成。

4.1 官网

从安装,到第一个程序的编写,到文件的遍历。官网都有。

Learn Perl - learn.perl.org
http://learn.perl.org/

4.2 Perl编程思想

Perl的学习,除了官网的英文文档外,还有一本中文电子书,基本上是从官网翻译过来的。

for free. very nice

Perl编程思想

http://docs.linuxtone.org/ebooks/Perl/Perl%E7%BC%96%E7%A8%8B%E6%80%9D%E6%83%B3.pdf
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: