Thread Werte in Datei schreiben (CGI-Formular)
(87 answers)
Opened by fred0815 at 2013-12-23 10:21
Ich habe jetzt mal Deinen Code etwas umgearbeitet.
Ich habe versucht, Deinen Code zu erhalten, um nicht zu weit abzuweichen und dadurch wieder mehr Verwirrung zu verursachen. Meine Testergebnisse sahen akzeptabel aus. Das Resultat: Code (perl): (dl
)
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 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 #!/pfad/zu/perl use strict; use warnings; use CGI; use Fcntl qw(:flock); # zentrale Definition der .htaccess Datei my $htaccess_file = ".htaccess"; my $cgi = CGI->new; my $param_IP = $cgi->param('IP'); # Hole den Parameter IP (=Inhalt der Textarea) my %known_ip; my %new_ip; # Aktionen nur ausführen, wenn $param_IP gesetzt ist if ( defined($param_IP) and length($param_IP) ) { # ermittle neue IPs; ausgehend davon, dass Parameter IP potentiell nur # IP-Adressen enthalten sollte, splitten wir vereinfacht am \s+ for my $ip ( split /\s+/, $param_IP ) { # nur benutzen, was wie eine IP aussieht if ( $ip =~ m|^(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})$| ) { $new_ip{$1}++; } } # ermittle die bereits gesetzten IPs open(my $fh, "<", $htaccess_file) or die "Cant open $htaccess_file: $!"; # Datei zum Lesen öffnen while (my $line = <$fh>) { # IP zeilenweise einlesen if ( $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 $known_ip{$1}++; # numerische IP merken } } close($fh) or die "Cant close $htaccess_file:: $!"; # Neue IPs anfügen open($fh, ">>", $htaccess_file) or die "Cant open $htaccess_file: $!"; flock ($fh, LOCK_EX) or die "Cant lock $htaccess_file: $!"; # Datei sperren gegen mehrfache Schreibzugriffe for my $new_ip ( sort keys %new_ip ) { # bekannte IPs ueberspringen next if exists $known_ip{$new_ip}; # neue IPs anfuegen print $fh "allow from ",$new_ip,"\n" or die "Can't print to $htaccess_file: $!"; } close($fh) or die "Cant close $htaccess_file: $!"; } print $cgi->header( -status => '204 No Content',); # only HTTP header is in response __END__; Last edited: 2023-02-27 23:44:35 +0100 (CET) meine Beiträge: I.d.R. alle Angaben ohne Gewähr und auf Linux abgestimmt!
Die Sprache heisst Perl, nicht PERL. - Bitte Crossposts als solche kenntlich machen! |