2013-04-05 3 views
0

이 로그 파일에서 소스 IP 및 대상 포트를 가져 와서 Perl을 사용하여 만든 데이터베이스 테이블에 추가해야하는이 할당이 있습니다. dbi sqlite. 나는 그것을하는 스크립트를 작성하려고했지만 작동하지 않는 것 같습니다. 나는 어떤 도움을 주셔서 감사합니다. 로그 파일은 에서 사용할 수 있습니다. http://fleming0.flemingc.on.ca/~chbaker/COMP234-Perl/sample.log로그 파일에서 정보를 얻고 Perl DBI sqlite를 사용하여 데이터베이스 테이블에 추가하는 방법

여기에 제가 가지고있는 코드가 있습니다.

#!/usr/bin/perl 

use strict; 
use warnings; 
use DBI; 

my %ip2port; 
my $IPCount = keys %ip2port; 
my $portCount = 0; 
my $filename = "./sample.log"; 
open my $LOG, "<", $filename or die "Can't open $filename: $!"; 
LINE: while (my $line = <$LOG>) { 
my ($src_id) = $line =~ m!SRC=([.\d]+)!gis; my ($dst_port) = $line =~ m!DPT=([.\d]+)!gis; 
my $dbh = DBI->connect(   
    "dbi:SQLite:dbname=test.db", 
    "",       
    "",       
    { RaiseError => 1 },   
) or die $DBI::errstr; 


$dbh->do("INSERT INTO probes VALUES($src_id, $dst_port)"); 
$dbh->do("INSERT INTO probes VALUES(2,'$dst_port',57127)"); 
my $sth = $dbh->prepare("SELECT SQLITE_VERSION()"); 
$sth->execute(); 

my $ver = $sth->fetch(); 

print @$ver; 
print "\n"; 

$sth->finish(); 
$dbh->disconnect(); 
} 
+1

작동하지 않는 기능은 무엇입니까? 문제를 진단하기 위해 당신은 무엇을 했습니까? – friedo

+0

do 문이 작동하지 않습니다. 날씨를 확인하는 데 도움이 필요합니다. 올바른 상태의 스크립트가 있거나 오류가 있습니다. – user218001

+0

아, 오류가 있습니다. 그러나 나는 여전히 당신이 의미하는 바가 "일하지 마라"는 것을 알고 싶다. – friedo

답변

0

1) 정규 표현식 변경 :

my ($src_id) = $line =~ m!SRC=([\.\d]+)!g; 
my ($dst_port) = $line =~ m!DPT=([\d]+)!g; 

2) 변경을하여 SQL의

$dbh->do("INSERT INTO probes VALUES('$src_id', $dst_port)"); 

UPDATE 어떤 경우 , 그것은 매개 변수 바인딩 SQL 문장을 구축하는 것이 좋습니다 SQL 인젝션 문제를 피하십시오 :

$dbh->do("INSERT INTO probes VALUES(?,?)", undef, $src_id, $dst_port);