В настоящее время у нас есть работа, запущенная на старом сервере Windows (Windows Server 2003), который необходимо перенести на новый сервер из-за того, что старый из них вскоре вышел в отставку. Это задание выполняется как запланированное задание Windows, которое выполняется с частыми интервалами, вызывая скрипт Perl, который шифрует некоторые файлы с помощью открытого ключа поставщика и загружает зашифрованные файлы на внешний FTP-сайт поставщика.Perl-скрипт для шифрования файла с GPG не работает
Я самонаводящийся программист/разработчик/инженер, который не знаком с Perl, но мне было поручено это сделать.
Вот шаги, которые я взял, чтобы получить это происходит:
- Установка Perl (Strawberry Perl, используя Windows, Binary ех из strawberryperl.com)
- Установки GPG с помощью еха из www.gnugp. com
- Добавьте путь к исполняемому файлу GPG в переменную среды Windows «PATH», чтобы ее можно было запустить как «gpg» из командной строки.
- Добавить открытый ключ поставщика для GPG с помощью команды
gpg --import [path to the key file]
Повышение доверия к импортируемый ключ, чтобы предотвратить оспариваются каждый раз с помощью команды:
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 с помощью командной строки, файл будет успешно зашифрован.
Итак, у меня есть три вопроса:
- Кто-нибудь есть какие-либо идеи, что может быть причиной ошибки?
- Как я могу узнать причину ошибки?
- Есть ли «лучший» способ выполнить эту задачу, так как этот скрипт был написан более десяти лет назад? Теперь скрипт будет запущен на виртуальной машине Windows 2012 с работающими на ней IIS, Java и ColdFusion.
Можете ли вы перенаправить 'stderr' и' stdout' в некоторый файл (например, '> stdout.log 2> stderr.log' и проверить их потом? – raina77ow
Кроме того, я распечатал результат' sprintf', чтобы убедиться, что линия выглядит так, как должно быть. – raina77ow
@ raina77ow, когда я добавляю перенаправления 'stdout' и' stderr', файл 'stderr' пуст, а' stdout' отображает то, что я обычно вижу в Command Prompe («Error encrypting file ....»). –