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:$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


  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不止鱼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值