Para corrigir esse script, você precisa alterar while (< ORIG >) {
para while (<ORIG>) {
.
Note que esse script adota uma abordagem de marreta - ele substituirá qualquer seqüência de quatro números de qualquer comprimento separados por pontos, não apenas endereços IP. Em outras palavras, ele corresponderá a 124.4534653.74623.0
, 1.1.1.1
, http://example.com/foo/1.2.3.42345446/bar
e mais. Se isso for um problema para você, será necessário identificar qual coluna do seu log contém endereços IP e escrever um script um pouco mais complicado que modifique apenas essa coluna.
Script fixo incluído para manter este Q & Um crédito independente para Stephen Cuppet .
#!/usr/bin/perl
if ($#ARGV + 1 < 1) {
print "\n\tUsage:\n";
print "\t------\n\n";
print "\tperl log_anonymize.pl file1 [file2 [file3 [...]]]\n\n";
die "Please specify at least one file to use this script.\n\n";
}
my %forward = ();
my %reverse = ();
foreach (@ARGV) {
open(ORIG, $_)
or die "Failed to open input file for reading.";
open(ANON, "+>", $_.".anon")
or die "Failed to open destination file for writing.";
while (<ORIG>) {
if (/([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+)/) {
if (!($forward->{$1})) {
$newIp = getNewIp();
while ($reverse->{$newIp}) {
$newIp = getNewIp();
}
print "New mapping created: $1 -> $newIp\n";
$forward->{$1} = $newIp;
$reverse->{$newIp} = $1;
}
$repl = $forward->{$1};
$_ =~ s/$1/$repl/;
}
print ANON $_;
}
close(ORIG);
close(ANON);
}
exit 0;
sub getNewIp {
return int(rand(256)) . "." . int(rand(256)) . "." . int(rand(256)) . "." . int(rand(256));
}