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下运行
一般系统会自带perlperl -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
相关文章推荐
- 解决QNetworkAccessManager实现ftp功能后,不能上传大于1G文件的问题
- 用Linux Shell实现FTP上传文件并确认是否成功功能
- php使用ftp实现文件上传与下载功能
- 使用.net FtpWebRequest 实现FTP常用功能 上传 下载 获取文件列表 移动 切换目录 改名
- 利用FTPClient类实现文件的上传下载功能
- ftp文件上传功能实现
- java实现ftp文件上传下载功能
- DOS批处理实现“自动FTP批量上传文件”功能
- 利用commons-net-3.2.jar实现ftp文件上传功能
- 利用Apache的commons-net实现FTP的文件读取、上传、下载、删除和移动功能
- linux下实现ftp匿名用户的上传和下载文件功能
- 用ASP.NET的FileUpload控件实现带对话框的FTP文件上传功能
- 利用FTPClient类实现文件的上传下载功能
- Java代码使用FTPClient实现ftp文件上传下载和删除的功能
- 利用FTPClient类实现文件的上传下载功能
- JAVA实现FTP服务器文件的上传,下载,删除功能
- FTP客户端--实现FTP文件的上传下载功能
- Java实现FTP文件的上传和下载功能的实例代码
- linux下实现ftp匿名用户的上传和下载文件功能
- 使用Flex实现FTP文件上传功能