使用Net::sftp::Foreign下载Perl sftp

使用Net::sftp::Foreign下载Perl sftp,perl,Perl,我是初学者。我已经编写了一个perl脚本,它执行以下操作 -如果尚未创建目录,请在当前日期之前以“YYYYMMDD”格式在“/x01/abc\u logs/abc\u logs/abc\u logs”下创建目录。 i、 e:如果脚本在“2013年1月01日”运行,则将在所述路径下创建目录“20130101”。因此,每当需要检查日志时,总是在当前日期前查找目录 -检查日志文件是否已在当天早些时候下载,如果没有,日志将下载到今天的目录中 我有一个困难的时候,想出一个解决方案打印消息时,没有文件在共享

我是初学者。我已经编写了一个perl脚本,它执行以下操作

-如果尚未创建目录,请在当前日期之前以“YYYYMMDD”格式在“/x01/abc\u logs/abc\u logs/abc\u logs”下创建目录。 i、 e:如果脚本在“2013年1月01日”运行,则将在所述路径下创建目录“20130101”。因此,每当需要检查日志时,总是在当前日期前查找目录

-检查日志文件是否已在当天早些时候下载,如果没有,日志将下载到今天的目录中

我有一个困难的时候,想出一个解决方案打印消息时,没有文件在共享。当然,当用户指定共享中不存在的2个或更多文件时,就会出现这种情况。我知道发生这种情况是因为“sub get_log”中有一个“die”语句。当我指定的所有文件都不在共享中时,我似乎无法理解如何返回消息

此脚本的用法如下所示

/abc_日志

下面是脚本

my $LOGS_LOCAL_PATH = "/x02/abc/abcba2/";
chomp $LOGS_LOCAL_PATH;
my $LOGS_REM_PATH = "/x01/INT/abc/vabc2/";
chomp $LOGS_REM_PATH;
my $TODAY = `date +%Y%m%d`;
chomp $TODAY;
my @GETLOOP = @ARGV;
    unless ($#ARGV >= 0) {
        print "\nUsage: gtp_logs.pl <file1> <file2> <file3>.....<file(n)>\n\n";
        exit;
    }
        system("clear");
    unless ( -d "$LOGS_LOCAL_PATH"."$TODAY") {
        print "Directory \"$TODAY\" doesn't exist. So creating the directory..!\n";
        print "OK..Done.....!\n\n";
        system("mkdir $LOGS_LOCAL_PATH/$TODAY");
        }
    else {
        print "Directory already exists. Logs will be downloaded to ==>     \"$LOGS_LOCAL_PATH$TODAY\".....!\n\n";
    }
    
               # if_DOWNLOADED($LOGS_LOCAL_PATH,$TODAY,@GETLOOP);
    
    chdir("$LOGS_LOCAL_PATH"."$TODAY") || die "cannot cd to  ($!)";
    foreach my $GETL (@GETLOOP) {
    my $is_downloaded = if_DOWNLOADED($LOGS_LOCAL_PATH,$TODAY,$GETL);
    if(!$is_downloaded)
    {
        get_LOGS("172.25.70.221","abc","abc2","/x01/INT/abc",$GETL);
        print "File \"$GETL\" downloaded to ==>          \"$LOGS_LOCAL_PATH$TODAY\"\n\n";
    }
    else
    {
        print "File \"$GETL\" has already been Downloaded to ==>          \"$LOGS_LOCAL_PATH$TODAY\"\n\n";
    }
    
    
    }
    

 sub get_LOGS {
    my $LOG_HOST  = shift;
    my $REM_USER  = shift;
    my $REM_PASSW = shift;
    my $REM_PATH  = shift;
    my $REM_FILE  = shift;
    
        print "Connecting to the sftp share! Please wait....!\n";
        my $sftp = Net::SFTP::Foreign->new($LOG_HOST, user => $REM_USER, password => $REM_PASSW);
        $sftp->setcwd($REM_PATH) or die "unable to change cwd: " . $sftp->error;
        print "OK. On the share! Downloading the file \"$REM_FILE\"...................!\n\n\n\n";
        $sftp->error and die "Problem connecting to the share...!!!! " . $sftp->error;
        $sftp->get($REM_FILE) or die "File does not seem to be present on the remote share. Please re-request..!!!" . $sftp->error;
        return $REM_FILE;
}
   
sub if_DOWNLOADED {
    my $DWD_FILE_PATH = shift;
    my $DWD_DIR       = shift;
    my $DWD_FILE      = shift;
    if (-e "$DWD_FILE_PATH/$DWD_DIR/$DWD_FILE")
    {
        return 1;
    }
    else
    {
        return 0;
    }
}
my$LOGS\u LOCAL\u PATH=“/x02/abc/abcba2/”;
chomp$LOGS\u LOCAL\u PATH;
我的$LOGS_REM_PATH=“/x01/INT/abc/vabc2/”;
chomp$LOGS\u REM\u PATH;
my$TODAY=`date+%Y%m%d`;
今天就吃美元;
我的@GETLOOP=@ARGV;
除非($#ARGV>=0){
打印“\n用法:gtp_logs.pl….\n\n”;
出口
}
系统(“清除”);
除非(-d“$LOGS\u LOCAL\u PATH”。$TODAY”){
打印“目录\“$TODAY\”不存在。因此创建目录..!\n”;
打印“确定..完成..!\n\n”;
系统(“mkdir$LOGS\u LOCAL\u PATH/$TODAY”);
}
否则{
打印“目录已存在。日志将下载到==>\”$Logs\u LOCAL\u PATH$TODAY\“…!\n\n”;
}
#如果下载($LOGS\u LOCAL\u PATH,$TODAY,@GETLOOP);
chdir($LOGS\u LOCAL\u PATH.“$TODAY”)| | die“无法cd到($!)”;
foreach my$GETL(@GETLOOP){
my$is\u download=如果下载($LOGS\u LOCAL\u PATH,$TODAY,$GETL);
如果(!$已下载)
{
获取日志(“172.25.70.221”,“abc”,“abc2”,“/x01/INT/abc”,“$GETL”);
打印下载到==>“$LOGS\u LOCAL\u PATH$TODAY\”\n\n的“文件\“$GETL\”;
}
其他的
{
打印“文件\“$GETL\”已下载到==>“$LOGS\u LOCAL\u PATH$TODAY\”\n\n;
}
}
子日志{
my$LOG\u HOST=shift;
我的$REM_用户=班次;
我的$REM_PASSW=班次;
我的$REM_路径=移位;
我的$REM_文件=移位;
打印“连接到sftp共享!请稍候…”!\n;
我的$sftp=Net::sftp::Foreign->new($LOG\u HOST,user=>$REM\u user,password=>$REM\u PASSW);
$sftp->setcwd($REM_路径)或die“无法更改cwd:”.$sftp->错误;
打印“确定。在共享上!下载文件\“$REM\U文件\”……!\n\n\n”;
$sftp->错误和死亡“连接到共享时出现问题…!!”。$sftp->错误;
$sftp->get($REM_文件)或die“文件似乎不在远程共享上。请重新请求..!!!”$sftp->错误;
返回$REM_文件;
}
如果下载了sub{
my$DWD_FILE_PATH=shift;
my$DWD_DIR=班次;
my$DWD_FILE=shift;
if(-e“$DWD_文件路径/$DWD_目录/$DWD_文件”)
{
返回1;
}
其他的
{
返回0;
}
}
有人能帮我找到解决这件事的办法吗?请尝试使用相同的脚本并修改


/V

对代码的一些注释:

  • 使用“严格”和“警告”,以便尽早捕获大量错误

  • 阅读一些关于风格的书(如Damian Conway的Perl最佳实践)。但是在任何情况下,在命名变量、子例程和所有东西以及它们的大小写时都要尽量保持一致

  • 当您必须在多个位置使用某些计算值时,请尝试计算一次并将其保存在变量中

  • 不要将子程序用于琐碎的事情

  • 您不需要对已定义且结尾没有
    “\n”
    字符的变量调用
    chomp

  • 为每次文件传输打开一个新的SFTP连接是非常低效的。您可以在开始时只打开一个,并将其用于所有传输

现在,是脚本的简化版本:

#!/usr/bin/perl

use strict;
use warnings;

my $host = "172.25.70.221";
my $user = "abc";
my $password = "abc1234321";

my $LOGS_LOCAL_PATH = "/x02/ABC/abc2";
my $LOGS_REM_PATH = "/x01/INT/abc/vim";
my $TODAY = `date +%Y%m%d`;
chomp $TODAY;
my $TODAY_LOCAL_PATH = "$LOGS_LOCAL_PATH/$TODAY";

my @files = @ARGV;
@files or die "\nUsage: gtp_logs.pl <file1> <file2> <file3>.....<file(n)>\n\n";

system("clear");

if ( -d $TODAY_LOCAL_PATH) {
    print "Directory already exists. Logs will be downloaded to ==>     \"$TODAY_LOCAL_PATH\".....!\n\n";
}
else {
    print "Directory \"$TODAY\" doesn't exist. So creating the directory..!\n";
    mkdir "$TODAY_LOCAL_PATH" or die "unable to create directory: $!\n";
    print "OK..Done.....!\n\n";
}

chdir $TODAY_LOCAL_PATH or die "cannot cd to  ($!)\n";

my $sftp =  Net::SFTP::Foreign->new($host, user => $user, password => $password);
$sftp->error
    and die "Problem connecting to the share...!!!! " . $sftp->error;

my $ok = 0;
my $failed = 0;
foreach my $file (@files) {
    if (-e "$TODAY_LOCAL_PATH/$file") {
        print "File \"$file\" has already been Downloaded to ==>          \"$TODAY_LOCAL_PATH\"\n";
    }
    else {
        if ($sftp->get("$LOGS_REM_PATH/$file")) {
            print "File \"$file\" downloaded to ==>          \"$TODAY_LOCAL_PATH\"\n";
            $ok++;
        }
        else {
            print "Unable to download file \"$file\" : " . $sftp->error . "\n";
            $failed++;
        }
    }
}

print "$ok files have been downloaded, $failed files failed!\n\n";    
#/usr/bin/perl
严格使用;
使用警告;
my$host=“172.25.70.221”;
my$user=“abc”;
我的$password=“abc1234321”;
我的$LOGS\u LOCAL\u PATH=“/x02/ABC/abc2”;
我的$LOGS\u REM\u PATH=“/x01/INT/abc/vim”;
my$TODAY=`date+%Y%m%d`;
今天就吃美元;
my$TODAY\u LOCAL\u PATH=“$LOGS\u LOCAL\u PATH/$TODAY”;
我的@files=@ARGV;
@文件或模具“\n用法:gtp_logs.pl….\n\n”;
系统(“清除”);
如果(-d$TODAY\u LOCAL\u PATH){
打印“目录已存在。日志将下载到==>\”$TODAY\u LOCAL\u PATH\“…!\n\n”;
}
否则{
打印“目录\“$TODAY\”不存在。因此创建目录..!\n”;
mkdir“$TODAY\u LOCAL\u PATH”或die“无法创建目录:$!\n”;
打印“确定..完成..!\n\n”;
}
chdir$TODAY\u LOCAL\u PATH or die“无法cd到($!)\n”;
我的$sftp=Net::sftp::Foreign->new($host,user=>$user,password=>$password);
$sftp->错误
和死“问题连接到共享…!!”$sftp->错误;
我的$ok=0;
我的$failed=0;
foreach my$文件(@files){
如果(-e“$TODAY\u LOCAL\u PATH/$file”){
打印“文件\“$File\”已下载到==>“$TODAY\u LOCAL\u PATH\”\n;
}
否则{
如果($sftp->get($LOGS\u REM\u PATH/$file))){
打印下载到==>“$TODAY\u LOCAL\u PATH\”的“文件\”$File\”\n;
$ok++;
}
否则{
打印“无法下载文件\“$file\”:“$sftp->错误”。\n”;
$failed++;
}
}
}
打印“$ok文件已下载,$failed文件失败!\n\n”;

请不要使用
,除非。。。else
constructi