Perl: SSH Tail как обработчик файлов

Я создаю синтаксический анализатор журнала, который имеет возможность «потоковой передачи» журнала по мере его записи. Журнал находится на удаленном хосте, поэтому я создаю обработчик файлов, используя комбинацию SSH и tail. Следующее работает довольно хорошо, но у меня есть некоторые вопросы относительно обработки ошибок.

  • Если пользователь не введет пароль для SSH-соединения до истечения задержки тревоги, тревога начнет срабатывать. Это приводит к очистке консоли, поэтому неясно, нужно ли вводить пароль.

  • Если я ввожу неправильный пароль, я все равно включаю сигнал тревоги, приводящий к очистке экрана и т. Д.

    Password:
    Password:
    Password:
    Permission denied (publickey,keyboard-interactive).
    
  • Если я укажу несуществующее имя файла журнала, код продолжится....

    tail: cannot open `/path_to_log/mylog.logXXXX' for reading: No such file or directory
    tail: no files remaining
    

Итак, мой вопрос заключается в том, как лучше всего добавить дополнительную обработку ошибок. В качестве альтернативы можно ли использовать модуль File::Tail в сочетании с SSH, telnet, rlogin и т. д. для обеспечения той же функциональности?

Спасибо!

    my $stopMsg = "Use CTRL+C to stop streaming at any time...\n";
    my $SSH = sprintf "ssh %s@%s tail -f %s | ", $user, $host, $log;

    printf "Log: %s\n", $log;
    printf "Handle: %s\n", $SSH;

    my $errMsg = sprintf "Couldn't establish SSH connection to \"%s\":",
                 $host;

    open my $pipe, $SSH or error( $errMsg );

    my $loadTime = time;

    printf $stopMsg;

    setSignalHandler( 'INT', sub{ stopAlarm( TRUE ); } );

    startAlarm( $delay,
                $interval,
                sub { system "clear"; $handler->( \@sysLogArr ); printf $stopMsg; } );

    while ( alarmHandlerSet() )
    {
        my $data = <$pipe>;

        next unless defined $data;

        mapSysLog( line   => $data,
                   arrRef => $logRef,
                   varRef => \%sysLogVars,
                   dbRef  => $dbRef );
    }

    clearSignalHandler( 'INT' );



sub error(@)
{
    my $color = "BOLD";
    $color = $CONFIG{errorPrinter} if ( $CONFIG{colorEnable} &&
                                        defined $CONFIG{errorPrinter} );

    color2PrinterRef( $color )->( "\nERROR: " );

    printf "%s\n", shift;
    printf "      %s\n", $_ foreach ( @_ );
    printf "Called From: %s::%d\n", (caller)[1], (caller)[2];
    printf "\n";

    exit EXIT_FAILURE;
}

person trialUnplugged    schedule 28.09.2011    source источник
comment
Эммм... что вы подразумеваете под ошибкой в ​​open my $pipe, $SSH or error( $errMsg );? Вы имеете в виду die?   -  person    schedule 28.09.2011
comment
error выполняет то же самое, что и die... Но выводит $errMsg, некоторую другую отладочную информацию, а затем вызывает exit с кодом ошибки.   -  person trialUnplugged    schedule 28.09.2011
comment
Я никогда не слышал об этом, и ни perldoc error, ни perldoc -f error не дают никаких результатов. Кроме того, попытка error в однострочнике привела к Undefined subroutine &main::error called at.... Является ли это частью какого-то модуля (похоже, он не является частью Carp)? Какую версию Perl вы используете?   -  person    schedule 28.09.2011
comment
Это подпрограмма, которую я написал   -  person trialUnplugged    schedule 28.09.2011


Ответы (1)


См. прилагаемый пример sftp_tail.pl. с помощью Net::SFTP::Foreign.

person salva    schedule 28.09.2011
comment
Я попробую. Похоже, это ответит на мои вопросы. - person trialUnplugged; 29.09.2011