2016-09-13 11 views
0

В настоящее время у нас есть работа, запущенная на старом сервере Windows (Windows Server 2003), который необходимо перенести на новый сервер из-за того, что старый из них вскоре вышел в отставку. Это задание выполняется как запланированное задание Windows, которое выполняется с частыми интервалами, вызывая скрипт Perl, который шифрует некоторые файлы с помощью открытого ключа поставщика и загружает зашифрованные файлы на внешний FTP-сайт поставщика.Perl-скрипт для шифрования файла с GPG не работает

Я самонаводящийся программист/разработчик/инженер, который не знаком с Perl, но мне было поручено это сделать.

Вот шаги, которые я взял, чтобы получить это происходит:

  1. Установка Perl (Strawberry Perl, используя Windows, Binary ех из strawberryperl.com)
  2. Установки GPG с помощью еха из www.gnugp. com
  3. Добавьте путь к исполняемому файлу GPG в переменную среды Windows «PATH», чтобы ее можно было запустить как «gpg» из командной строки.
  4. Добавить открытый ключ поставщика для GPG с помощью команды gpg --import [path to the key file]
  5. Повышение доверия к импортируемый ключ, чтобы предотвратить оспариваются каждый раз с помощью команды:

    gpg –-edit-key [name of Prudential’s key] trust 5 y

Я тогда взял существующий скрипт внес несколько изменений в некоторые из констант, используемых для путей к файлам и т. д., закомментировал команду, в которой FTP-файлы хранятся (поскольку на данный момент я просто запускаю специальный тест) и попытался запустить ее для шифрования некоторые примеры файлов. Скрипт успешно завершился, но дружественное сообщение об ошибке было создано из-за результата команды, в которой файлы зашифрованы.

Вот часть сценария, где шифрование происходит:

sub encrypt_outgoing_files { 

    # open outgoing decrypted directory 
    &message(sprintf("CD: %s\n", $out_dec_path), 0); 
    if (opendir(OUT_DEC_DIR, $out_dec_path)) { 

     # check for new files 
     &message("Checking for new files\n", 0); 
     my $file; 
     my $new_flag; 
     my %files_hash; 
     foreach $file (readdir(OUT_DEC_DIR)) { 
      if (-f $out_dec_path . $file) { 
       $files_hash{$file} = (stat($out_dec_path . $file))[9];    
      }  
     } 
     my @files = sort { $files_hash{$a} cmp $files_hash{$b} } keys %files_hash; # sort by mtime 
     foreach $file (@files) { 
      if (-f $out_dec_path . $file) { 
       $new_flag = 1;            

       # rename and encrypt this file 
       my $out_file = $file; 
       $out_file =~ s/\.?[0-9]+$//i; # rename outbound files according to this regex 
       &message(sprintf("Encrypting: %s (%s)\n", $file, $out_file), 1);     
       if (!system(sprintf("%s -e \"print('%s')\" | %s --batch --passphrase-fd 0 --output %s --local-user %s --recipient %s --sign --encrypt --cipher-algo %s %s >NUL 2>&1", $perl_path, $pgp_passphrase, $pgp_exe_path, $out_enc_path . $out_file . $pgp_extension, $pgp_sender, $pgp_recipient, $pgp_cipher, $out_dec_path . $file))) { 

        # archive decrypted original 
        &message("Archiving decrypted version\n", 0); 
        rename($out_dec_path . $file, $out_dec_path . $archive_dir . $file); 
       } 

       # error encrypting this file 
       else { 
        unlink($out_enc_path . $out_file . $pgp_extension); # delete partially encrypted file (just in case) 
        &message("Error encrypting file (will try again next time around)\n", 1); 
       } 
      } 
     } 

     # nothing new 
     if (!defined($new_flag)) { 
      &message("None found\n", 0); 
     } 

     # close directory 
     closedir(OUT_DEC_DIR); 

     # clean archive 
     &message(sprintf("CD: %s\n", $out_dec_path . $archive_dir), 0); 
     &clean_dir($out_dec_path . $archive_dir, $max_archive_age); 
    } 

    # invalid directory 
    else { 
     &message(sprintf("Directory not found: %s\n", $out_dec_path), 2); 
    } 
} 

Для каждого файла, я получаю «Ошибка шифрования файла (будет пытаться снова в следующий раз)» сообщение.

Однако, если я попытаюсь зашифровать один из файлов одним GPG с помощью командной строки, файл будет успешно зашифрован.

Итак, у меня есть три вопроса:

  1. Кто-нибудь есть какие-либо идеи, что может быть причиной ошибки?
  2. Как я могу узнать причину ошибки?
  3. Есть ли «лучший» способ выполнить эту задачу, так как этот скрипт был написан более десяти лет назад? Теперь скрипт будет запущен на виртуальной машине Windows 2012 с работающими на ней IIS, Java и ColdFusion.
+2

Можете ли вы перенаправить 'stderr' и' stdout' в некоторый файл (например, '> stdout.log 2> stderr.log' и проверить их потом? – raina77ow

+1

Кроме того, я распечатал результат' sprintf', чтобы убедиться, что линия выглядит так, как должно быть. – raina77ow

+0

@ raina77ow, когда я добавляю перенаправления 'stdout' и' stderr', файл 'stderr' пуст, а' stdout' отображает то, что я обычно вижу в Command Prompe («Error encrypting file ....»). –

ответ

-1

Одна из вещей, которую я обнаружил, - это то, что вы используете для импорта ключей, вы также должны использовать для любой другой задачи, связанной с ключами. попробуйте посмотреть, что