IP Adresse aus PHP wegschicken

kolja

Active member
Themenstarter
Registriert
19 Sep. 2007
Beiträge
1.363
Nabend

Ich, als völliger Linux Noob, bin etwas auf mich alleine gestellt,
da "mein" Programmierer im Urlaub ist.

Sachverhalt ist folgender:
Debian Maschine (euren Slang nehme ich mir ja schon an :-) soll alle x Minuten per Cron seine IP in eine externe Datenbank schreiben.

Das was ich an Code gefunden habe, sieht so aus:

Code:
        public function write_ip()
        {


                $ext_serv               =       $this->config->item('ext_serv');
                $ext = $this->load->database($ext_serv, TRUE);
                $ext->insert('z_ip', array('time' => date('Y-m-d H:i', time() ), 'ip' => $_SERVER['SERVER_ADDR'], 'name' => $this->config->item('kiga_short')));


        }

Wenn ich diese Funktion über den Browser (Apache ist installiert) aufrufe, klappt es.
Da der Cron aber nicht läuft, habe ich die Datei mit entsprechenden Parametern in der Shell aufgerufen.

Da bekomme ich diese Fehlermeldung angezeigt:

Code:
A PHP Error was encountered


Severity:    Notice
Message:     Undefined index: SERVER_ADDR
Filename:    /var/www/application/controllers/Cron.php
Line Number: 17


Backtrace:
        File: /var/www/application/controllers/Cron.php
        Line: 17
        Function: _error_handler


        File: /var/www/index.php
        Line: 292
        Function: require_once






Database error: A Database Error Occurred


        Error Number: 23000/1048
        Column 'ip' cannot be null
        INSERT INTO `z_ip` (`time`, `ip`, `name`) VALUES ('2015-10-21 23:36', NULL, 'RE')
        Filename: controllers/Cron.php
        Line Number: 17

Warum kann die IP nicht ermittelt werden?
Oder was sonst ist der Fehler?

Gruß Kolja

- - - Beitrag zusammengeführt - - -

Ha, habs geschafft :-)

Code:
$ext->insert('z_ip', array('time' => date('Y-m-d H:i:s', time() ), 'ip' => isset($_SERVER['SERVER_ADDR'])?$_SERVER['SERVER_ADDR']:gethostbyname(gethostname()), 'name' => $this->config->item('kiga_short')));

- - - Beitrag zusammengeführt - - -

Doch nicht...

Die Zeile gibt mir eine falsche IP aus.
Wie kann, was soll das denn?
 
es gibt sicher eleganter Lösungen, aber dazu müsste man mehr über die Umgebung und Anforderungen wissen

Code:
$ext->insert('z_ip', array('time' => date('Y-m-d H:i:s', time() ), 'ip' => $argv[1], 'name' => $this->config->item('kiga_short')));

diese Lösung ermittelt auf der Shell ebene die IP und gibt dies als erstes Argument an die PHP-Skript weiter

Code:
php /var/www/application/controllers/Cron.php `hostname -I`
 
Zuletzt bearbeitet:
Hallo oezix

Die Zeile habe ich ersetzt, aber beim Aufruf des Befehles bekomme ich folgende Meldung:
Code:
No direct script access allowed

Liegt bestimmt daran, dass ich das Skript immer so testen soll:
Code:
php /var/www/index.php cron write_ip

Das naheliegenste (für mich) funktioniert leider auch nicht
Code:
php /var/www/index.php cron write_ip hostname -I
Auch nicht mit ``.

Ne Andere Idee?

Kolja

Ach ja, ich brauche die IP im W-Lan, also mit der ich am Router angemeldet bin.
Nicht die des Routers im Internet.
Nur falls ich das im ersten Post nicht richtig beschrieben haben sollte.

 
Code:
$ext->insert('z_ip', array('time' => date('Y-m-d H:i:s', time() ), 'ip' => system('hostname -I'), 'name' => $this->config->item('kiga_short')));

jetzt ohne Argument aufrufen

Code:
php /var/www/index.php cron write_ip
 
Eine Millionen Mal besten Dank!!!!

Jetzt nur die restlichen Raspberrys damit ausstatten.
 
Also dass $_SERVER['SERVER_ADDR'] nicht klappt liegt einfach daran, dass ein Computer/deine DebianBox seine Public IP gar nicht kennt, wenn es hinter einem Router steht. Was an der NAT Adressauflösung liegt. Und mit gethostblablaba bekommt das Script auch nur die lokale IP Adresse, wenn es über die Shell ausgeführt wird (was bei einem Cron-Job der Fall ist).

Das ganze kannst du mal testen indem du phpinfo() über den PHP Interpreter in der Shell generierst:
Code:
echo "<?php phpinfo();" > test.php
php test.php

Und dort unter PHP Variables guckst. Dann die test.php nochmal im Browser aufrufen. Ergebnis: Im Browser hast du ein SERVER_ADDR Parameter, in der Shell nicht.

Ein Lösung ist die Public IP über einen curl request rauszubekommen:
Code:
curl -s checkip.dyndns.org | sed -e 's/.*Current IP Address: //' -e 's/<.*$//'

Weitere Lösungen sind hier: http://go2linux.garron.me/what-is-my-public-ip-address-with-linux/

Edit: hat sich wohl erledigt
 
  • ok1.de
  • ok2.de
  • thinkstore24.de
  • Preiswerte-IT - Gebrauchte Lenovo Notebooks kaufen

Werbung

Zurück
Oben