2016-09-13 12 views
0

現在、古いサーバーがWindows Server 2003上で実行されているため、新しいサーバーに移動する必要があります。このジョブは、頻繁な間隔で実行されるWindowsのスケジュールされたタスクとして実行され、ベンダーの公開鍵を使用して一部のファイルを暗号化し、暗号化されたファイルをベンダーの外部FTPサイトにアップロードするPerlスクリプトを呼び出します。GPGでファイルを暗号化するためのPerlスクリプト

私は独学のプログラマー/開発者/エンジニアで、Perlに精通していませんが、私はこの動きに取り組んでいます。

  1. は(strawberryperl.comからWindowsのバイナリexeファイルを使用してイチゴのPerl)のPerl
  2. がwww.gnugpからexeファイルを使用してGPGをインストールします:ここで

    は、私は、この進行を取得するために要した手順です。 com

  3. GPG実行可能ファイルへのパスをWindows環境変数 "PATH"に追加すると、コマンドプロンプトから "gpg"として実行できるようになります。
  4. コマンドを使用するたびに挑戦されることを防ぐために輸入されたキーの信頼増やすコマンドにgpg --import [path to the key file]
  5. を使用してGPGのベンダーの公開鍵を追加します。私はそれから取った

    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だけでファイルのいずれかを暗号化しようとすると、ファイルは正常に暗号化されます。

だから、私は3つの質問があります

  1. を誰がエラーを引き起こしている可能性がありますどのような任意のアイデアを持っていますか?
  2. エラーの原因を確認するにはどうすればよいですか?
  3. このスクリプトはもともと10年以上前に書かれていたので、このタスクを達成するための「より良い」方法がありますか?このスクリプトは、IIS、Java、およびColdFusionが実行されているWindows 2012仮想マシン上で実行されます。
+2

'stderr'と' stdout'を '> stdout.log 2> stderr.log'のようなファイルにリダイレクトして後で確認できますか? – raina77ow

+1

また、 sprintf'を実行して、行が正しいかどうかを確認します。 – raina77ow

+0

@ raina77ow 'stdout'と' stderr'リダイレクトを追加すると 'stderr'ファイルは空で、' stdout'は通常私がコマンドプロンプトに表示しているものを表示します( "Error encrypting file ....")。 –

答えて

-1

私が難しい方法を見つけたことの1つは、鍵をインポートするために使用するアカウントです。鍵に関連する他のタスクにも使用する必要があります。それを調べてみてください

関連する問題