目的
使用到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