Anzeige:
Ergebnis 1 bis 15 von 17

Thema: $ENV{"REMOTE_ADDR"} klappt in Zählerscript nicht

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Registrierter Benutzer
    Registriert seit
    14.02.2001
    Ort
    Stuttgart
    Beiträge
    51

    Question $ENV{"REMOTE_ADDR"} klappt in Zählerscript nicht

    Hallo,

    ich habe hier ein kleines Problem auf einem Webserver, wo der Benutzer Plattenplatz hat.
    Mein Script, das ich mir mal zusammengebastelt habe und auf einem Server funktioniert, erzeugt einen graphischen Zähler auf der Website. Dabei sucht es im selben Verzeichnis nach einer Datei, in der eine IP drinsteht und vergleicht sie mit der gemeldeten Remote-IP des Browsers.
    Sind die beiden verschieden, wird die Zahl in count.dat hochgezählt und als Bilddatei generiert an den Browser übergeben. Die IP wird gemerkt in visitor.dat, die neue Zahl in count.dat abgespeichert. Im Falle gleicher IPs findet keine Zählung statt, aber die Bildausgabe.

    Hier mein Script zum Nachvollziehen:
    Code:
    #!/usr/bin/perl -w
    
    # *** SETTINGS ***
    
    use CGI qw(param);
    use GD;
    
    $width = "14";		        	# Width of the image
    $height = "18";			        # Height of the image
    $digits_dir = "../images/digits";	# Relative path to the CGI-program
    $ending = "gif";		        # png, gif, jpg, change it also in the HTTP header
    
    $lock = "1";			        # Lock the counterfile at the moment of access, "1"=looked, "0"=unlooked
    
    # *** PROGRAM ***
    
    my $query = param("visible");
    
    $host=$ENV{"REMOTE_ADDR"};
    
    open (VISITOR, "<visitor.dat"),
    	$currentvisitor = <VISITOR>;
    close (VISITOR);
    
    open (COUNT, "<count.dat") || die "Can't Open Count Data File: $!\n";
    if ($lock eq "1") {
    	flock COUNT, 2;
    } 
    	$counter =<COUNT>;
    close (COUNT);
    
    if ($host ne "$currentvisitor") {
    
    	$counter++;
    
    	open (WRITE, ">count.dat") || die "Can't Write Count Data File: $!\n";
    		print WRITE "$counter";
    	close (WRITE);
    
    	open (CURRENT, ">visitor.dat");
    		print CURRENT "$host";
    	close (CURRENT);
    
    }
    
    $length = length($counter);
    @digit = split(//, $counter);
    
    # Create a new Image
    
    if ($query eq "yes") {
    	$image_width = $length * $width + 32 + $width;
    # Width = length * width of single image + 2*border + point
    
    	$counterimage = new GD::Image($image_width,$height);
    
    $a = 0;
    while ($a < $length) {
    	open (GIF, "$digits_dir/$digit[$a]\.$ending");
    		$image[$a] = newFromGif GD::Image(GIF);
    	close (GIF);
    $a++;
    }
    	open (LEFT, "$digits_dir/left.gif"); 
    		$leftborder = newFromGif GD::Image(LEFT);
    	close (LEFT);
    
    	open (RIGHT, "$digits_dir/right.gif"); 
    		$rightborder = newFromGif GD::Image(RIGHT);
    	close (RIGHT);
    	open (POINT, "$digits_dir/point.gif"); 
    		$point = newFromGif GD::Image(POINT);
    	close (POINT);
    
    
    	$counterimage->copy($leftborder,0,0,0,0,$width,$height);
    $b = 0;
    $position = 5;
    while ($b < $length) {
    	$counterimage->copy($image[$b],$position,0,0,0,$width,$height);
    	$position = $position + $width;
    	$b++;
    }
    	$counterimage->copy($point,$position,0,0,0,$width,$height);
    	$position = $position + $width;
    	$counterimage->copy($rightborder,$position,0,0,0,$width,$height);
    
    # print HTTP header for GIF
    print "Content-type: image/gif\n\n";
    
    # print the image
    print $counterimage->gif;
    }
    # end of program
    exit;
    Mein Problem ist jetzt beim Aufruf von
    Code:
    ./counter.cgi
    auf dem Server im SSH, kommen folgende Fehlermeldungen:
    Code:
    Use of uninitialized value in string ne at ./counter.cgi line 38.
    Use of uninitialized value in string at ./counter.cgi line 47.
    Use of uninitialized value in string eq at ./counter.cgi line 57.
    Line 38 will er die Remote-IP einlesen, aber irgenwie klappt das nicht. Warum verstehe ich nicht. Ihr? Und Line 57 habe ich auch nicht verstanden.

    Ich meine, der kann
    Code:
    $host=$ENV{"REMOTE_ADDR"};
    nicht ausführen. Und da komme ich nicht weiter, vor allem weil dasselbe Script auf einem anderen Rechner super läuft.
    Na ja, und irgendwie will die Inhaberin unbedingt Ihren Zähler mit ihren eigenen Ziffern.

    Kann mir hier jemand den Fehler zeigen?

    Grüsse und vielen Dank!

    Ohne Wachs!

    Eagle

  2. #2
    Registrierter Benutzer
    Registriert seit
    05.02.2006
    Beiträge
    116
    Lies Dir mal http://wiki.perl-community.de/bin/vi...asis/UseStrict durch und passe das Skript dementsprechend an. Du solltest auch Fehlerabfragen einabuen.

    Z.B.:
    Code:
    open(DATEI,"<",$dateiname) or die $!
    Wichtig ist der or die-Teil, denn damit bekommst Du eine Fehlermeldung wenn was schief läuft. Bist Du Dir denn sicher, dass die entsprechenden Dateien auf dem Server existieren und dass Du darauf leserechte hast?

    Wenn Du das gemacht hast, poste mal die Fehlermeldung!

  3. #3
    Registrierter Benutzer
    Registriert seit
    14.02.2001
    Ort
    Stuttgart
    Beiträge
    51
    Guten Morgen und vielen Dank,

    für die Tipps. "use strict;" hat zumindest einmal soweit geholfen, dass ich die Fehler mit der Variablendefinition kapiert und mit "my" behoben habe.

    Was ich nicht ganz verstehe ist, dass das ursprüngliche Script (s. oben) auf einer anderen Maschine richtig läuft. Auf der neuen Maschine ist Linux mit Perl v5.8.6 drauf.

    Zurück zu meinem Problem, dass ich den Fehler finde. Dazu noch einmal das modifizierte Script:

    Code:
    #!/usr/bin/perl -w
    # *** SETTINGS ***
    
    use strict;
    use warnings;
    use CGI qw(param);
    use GD;
    
    my $width = "14";		        	# Width of the image
    my $height = "18";			        # Height of the image
    my $digits_dir = "../images/digits";	# Relative path to the CGI-program
    my $ending = "gif";		        # png, gif, jpg, change it also in the HTTP header
    
    my $lock = "1";			        # Lock the counterfile at the moment of access, "1"=looked, "0"=unlooked
    my $counter = "0";
    my $currentvisitor = "0";
    my $hosts = "0";
    my $length = "0";
    my $image = "0";
    my $image_width = "0";
    my $leftborder = "0";
    my $rightborder = "0";
    my $counterimage = "0";
    my $point = "0";
    my $position = "0";
    my @image = "0";
    my @digit = "0";
    
    
    # *** PROGRAM ***
    
    my $query = param("visible");
    
    $hosts = $ENV{'REMOTE_ADDR'};
    
    open (VISITOR, "<", "visitor.dat"),
    	$currentvisitor = <VISITOR>;
    close (VISITOR);
    
    open (COUNT, "<", "count.dat") || die "Can't Open Count Data File: $!\n";
    if ($lock eq "1") {
    	flock COUNT, 2;
    } 
    	$counter =<COUNT>;
    close (COUNT);
    
    if ($hosts ne $currentvisitor) {
    
    	$counter++;
    
    	open (WRITE, ">","count.dat") || die "Can't Write Count Data File: $!\n";
    		print WRITE "$counter";
    	close (WRITE);
    
    	open (CURRENT, ">","visitor.dat");
    		print CURRENT "$hosts";
    	close (CURRENT);
    
    }
    
    #open (DATEI,"<",$hosts) or die $!;
    
    $length = length($counter);
    @digit = split(//, $counter);
    
    # Create a new Image
    
    if ($query eq "yes") {
    	$image_width = $length * $width + 32 + $width;
    # Width = length * width of single image + 2*border + point
    	$counterimage = new GD::Image($image_width,$height);
    
    my $a = 0;
    while ($a < $length) {
    	open (GIF, "$digits_dir/$digit[$a]\.$ending");
    		$image[$a] = newFromGif GD::Image(GIF);
    	close (GIF);
    $a++;
    }
    	open (LEFT, "$digits_dir/left.gif"); 
    		$leftborder = newFromGif GD::Image(LEFT);
    	close (LEFT);
    
    	open (RIGHT, "$digits_dir/right.gif"); 
    		$rightborder = newFromGif GD::Image(RIGHT);
    	close (RIGHT);
    	open (POINT, "$digits_dir/point.gif"); 
    		$point = newFromGif GD::Image(POINT);
    	close (POINT);
    
    
    	$counterimage->copy($leftborder,0,0,0,0,$width,$height);
    my $b = 0;
    $position = 5;
    while ($b < $length) {
    	$counterimage->copy($image[$b],$position,0,0,0,$width,$height);
    	$position = $position + $width;
    	$b++;
    }
    	$counterimage->copy($point,$position,0,0,0,$width,$height);
    	$position = $position + $width;
    	$counterimage->copy($rightborder,$position,0,0,0,$width,$height);
    
    # print HTTP header for GIF
    print "Content-type: image/gif\n\n";
    
    # print the image
    print $counterimage->gif;
    }
    # end of program
    exit;
    Vor der Definition aller Variablen mit "my" bekam ich eine ganze Reihe Fehlermeldungen der Art:
    Global symbol "$length" requires explicit package name at ./counter.cgi line 57.
    Das ist jetzt weg, nachdem ich jede Variable definitiert und zumindest mit "0" bestückt habe.
    Wenn ich jetzt
    ./counter.cgi
    ausführe, dann tauchen diese Meldungen auf:

    Bareword "GIF" not allowed while "strict subs" in use at ./counter.cgi line 84.
    Bareword "LEFT" not allowed while "strict subs" in use at ./counter.cgi line 89.
    Bareword "RIGHT" not allowed while "strict subs" in use at ./counter.cgi line 93.
    Bareword "POINT" not allowed while "strict subs" in use at ./counter.cgi line 96.
    Execution of ./counter.cgi aborted due to compilation errors.
    Und wenn ich in dem Script alle Zeilen zwischen "Create a new Image" und "end of program" kommentiere, dann kommt wieder die Fehlermeldung:

    Use of uninitialized value in string ne at ./counter.cgi line 54.
    Use of uninitialized value in string ne at ./counter.cgi line 54.
    Denn Grund für diese Meldung finde in line 54
    Code:
    if ($hosts ne $currentvisitor) {
    nicht.

    Und Deine Fehleabfrage
    Code:
    open(DATEI,"<",$dateiname) or die $!
    habe ich nicht ganz verstanden. Kann ich damit abchecken, ob z.B.
    $currentvisitor einen Wert erhalten hat, wenn ich
    Code:
    open(DATEI,"<",$currentvisitor) or die $!
    schreibe? Bisher hatte ich open so verstanden, dass ich auf diese Art auf der Platte liegende Dateien öffnen und auslesen lassen kann.

    Die beiden Dateien count.dat und visitor.dat haben die Rechte -rw-rw-rw-, werden aber nicht befüllt.

    Grüsse

    Eagle

  4. #4
    Registrierter Benutzer
    Registriert seit
    05.02.2006
    Beiträge
    116
    Mach mal aus
    Code:
    	open (GIF, "$digits_dir/$digit[$a]\.$ending");
    		$image[$a] = newFromGif GD::Image(GIF);
    	close (GIF);
    das hier:
    Code:
    	open (my $gifh, "$digits_dir/$digit[$a]\.$ending");
    		$image[$a] = newFromGif GD::Image($gifh);
    	close ($gifh);
    und bei den anderen Bildern genauso. Damit speicherst Du die Filehandles in Skalare.

    Die Fehlerabfrage bei dem open erklärt Dir warum Du z.B. eine Datei nicht öffnen kannst (natürlich nur, wenn das open fehlschlägt). Mach die Fehlerabfrage auch beim Einlesen von visitor.dat. Und ersetz das , mal durch ;

    Du brauchst auch die Zahlen nicht in "" zu schreiben. Also sollte es
    my $image = 0;
    heißen. Und die ganzen Vergleiche zwischen den Zahlen solltest Du mit == machen und nicht mit eq.

    Das ist zwar nicht direkt das Problem, macht Deinen Code aber besser lesbar...

  5. #5
    Registrierter Benutzer
    Registriert seit
    10.10.2005
    Beiträge
    39
    aehm... hast du schonmal geprueft, ob die environmentvariable ueberhaupt existiert?

    REMOTE_ADDR wird vom apache (oder wie dein server auch heissen mag) gesetzt. wenn du dein script per ssh in der shell ausfuehrst, ist der apache gar nicht an der ausfuehrung beteiligt, es gibt demzufolge keine GET oder POST parameter, keine keine cookies, kein REMOTE_ADDR usw...

    probier mal
    Code:
    REMOTE_ADDR="1.1.1.1" ./counter.cgi

  6. #6
    Registrierter Benutzer
    Registriert seit
    14.02.2001
    Ort
    Stuttgart
    Beiträge
    51
    Hallo Ihr Beiden,

    also die Tipps von reneeb habe ich umgesetzt, mit dem Resultat, dass nur noch die Fehlermeldung

    Code:
    Use of uninitialized value in string ne at ./counter.cgi line 54.
    Use of uninitialized value in string at ./counter.cgi line 63.
    Use of uninitialized value in string eq at ./counter.cgi line 73.
    auftritt. Das mit der Umgebungsvariablen, das die nicht ausgelesen wird, habe ich mir bereits gedacht, wusste aber nicht, wie ich die bei Perl ohne Script testen kann. Zum System, Linux (möglicherweise Debian) mit Apache (1.3 oder 2).

    OpOs, wenn ich das Script, wie von Dir vorgeschlagen aufrufe, dann kommt die Meldung:
    Code:
    Use of uninitialized value in string ne at ./counter.cgi line 54.
    Use of uninitialized value in string eq at ./counter.cgi line 73.
    Es fehlt also der Code aus Line 63, und das wäre dieser hier:
    Code:
            open (CURRENT, ">","visitor.dat") or die $!;
                    print CURRENT "$hosts";                 # line 63
            close (CURRENT);
    Immerhin schreibt er jetzt die aktuelle IP in visitor.dat und zählt count.dat um eins hoch. Also wäre auch noch Zeile 73:
    Code:
     
    if ($query eq "yes") {                 # line 73
            $image_width = $length * $width + 32 + $width;
    # Width = length * width of single image + 2*border + point
            $counterimage = new GD::Image($image_width,$height);
    Müsste hier eventuell auch noch "==" statt "eq" stehen. Aber wie bekomme ich das Script dazu die Remote-IP auszulesen? Also auf einem anderen Webserver (1&1) läuft in der ursprünglichen Version.
    Geändert von Eagle (27-09-2006 um 15:39 Uhr)

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •