Anzeige:
Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 15 von 17

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

  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)

  7. #7
    Registrierter Benutzer
    Registriert seit
    14.02.2001
    Ort
    Stuttgart
    Beiträge
    51
    Also meine phpinfo.php wirft die Umgebungsvariable REMOTE_ADDR richtig aus.
    Vom Ausgangsverzeichnis kann das auf dem Server doch auch nicht ausgehen, oder? Das ist eine TYPO3-Verzeichnisstruktur. In

    /home/projekt1/fileadmin/scripts

    liegt das Script und in fileadmin die vom CMS benötigten HTML-Templates, die dann den Pfad zum Script wie gewöhnlich anzeigen.
    Geändert von Eagle (27-09-2006 um 16:40 Uhr)

  8. #8
    Registrierter Benutzer
    Registriert seit
    10.10.2005
    Beiträge
    39
    1. kann leider kein perl, darum erstmal 'ne frage: ist "param()" 'ne funktion um request parameter auszulesen?
    falls ja, lies dir nochmal meinen post durch: es gibt keine request parameter... waere also die frage, was param() zurueck gibt, wenn es einen wert nicht findet. gibt es sowas wie null in perl?

    2. steht in count.dat ueberhaupt 'ne zahl.

    ueberhaupt liest, schreibst und rechnest du mit variablen und dateien in der gegend rum, ohne deren gueltigkeit zu testen oder default values zu setzen... never trust the client

  9. #9
    Registrierter Benutzer
    Registriert seit
    14.02.2001
    Ort
    Stuttgart
    Beiträge
    51
    Also wie gesagt, wenn ich die IP direkt mitschicke, liest er die beiden Dateien count.dat und visitor.dat und schreibt die neuen Werte rein.

    Ich habe gerade nur noch das Problem mit Zeile 73 und der Tatsache, dass die IP mit der Abfrage der Umgebungsvariablen geholt wird. Und die param-Funktion des CGI-Moduls liefert eine Liste der Namen aller Parameter, mit denen das Skript aufgerufen wurde.

  10. #10
    Registrierter Benutzer
    Registriert seit
    14.02.2001
    Ort
    Stuttgart
    Beiträge
    51
    Also ich habe definitiv nur noch das Problem mit der Umgebungsvariable. Das mit Zeile 73 versuche ich rauszukriegen. Aber gerade hat eine GIF.Datei als Output generiert. Und die Funktion param("visible") sucht im HTML-Code, ob eben da "visible" als Parameter beim Aufruf der Funktion mitgegeben wird.

    Ich setze mal die Abfrage
    $query eq "yes"

    auf

    $query == 1
    Geändert von Eagle (27-09-2006 um 16:56 Uhr)

  11. #11
    Registrierter Benutzer
    Registriert seit
    14.02.2001
    Ort
    Stuttgart
    Beiträge
    51
    Also, wenn ich auf der Console teste und my query=1 setzte, also param rauslasse, dann läuft das Script.
    Wie gesagt habe ichnur noch das Problem mit der Abfrage der Umgebungsvariablen.

  12. #12
    Registrierter Benutzer
    Registriert seit
    10.10.2005
    Beiträge
    39
    bindest du den counter mit
    Code:
    <img src="counter.cgi?visible=yes">
    ein? uebergibst du den parameter auch richtig an das script?
    falls ja, dann liegt es wirklich am vergleich von $query und "yes"...

  13. #13
    Registrierter Benutzer
    Registriert seit
    14.02.2001
    Ort
    Stuttgart
    Beiträge
    51
    Im HTML-Code steht:

    HTML-Code:
    <img src="scripts/counter.cgi?visible=yes" align="bottom" border="0">
    Aber das habe ich ja gerade eruiert, dass das beim Testen auf der Console den einen Fehler liefert. Ergo habe ich die Variable mit 1 versehen.

    Problem macht mir wirklich eher die Übergabe der Umgebungsvariablen, hier benötige ich die Lösung.

  14. #14
    Registrierter Benutzer
    Registriert seit
    14.02.2001
    Ort
    Stuttgart
    Beiträge
    51

    Question Problem eingegrenzt

    Hallo,

    ich stelle mein Problem einfach mal anders, da die anderen Stolperstricke aus meinem Script raus sind.

    Wenn ich auf besagten Server ein kleines Perlscript env.pl schreibe

    Code:
    #!/usr/bin/perl -w
    
    use strict;
    
    print $ENV{'SERVER_NAME'};
    #print "hello \n";
    
    exit;
    habe ich wieder die bekannten Fehlermeldungen. In diesem Fall

    Use of uninitialized value in print at ./env.pl line 5.
    Also bekommt das Script die Umgebungsvariablen nicht geliefert, egal welche und egal von welcher Verzeichnisebene.
    Wie bekomme ich das hin? Respektive wo liegt dann der Fehler, dass die Variablen nicht abrufbar sind?

    Grüsse

    Eagle

  15. #15
    Registrierter Benutzer
    Registriert seit
    10.10.2005
    Beiträge
    39
    rufst du es denn ueber den browser oder durch ssh konsole auf?

Lesezeichen

Berechtigungen

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