linux ftp perl上传脚本

简介:
   自从实现FTP上传功能之后就一直未停止过对脚本的改进,但改来改去shell脚本还是有些地方做不过于是把脚本换成perl脚本了,该脚本为避免工作中服务器调整的原因造成忘记更脚本变量,所以就直接去抓取另一个备份数据的脚本里的变量然后分割为FTP服务器上的用户名跟所需要上传至FTP的目录,开始是实现不了判断FTP服务器上是否存在目录问题,目前已解决,先上传抓取切换目录的信息,如果信息里有报错就走创建目录后上传文件语句,如果没有问题就直接上传。上脚本了
#!/usr/bin/perl 
my $user="root";
my $password="xx";
my $host="localhost";
my $datapath="/databasedb/setup/data/";
my $file="$datapath/log_everyday.csv";
my $FTP_ADDR="xx 21";
my $FTP_pass="xx";
############################################################################
################获取系统时间 时间格式为xxxx-xx-xx为当系统时间,变量为$date
#本小段脚本参照: http://bbs.chinaunix.net/viewthread.php?tid=821196
############################################################################
sub getTime
{
    my $time = shift || time();
    my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime($time);
    $year += 1900;
    $mon ++;
    $min  = '0'.$min  if length($min)  < 2;
    $sec  = '0'.$sec  if length($sec)  < 2;
    $mon  = '0'.$mon  if length($mon)  < 2;
    $mday = '0'.$mday if length($mday) < 2;
    $hour = '0'.$hour if length($hour) < 2;
    my $weekday = ('Sun','Mon','Tue','Wed','Thu','Fri','Sat')[$wday];
    return { 'second' => $sec,
             'minute' => $min,
             'hour'   => $hour,
             'day'    => $mday,
             'month'  => $mon,
             'year'   => $year,
             'weekNo' => $wday,
             'wday'   => $weekday,
             'yday'   => $yday,
             'date'   => "$year-$mon-$mday"
          };
}
my $date=getTime();
my $date=$date->{date};
###注由于下面文件需要日期变量放在变量下面引用。。
my $accountfile="$datapath/tbl_sch_account$date.csv";
my $charactorfile="$datapath/tbl_sch_charactor$date.csv";
open(STR,"/databasedb/mcsh") or die "Can't open the file $!";
while($line=<STR>){
$string = $line if$line =~ /str=/;
}
@SP = split(/=/,$string);
@FTP_dir = split(/_/,$SP[1]);
#################################################################################
#
#FTP_dir是取至/databasedb/mcsh的含有str=字符行的=与_之间的数据
#
################################################################################
#####################################################################################################################
#
#substr,0表示从左边开始,-2表示删除最右边两位数,两位数正则往左边,负为右边
#
########################################################################################################################
$FTP_username=substr($FTP_dir[0],0,-2);
if (!$FTP_username){
print "请确认/databasedb/mcsh下=与_符号或str=字符是否存在。。,\n";
exit;
}
elsif($FTP_username =~ /%y%m%d%H%M/){
print "请核对str=字符串问题。。,\n";
exit;
}else{
print "OK...继续下一步!\n";
}
#*****************
#
#从MYSQL库里提取数据
#
#********************
use DBI;
my $driver="DBI:mysql";
my $log_everyday="select id,onlineMax,onlineAvg,activeIdNum,payIdNum,payIdNumAll,payNum,newAccount,goldUse,addTime from gameLog.log_everyday;";
my $tbl_sch_charactor="select id,guid,name,gender,tg,`to`,classId,exp,expSkill,exPoint from database.tbl_sch_charactor order by id;";
my $tbl_sch_account="select id,last,lastIp from database.tbl_sch_account;";
my $dbh=DBI->connect("$driver:database=$database;host=$host;user=$user;password=$password") ;
$dbh->do("set names utf8;") or die "Can't set names". dbh->errstr;
my $sth=$dbh->prepare($log_everyday) or die "Can't connect: ". sth->err;
$sth->execute() or die sth->err;
print "*"x20,"\n","提取log_everyday表里的数据,\n","*"x20,"\n";
my($id,$onlineMax,$onlineAvg,$activeIdNum,$payIdNum,$payIdNumAll,$payNum,$newAccount,$goldUse,$addTime);
$sth->bind_columns(\$id,\$onlineMax,\$onlineAvg,\$activeIdNum,\$payIdNum,\$payIdNumAll,\$payNum,\$newAccount,\$goldUse,\$addTime);
open (HEAD,">$file")|| die "Can't open $accountfile:$!\n";
printf HEAD "%s\t%-s\t%-s\t%-s\t%-s\t%-s\t%-s\t%-s\t%-s\t%-s\n","id","onlineMax","onlineAvg","activeIdNum","payIdNum","payIdNumAll","payNum","newAccount","goldUse","addTime";
while($sth->fetch()){
open (HEAD,">>$file")|| die "Can't open newfile:$!\n";
printf HEAD "%s\t%-s\t%-s\t%-s\t%-s\t%-s\t%-s\t%-s\t%-s\t%-s\n",$id,$onlineMax,$onlineAvg,$activeIdNum,$payIdNum,$payIdNumAll,$payNum,$newAccount,$goldUse,$addTime;
}
my $sth_account=$dbh->prepare($tbl_sch_account) or die "Can't connect: ". $sth_account->err;
$sth_account->execute() or die $sth_account->err;
print "提取表tbl_sch_account数据。。。\n";
my($id,$last,$lastIP);
$sth_account->bind_columns(\$id,\$last,\$lastIP);
open (HEAD,">$accountfile")|| die "Can't open $accountfile:$!\n";
printf HEAD "%s\t%-s\t%-s\n","id","last","lastIP";
while($sth_account->fetch()){
open (HEAD,">>$accountfile")|| die "Can't open newfile:$!\n";
printf HEAD "%s\t%-s\t%-s\n",$id,$last,$lastIP;
}
#tbl_sch_charactor 
print "提取tbl_sch_charactor表数据\n";
my $tbl_charactor=$dbh->prepare($tbl_sch_charactor) or die "Can't connect: ". $tbl_charactor->errstr ;
$tbl_charactor->execute() or  die $tbl_charactor->errstr;
my($id,$guid,$name,$gender,$tg,$to,$classId,$exp,$expSkill,$exPoint);
$tbl_charactor->bind_columns(\$id,\$guid,\$name,\$gender,\$tg,\$to,\$classId,\$exp,\$expSkill,\$exPoint);
open (SELECTOUT,">$charactorfile")|| die "Can't open newfile:$!\n";
printf SELECTOUT "%-s\t%-s\t%-s\t%-s\t%-s\t%-s\t%-s\t%-s\t%-s\t%-s\n","id","guid","name","gender","tg","to","classId","exp","expSkill","exPoint";
while($tbl_charactor->fetch()){
open (SELECTOUT,">>$charactorfile")|| die "Can't open newfile:$!\n";
printf SELECTOUT "%-s\t%-s\t%-s\t%-s\t%-s\t%-s\t%-s\t%-s\t%-s\t%-s\n",$id,$guid,$name,$gender,$tg,$to,$classId,$exp,$expSkill,$exPoint;
}
#####################
##FTP上传
#本小段参考: http://www.diybl.com/course/4_webprogram/cgi/perljs/200862/120244.html
###################################################################################
use Net::FTP;
$ftp=Net::FTP->new("$FTP_ADDR",Timeout=>30) or die "Could not connect.\n";
#登录到FTP
$ftp->login($FTP_username,$FTP_pass) or die "Could not login.\n";
#切换目录
$ftp->cwd("/$FTP_dir[0]") ,$FTP_error=$ftp->message;
if ( $FTP_error =~ /Failed/){
print  "FTP返回目录不存在错误信息,开始创建目录$FTP_dir[0]...,\n";
$ftp->mkdir($FTP_dir[0]);
print "$FTP_dir[0]目录创建完毕..并切换到目录创建目录,\n";
$ftp->cwd("/$FTP_dir[0]");
print "开始上传文件$file...\n";
$ftp->put($file) or die "上传$file失败。。。,\n";
$ftp->put($charactorfile) or die "上传$charactorfile失败。。。,\n";
$ftp->put($accountfile) or die "上传$accountfile失败。。。,\n";
$ftp->quit;
}
else
{
$ftp->put($file) or die "上传$file失败。。。,\n";
$ftp->put($charactorfile) or die "上传$charactorfile失败。。。,\n";
$ftp->put($accountfile) or die "上传$accountfile失败。。。,\n";
$ftp->quit;
}
print "上传文件$file,$charactorfile,$accountfile至FTP的$FTP_dir[0]完成。。。,\n";
 
 
 
下面是以前的shell脚本
 
#!/bin/bash
str=`date +%Y-%m-%d`  
path="/database/setup/data"
logpath="/var/log/ftpdata.log"
#从/database/mcsh脚本里取相关FTP的用户及目录字段并判断是否正确正确则上传至FTP
dir=` cat /database/mcsh |grep str=|awk -F = '{print $2}'|awk -F _ '{print $1}'`
user=`echo $dir|sed 's/[0-9]\{2\}$//'`
ftppath="/DataCenter/DataCenter/$user/$dir"
if [ ! -f /database/mcsh ]
then
exit
echo "请核对/database/mcsh文件是否存在" >> $logpath 2>&1
fi
string="`echo $user|grep \.gz`"
if [ -z "$user" ]
then
echo "`date +%Y-%m-%d\ %R` FTP传递参数有误请核对/database/mcsh文件的str里的=与_间隔是否与FTP的用户及目录对应" >> $logpath 
elif [ ! -z "$string" ]
then
echo "`date +%Y-%m-%d\ %R` FTP传递参数有误数据中心不存在$ftppath目录请核对/database/mcsh文件的str里的=与_间隔是否与FTP的用户及目录对应" >> $logpath
else
mysql -ppassword -e 'select * from gameLog.log_everyday;' > $path/log_everyday.txt
cd $path
#sed 1d log_everyday.txt > log_everyday.csv
#rm -rf log_everyday.txt
mv log_everyday.txt  log_everyday.csv
ftp -n <<EOF
open xxx 21
user $user password
binary
prompt off
cd $dir
mput *
bye
EOF
echo "`date +%Y-%m-%d\ %R` 上传至FTP的$ftppath !!!" >> $logpath  
fi

本文转自 qwjhq 51CTO博客,原文链接:http://blog.51cto.com/bingdian/278341
相关文章
|
4月前
|
Java Linux
自定义linux脚本用于快速jar包启动、停止、重启
自定义linux脚本用于快速jar包启动、停止、重启
238 29
|
4月前
|
Linux Shell
Centos或Linux编写一键式Shell脚本删除用户、组指导手册
Centos或Linux编写一键式Shell脚本删除用户、组指导手册
113 4
|
4月前
|
Linux Shell 数据安全/隐私保护
Centos或Linux编写一键式Shell脚本创建用户、组、目录分配权限指导手册
Centos或Linux编写一键式Shell脚本创建用户、组、目录分配权限指导手册
252 3
|
5月前
|
Linux Shell
在Linux、CentOS7中设置shell脚本开机自启动服务
以上就是在CentOS 7中设置shell脚本开机自启动服务的全部步骤。希望这个指南能帮助你更好地管理你的Linux系统。
378 25
|
5月前
|
安全 Linux
阿里云linux服务器使用脚本通过安全组屏蔽异常海外访问ip
公网网站可能会遭受黑客攻击导致访问异常,使用此脚本可以屏蔽掉异常IP 恢复访问。也可自行设置定时任务定期检测屏蔽。
420 28
|
7月前
|
Shell Linux
【linux】Shell脚本中basename和dirname的详细用法教程
本文详细介绍了Linux Shell脚本中 `basename`和 `dirname`命令的用法,包括去除路径信息、去除后缀、批量处理文件名和路径等。同时,通过文件备份和日志文件分离的实践应用,展示了这两个命令在实际脚本中的应用场景。希望本文能帮助您更好地理解和应用 `basename`和 `dirname`命令,提高Shell脚本编写的效率和灵活性。
561 32
|
7月前
|
存储 Linux 网络安全
linux应急响应检查脚本
通过这个脚本,可以快速收集系统的关键信息,有助于在发生问题时进行及时的应急响应和分析。
236 34
|
9月前
|
消息中间件 Java Kafka
【手把手教你Linux环境下快速搭建Kafka集群】内含脚本分发教程,实现一键部署多个Kafka节点
本文介绍了Kafka集群的搭建过程,涵盖从虚拟机安装到集群测试的详细步骤。首先规划了集群架构,包括三台Kafka Broker节点,并说明了分布式环境下的服务进程配置。接着,通过VMware导入模板机并克隆出三台虚拟机(kafka-broker1、kafka-broker2、kafka-broker3),分别设置IP地址和主机名。随后,依次安装JDK、ZooKeeper和Kafka,并配置相应的环境变量与启动脚本,确保各组件能正常运行。最后,通过编写启停脚本简化集群的操作流程,并对集群进行测试,验证其功能完整性。整个过程强调了自动化脚本的应用,提高了部署效率。
2079 1
【手把手教你Linux环境下快速搭建Kafka集群】内含脚本分发教程,实现一键部署多个Kafka节点
|
10月前
|
Ubuntu Linux Shell
Linux 系统中的代码类型或脚本类型内容
在 Linux 系统中,代码类型多样,包括 Shell 脚本、配置文件、网络配置、命令行工具和 Cron 定时任务。这些代码类型广泛应用于系统管理、自动化操作、网络配置和定期任务,掌握它们能显著提高系统管理和开发的效率。
146 1
|
10月前
|
运维 监控 Shell
深入理解Linux系统下的Shell脚本编程
【10月更文挑战第24天】本文将深入浅出地介绍Linux系统中Shell脚本的基础知识和实用技巧,帮助读者从零开始学习编写Shell脚本。通过本文的学习,你将能够掌握Shell脚本的基本语法、变量使用、流程控制以及函数定义等核心概念,并学会如何将这些知识应用于实际问题解决中。文章还将展示几个实用的Shell脚本例子,以加深对知识点的理解和应用。无论你是运维人员还是软件开发者,这篇文章都将为你提供强大的Linux自动化工具。