自从实现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

linux ftp perl上传脚本相关推荐

  1. linux ftp匿名只能下载,解决linux ftp匿名上传、下载开机自启问题

    解决linux ftp匿名上传.下载开机自启问题 如果在平时学习,工作中经常使用 FTP 服务器 ,可以设置成开机自启,在设置之前要先了解几个关于自启的命令: 1.chkconfig 命令 主要作用: ...

  2. linux 关闭开机 ftp,解决linux ftp匿名上传、下载开机自启问题

    如果在平时学习,工作中经常使用 ftp 服务器 ,可以设置成开机自启,在设置之前要先了解几个关于自启的命令: 1.chkconfig 命令 主要作用:用于检查,设置系统的各种服务.其中有几个重要参数, ...

  3. linux ftp 550 下载,linux ftp服务器上传文件夹时提示550错误问题解决方法

    linux ftp服务器上传文件夹时提示550错误问题解决方法 标签: linux ftp服务器 550 中文文件夹上传错误 问题 分类: 计算机 2010-11-06 22:47 前几天在实验室搭配 ...

  4. linux ftp 不能上传,linux ftp用户没法上传。

    write_enable=YES //是否对登录用户开启写权限.属全局性设置.默认NO local_enable=YES //是否允许本地用户登录FTP服务器.默认为NO anonymous_enab ...

  5. DOS批处理实现“自动FTP批量上传文件”功能

    引: 应人所求对 代收代发格式转换工具 生成的数据文件,通过手工的方式分别分类上传至服务器中每个用户指定的路径下,虽也可以通过手工的方式一步一步的来完成.但是,当用户比较多(几十或者几百个)那这个重复 ...

  6. linux禁止客户端上传文件_Linux下Shell脚本实现FTP自动上传和下载文件

    概述 之前测试写的一个脚本,主要是为了实现FTP自动上传和下载文件.大家可以参考下: 基础环境配置 [root@pxzxdm01 ~]# useradd -d /home/ftp1 ftp1 [roo ...

  7. Linux 终端访问 FTP 及 上传下载 文件

    今天同事问我一个问题,在Linux 下访问FTP,并将文件上传上去. 我之前一直是用WinSCP工具的. 先将文件从linux copy到windows下,然后在传到ftp上. google 一下. ...

  8. Linux 终端訪问 FTP 及 上传下载 文件

    今天同事问我一个问题,在Linux 下訪问FTP,并将文件上传上去. 我之前一直是用WinSCP工具的. 先将文件从linux copy到windows下,然后在传到ftp上. google 一下. ...

  9. ftp linux 推送文件_Linux下SSH用FTP命令上传文件至另一个FTP空间

    如果没有ftp 提示: -bash: ftp: command not found 请先安装ftp应用程序: yum install ftp #ftp 127.0.0.1 21 输入远程空间的FTP ...

最新文章

  1. GPU端吊打RegNet、EfficientNet的强悍担当:GENet
  2. java外观设计修改_Java设计模式之外观模式和装饰器模式的设计(精选)
  3. 执行计划组件、组件、老化
  4. linux内核定时唤醒,Linux内核时钟与定时器的实现
  5. 《程序是怎么跑起来的》第六章
  6. HDU多校2 - 6774 String Distance(序列自动机优化lcs)
  7. 微信小程序---转发分享功能
  8. 如何在ESXi 5.5主机上安装ESXi 5.5客户机
  9. 圣诞祝福网页_平安夜圣诞节适合发朋友圈的文案,快快收藏起来!
  10. php编写半径为4圆的周长,在C++中编写程序输入半径计算圆的周长和面积,来学习吧...
  11. 阿里云前端周刊 - 第 25 期
  12. redis安全设置及主从配置
  13. 【渝粤教育】国家开放大学2018年秋季 1356T高级英语听说(2) 参考试题
  14. Hyperledger Fabric教程(9)-- peer命令-通道channel
  15. SpringBoot下载项目中文件
  16. 常用的Linux 系统监控工具
  17. Java实现 洛谷 P1159 排行榜
  18. 智能化推送服务MobPush产品简介
  19. python 写文件的疑问
  20. RESTful接口入门

热门文章

  1. DTD – XML 构建模块概述
  2. HDU2925(约瑟夫环问题)
  3. java se 7u67_Linux下安装jdk-7u67-linux-x64.rpm
  4. android setting.java,Android Setting 启动流程总结
  5. java append concat_关于java:+ =比concat更有效吗?
  6. c 与matlab混编,谈谈Matlab与C/C++或C#的互调用(混合编程)
  7. 怎么用mysql来统计消费金额限制_mysql——用户消费行为分析
  8. 2018年第十届ACM四川省省赛题解(10 / 11)
  9. 西北工业大学计算机网络实验报告2,西北工业大学《网络性能测试》实验报告...
  10. 第k大 or 第k小 or 中位数