Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Perl:SSH-Tail作为文件处理程序_Perl_Ssh_Tail - Fatal编程技术网

Perl:SSH-Tail作为文件处理程序

Perl:SSH-Tail作为文件处理程序,perl,ssh,tail,Perl,Ssh,Tail,我正在创建一个日志解析器,它能够在编写日志时“流化”日志。 日志驻留在远程主机上,因此我将使用以下组合创建一个文件处理程序 SSH和tail。下面的工作非常好,但是我确实有一些关于错误处理的问题 如果用户在警报延迟到期之前没有输入SSH连接的密码,警报将开始触发。这导致控制台被清除,因此不清楚是否需要输入密码 如果我输入了错误的密码,我仍然会启用导致屏幕清除等的警报 Password: Password: Password: Permission denied (publickey,keybo

我正在创建一个日志解析器,它能够在编写日志时“流化”日志。 日志驻留在远程主机上,因此我将使用以下组合创建一个文件处理程序 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;
}
my$stopMsg=“使用CTRL+C随时停止流媒体…\n”;
my$SSH=sprintf“SSH%s@%s tail-f%s|”,$user、$host、$log;
printf“日志:%s\n”,$Log;
printf“句柄:%s\n”,$SSH;
我的$errMsg=sprintf“无法建立到\%s\”的SSH连接:“,
$host;
打开我的$pipe、$SSH或error($errMsg);
我的$loadTime=时间;
printf$stopMsg;
setSignalHandler('INT',sub{stopAlarm(TRUE);});
startAlarm($延迟,
$interval,
子{system“clear”;$handler->(\@sysLogArr);printf$stopMsg;});
while(alarmHandlerSet())
{
我的$data=;
下一步,除非定义$data;
mapSysLog(行=>$data,
arrRef=>logRef美元,
varRef=>\%sysLogVars,
dbRef=>$dbRef);
}
clearSignalHandler('INT');
子错误(@)
{
我的$color=“BOLD”;
$color=$CONFIG{errorPrinter}如果($CONFIG{colorEnable}&&
定义的$CONFIG{errorPrinter});
color2PrinterRef($color)->(“\n错误:”);
printf“%s\n”,移位;
printf“%s\n”,$\uForeach(@);
printf“调用自:%s::%d\n”,(调用方)[1],(调用方)[2];
printf“\n”;
退出失败;
}

查看随附的样本。

查看随附的样本。

嗯。。。在
打开我的$pipe、$SSH或error($errMsg)中,“error”是什么意思?你的意思是
die
?错误与die完成相同的事情。。。但是它会打印$errMsg和其他一些调试信息,然后用失败代码调用exit。我从来没有听说过它,
perldoc error
perldoc-f error
都不会显示任何结果。此外,在一行程序中尝试
error
会导致在…
处调用
未定义的子例程&main::error。这是某个模块的一部分吗(它似乎不是
Carp
的一部分)?您使用的是什么版本的Perl?它是我编写的一个子例程。。。在
打开我的$pipe、$SSH或error($errMsg)中,“error”是什么意思?你的意思是
die
?错误与die完成相同的事情。。。但是它会打印$errMsg和其他一些调试信息,然后用失败代码调用exit。我从来没有听说过它,
perldoc error
perldoc-f error
都不会显示任何结果。此外,在一行程序中尝试
error
会导致在…
处调用
未定义的子例程&main::error。这是某个模块的一部分吗(它似乎不是
Carp
的一部分)?您使用的是什么版本的Perl?这是我编写的一个子程序,我将尝试一下。看起来它能解决我的问题。我会试试看。看起来它能解决我的问题。