Как получить информацию из файлов журналов и добавить их в таблицу базы данных, используя Perl DBI sqlite
У меня есть это назначение, которое требует от меня взять исходный IP-адрес и порт назначения из этого файла журнала и добавить их в таблицу базы данных, которую я создал с помощью Perl dbi sqlite. Я пытался написать сценарий, который делает это, но это не похоже на работу. Буду признателен за любую помощь. Файл журнала доступен по адресу http://fleming0.flemingc.on.ca/~chbaker/COMP234-Perl/sample.log
вот код, который у меня есть.
#!/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 ответ
Решение
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 )");
ОБНОВЛЕНИЕ В любом случае лучше создавать предложения SQL с привязкой параметров и избегать проблем с SQL-инъекцией:
$dbh->do("INSERT INTO probes VALUES(?,?)", undef, $src_id, $dst_port);