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

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

发布时间:2020-12-15 23:51:25 所属栏目:大数据 来源:网络整理
导读:目的 使用到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";$so

目的

使用到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的目录
(让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('foobarbat*.*');
foreach (@list){
my $file = $_;
print "$filen";
}

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

(编辑:李大同)

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

    推荐文章
      热点阅读