Сценарий Perl, вызывающий команду ssh2, не может вернуть вывод в планировщик задач Windows

Я могу запустить сценарий Perl из командной строки без каких-либо проблем, но когда я пытаюсь автоматизировать эту задачу с помощью диспетчера задач Windows (64-разрядная версия Windows 2008 Server), вывод из SSH/SSH2 не может быть записан в выходной файл. Это perl-скрипт, и он делает что-то вроде этого:

my $DB_FILE1=$PATH . "\\FSBusinessUtil_" . $hostfqdn . $DATE;
open( OUTFILE,  ">$DB_FILE1" )      or die "Could not open data file ";
print OUTFILE "FilesystemInfo\n";   

my $output1=`$SSH_PATH\\ssh $user\@$hostname NAS_DB=/nas /nas/bin/./nas_fs -list`;

if($? != $RC_OK){
    open( OUT1FILE, ">$PATH\\errFSBusinessUtil_$hostfqdn$DATE");
    print OUT1FILE localtime(time) . " Remote ssh failed to create $DB_FILE1. Error: $output1\n"; 
    close OUT1FILE;
}
else {
    $output1=~ s/%%%/\n/g;
    print OUTFILE $output1;
}  
close OUTFILE; 

Сам сценарий Perl был вызван планировщиком заданий Windows, но в выходном файле я увидел только строку «FilesystemInfo», которую сценарий распечатывает перед вызовом команды ssh. Кроме того, команда не удалась, потому что я видел сгенерированный файл ошибки. Но тем не менее, $ output1 пуст, поэтому ничего, кроме «Удаленный ssh ​​не удалось создать... Ошибка:».


person Libby Shen    schedule 17.10.2012    source источник
comment
Я бы начал отлаживать его, распечатав полную команду ssh перед запуском, чтобы убедиться, что все правильно. Я также подозреваю, что диспетчер задач может не иметь доступа к тем же ключам ssh или агенту ssh, что и вы. В качестве примечания: попробуйте использовать лексические дескрипторы файлов, и вы не получите сортировку конфликтов, которые вам приходилось обходить. Очень запутанные имена.   -  person Schwern    schedule 18.10.2012
comment
Просто примечание: косая черта может использоваться во всех именах путей в Windows, и это считается лучшей практикой, поскольку это уменьшает путаницу, избегающую символов.   -  person dan1111    schedule 18.10.2012


Ответы (2)


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

Первое, что вы должны попробовать, это запустить ssh из вашего скрипта в режиме отладки:

ssh -vvv ...

Другая возможность — использовать Net::SSH2, который не использует никакой информации из среды и так, не затронуты такого рода проблемами.

person salva    schedule 18.10.2012
comment
Большое спасибо за комментарии. Я попробовал ssh -vvv, но не получил никакого вывода в файле $output1. И я попытался использовать подход Perl script_name › an_output_file, но это не сработало. Задача выполняется от имени того же пользователя. Мы попытались запустить от имени SYSTEM и увидели проблему, о которой вы упомянули, связанную с пользователем и ключом хоста. Я предполагаю, что вопрос здесь в том, как получить вывод stderr, возвращаемый командой в обратной кавычке, где мы можем видеть. Спасибо! - person Libby Shen; 19.10.2012
comment
@Libby Shen: используйте что-то вроде ssh -vvv ... 2>c:\\stderr.out - person salva; 19.10.2012
comment
Тайна раскрыта! В планировщике задач Windows была отмечена опция «Выполнить с наивысшими привилегиями», что мешало работе SSH. Как только этот флажок снят, сценарий Perl выполняется гладко. - person Libby Shen; 25.10.2012

У меня были похожие проблемы при запуске SCP и SSH внутри запланированного VBscript. Отметка «Выполнить с наивысшими привилегиями» помогла.

person user2043446    schedule 05.02.2013