2013-03-20 148 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";