2013-03-20 149 views
1

我是一个初学者。我写了一个perl脚本,它执行以下操作:Perl的SFTP下载与网:: SFTP ::外国

- 在当前日期的“/ x01/abcd/abc_logs/abcd_Logs”下创建一个目录,格式为“YYYYMMDD”(如果尚未创建)。 即:如果脚本在“2013年1月1日”上运行,则目录“20130101”将在所述路径下创建。因此,无论何时需要检查日志,都要在当前日期之前查找目录。

- 检查日志文件是否已经在同一天早些时候下载,如果没有日志将被下载到TODAY的目录中。

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

使用这个脚本的是如下

./abc_logs ....

以下是脚本。

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; 
    } 
} 

请有人可以帮我找到解决这个问题?请尝试使用相同的脚本并进行修改。

/V

+0

请不要使用'除非...... else'建设。 – Toto 2013-05-01 16:25:25

回答

3

一些评论你的代码:

  • 使用严格和警告,以便及早发现很多错误。

  • 阅读一些关于风格的书(即Damian Conway的Perl最佳实践)。但在任何情况下,在命名变量,子例程和所有内容时都要尽量保持一致,并且也要考虑到它们的情况。

  • 当你必须在几个地方使用一些计算的值时,试着计算一次并保存在一个变量中。

  • 不要使用子例程来做简单的事情。

  • 您无需在您定义的变量上调用chomp,也不需要在末尾没有"\n"字符。

  • 为每个文件传输打开一个新的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";