0

最初に述べておきますが、clamd は正しく応答することが証明されています。

$ echo PING | nc -U /var/run/clamav/clamd.sock
PONG

スキャナーは次のようにセットアップされました。

#set up a Clamav scanner
use File::VirusScan;
use File::VirusScan::ResultSet;
my $scanner = File::VirusScan->new({
    engines => {
            '-Daemon::ClamAV::Clamd' => {
                    socket_name => '/var/run/clamav/clamd.sock',
            },
    },
});

スクリプト全体が Solaris 11 ボックスで正常に動作します。Linux CentOS 5.3 (Final) でこれを実行しています。CPAN から File::VirusScan をインストールする際に問題がありました。最新バージョン 0.102 はコンパイルされず、CPAN テスターは 435 が 437 から失敗したため、これを確認しているようです。 CPANから以前の0.101バージョンをダウンロードしました.Solarisでも実行しているバージョンで、手動でインストールしたようです.

perl -v
This is perl, v5.8.8 built for x86_64-linux-thread-multi


sub scanner {
        $|++; # buffer disabled
        (my $path, my $logClean) = @_;



    my $recurse = 5;
    print color "yellow";
    print "[i] Building file scan queue - recurse deepth $recurse \n";
    print color "green";
    print "SCAN QUEUE:0";

    #Get list of files

    if( $rootPath){
     use File::Find::Rule;
    my $finder = File::Find::Rule->maxdepth($recurse)->file->relative->start("$$path");
        while( my $file = $finder->match()  ){
           $|++;
           #$file = substr($file,length($rootPath)); #remove path bloat
           push(@scanList,"/$file");
           print "\rSCAN QUEUE:" .scalar(@scanList);  #update screen
        }
    }else{
     push(@scanList,"$$path");
    }


    print "\rSCANING:0";
    #set up a Clamav scanner
    use File::VirusScan;
    use File::VirusScan::ResultSet;
    my $scanner = File::VirusScan->new({
        engines => {
                '-Daemon::ClamAV::Clamd' => {
                        socket_name => '/var/run/clamav/clamd.sock',
                },
        },
    });



    #scan each file
    my $scanning  = 0;
    my $complete = -1;

    foreach $scanFile (@scanList){
             $scanning++;
             ##################################################
             #scan this file
             $results = $scanner->scan($rootPath.$scanFile);
             ##################################################
                  #array of hashes
             my $centDone = int(($scanning/scalar(@scanList))*100);

             if($centDone > $complete){
                 $complete = $centDone;
             }
             if($centDone < 100){
                  #\r to clear/update line
                  $format = "%-9s %-60s %-15s %-5s";
                  printf $format, ("\rSCANING:", substr($scanFile,-50), "$scanning/".scalar(@scanList), "$centDone%");
             }else{
                  print "\rSCAN COMPLETE                                                                            ";
             }

             # array ref
             foreach $result (@$results) {
                        #array of pointers to hashes
                      #print 'data:'
                      #print 'state:'
                       if($$result{state} ne "clean"){
                           if($$result{data} =~ /^Clamd returned error: 2/){
                               $$result{data} = "File too big to scan";
                           }
                           push(@scanResults,[$scanFile,$$result{state},$$result{data}]); # results
                      }elsif($$logClean){
                           push(@scanResults,[$scanFile,$$result{state},$$result{data}]);
                      }
                      unless($$result{state} eq "clean"){
                                    print color "red";
                                    print "\r$scanFile,$$result{state},$$result{data}\n";
                                    print color "green";
                                    print "\rSCANING: $scanning/".scalar(@scanList)." : $centDone%";
                               if($$result{state} eq "virus"){
                                    push(@scanVirus,scalar(@scanResults)-1);  #scanResuts index of virus

                               }elsif($$result{state} eq "error"){
                                    push(@scanError,scalar(@scanResults)-1);  #scanResuts index of Error
                               }
                      }
             }

    } print "\n";

}
4

2 に答える 2

1

Clamdパッケージのソースコードを見ると、次のスクリプトは、試行している呼び出しに近似しているはずであり、うまくいけば、どのように失敗しているかをよりよく理解できます。別のファイル(test.plなど)に保存して、「perltest.pl」を使用して実行してみてください。

use IO::Socket::UNIX;
use IO::Select;

my $socket_name = '/var/run/clamav/clamd.sock';
my $sock = IO::Socket::UNIX->new(Peer => $socket_name);

if(!defined($sock)) {
    die("Couldn't create socket for path $socket_name");
}

my $s = IO::Select->new($sock);

if(!$s->can_write(5)) {
    $sock->close;
    die("Timeout waiting to write PING to clamd daemon at $socket_name");
}

if(!$sock->print("SESSION\nPING\n")) {
    $sock->close;
    die('Could not ping clamd');
}

if(!$sock->flush) {
    $sock->close;
    die('Could not flush clamd socket');
}

if(!$s->can_read($self->{5})) {
    $sock->close;
    die("Timeout reading from clamd daemon at $socket_name");
}

my $ping_response;
if(!$sock->sysread($ping_response, 256)) {
    $sock->close;
    die('Did not get ping response from clamd');
}

if(!defined $ping_response || $ping_response ne "PONG\n") {
    $sock->close;
    die("Unexpected response from clamd: $ping_response");
}
于 2012-10-24T18:49:13.580 に答える
0

File::VirusScan ベース ライブラリとは別に、さまざまなウイルス対策エンジンをインストールする必要があるようです。以下はエラーを返しますか?

perl -mFile::VirusScan::Engine::Daemon::ClamAV::Clamd -e ''

Clamd.pm が見つからないというエラーが表示された場合は、そのエンジン モジュールをインストールする必要があります。

エラーが表示されない場合は、スキャンを実行するために実際に使用しているコードやエラー出力 (存在する場合) など、詳細を投稿する必要があります。

于 2012-10-24T17:27:59.483 に答える