Hallo, da bin ich wieder.
Da ich den Server neu aufgesetzt habe, bin ich wieder über dieses Thema gestolpert. Mir ist aufgefallen, dass das Script neue IPs immer oben einsetzt, statt unten in eine neue Zeile. Das ist ein bisschen doof, weil ja in der ersten Zeile ein "deny from all" stehen muss. Eine Variable habe ich geändert, weil ich sonst in der error.log die Meldung bekam, dass sie schon deklariert wurde, oder so. Hier nochmal das Script:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#!/usr/bin/perl
use strict;
use warnings;
use CGI;
my $cgi = CGI->new;
my $param_IP = $cgi->param('IP'); # Hole den Parameter IP (=Inhalt der Textarea)
my @IP = split /\cM?\cJ/, $param_IP if defined($param_IP) and length($param_IP); # Teile mehrzeilige Einträge im Textfeld in einzelne Zeilen und speicher sie ins Array
my %IP; # Hash zum merken der IPs
open(my $fh,"<", "/var/www/html/spielplatz/.htaccess") or die "Cant open .htaccess: $!"; # Datei zum Lesen öffnen
while (my $line = <$fh>) { # IP zeilenweise einlesen
next if not $line =~ m|allow\s+from\s+(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})\s*$|i; # ist keine numerische IP, dann weiter bei while
$IP{$1}++; # numerische IP merken
}
close($fh) or die "Cant close .htaccess: $!";
foreach my $IP (@IP) {
$IP =~ s/[\cM\cJ]//g; # entferne alle Zeilenenden
next if not $IP =~ m|^(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})$|; # ist keine numerische IP
$IP{$1}++;
}
use Fcntl qw(:flock);
open(my $fg,">", "/var/www/html/spielplatz/.htaccess") or die "Cant open .htaccess: $!";
flock ($fg, LOCK_EX) or die "Cant lock .htaccess: $!"; # Datei sperren gegen mehrfache Schreibzugriffe
print $fg "allow from ",$_,"\n" for sort keys %IP; #
close($fg) or die "Cant close .htaccess: $!";
print $cgi->header(
-status => '204 No Content',); # only HTTP header is in response
Edit: Ich habe jetzt >> in Zeile 21, damit schreibt er ans Ende der Datei eine neue Zeile. Aber wie verhindere ich, dass Einträge doppelt, oder schlimmer x-fach vorkommen ?
Last edited: 2023-02-27 07:10:15 +0100 (CET)