Schlagwort-Archive: shell

IP-Adresse (lokal) eines Raspberry Pi automatisch ermitteln

Problem:

Für z.B. die internetgestützten Meisenkästen wird der Raspberry Pi headless betrieben, das heißt: Man kommt lediglich über ssh auf den Raspberry. Dazu ist die Kenntnis der IP-Adresse erforderlich.

Lösungsansatz:

Mit einem einfachen Script ermittelt der Raspberry beim Systemstart selber seine IP-Adresse, übergibt sie an einen Webservice im Internet, der Webservice speichert die IP-Adresse ab.

Notwendige Voraussetzungen:

  1. Sie haben einen Raspberry Pi mit Internetzugang.
  2. Sie haben Zugriff auf einen Webserver, auf dem Sie PHP-Scripte speichern können.

Benötigte Scripte:

Auf dem Raspberry:

Auf dem Rasberry genügt ein einfaches Shell-Script:

#!/bin/bash
# holt IP Adresse
# ruft Webservice  auf,
# der IP-Adresse speichert
# in cron bei Neustart aufrufen
ipadr=$(hostname -I)
echo IP Adresse $ipadr
# Web Aufruf
curl "http:///service/getipWS.php?ip=$ipadr&name=Schiefbahn+Garten"
echo

Das Shell-Script rufen Sie durch einen Eintrag in CRON automatisch beim Neustart des Raspberrys auf. Die Besonderheit: Geben Sie dem Rapberry Zeit, die Verbindung zum lokalen Netzwerk aufzubauen. Das ist in dem Beispiel durch „sleep 30“ realisiert. die interessierende Zeile ist:


@reboot sleep 30; /home/pi/getip.sh >/mnt/ramdisk/getip.log

So könnte zum Beispiel Ihre Crontab aussehen:


# Edit this file to introduce tasks to be run by cron.
#
# Each task to run has to be defined through a single line
# indicating with different fields when the task will be run
# and what command to run for the task
#
# To define the time you can provide concrete values for
# minute (m), hour (h), day of month (dom), month (mon),
# and day of week (dow) or use '*' in these fields (for 'any').#
# Notice that tasks will be started based on the cron's system
# daemon's notion of time and timezones.
#
# Output of the crontab jobs (including errors) is sent through
# email to the user the crontab file belongs to (unless redirected).
#
# For example, you can run a backup of all your user accounts
# at 5 a.m every week with:
# 0 5 * * 1 tar -zcf /var/backups/home.tgz /home/
#
# For more information see the manual pages of crontab(5) and cron(8)
#
# m h  dom mon dow   command
*/30 * * * * /home/pi/wifirefresh.sh >/dev/null 2>&1
#*/10 * * * * /home/pi/naturwatchcam.py >/dev/null 2>&1
0 * * * * /home/pi/cam.py >/dev/null 2>&1
@reboot sleep 30; /home/pi/getip.sh >/mnt/ramdisk/getip.log

Auf dem Webserver:

Auf dem Webserver schreiben Sie einen Webservice (hier getipWS.php), der durch den curl-Aufruf des Raspberrys genutzt wird.


// getipWS.php
// Claus Brell, 20.05.2018
// nimmt IP entgegen, z.B. eines Raspberry Pi
// speichert IP-Adresse in getip.log
// Aufruf: getipWS?ip=192.168.1.104
// alternativ: getipWS?ip=192.168.1.104&name=mein+kleiner+Raspberry
// Rückgabe:
// ok wenn vermutlich richtiger Parameter
// fehler wenn Parameter zu lang
// ? wenn kein Parameter übergeben 
if(isset($_GET['ip'])){
    if(strlen($_GET['ip'])<16){
	  // übergebene IP in lokale Variable speichern:
	  $ip=$_GET['ip'];
	  // übergebenen Namen in lokale Variable speichern:
	  if (isset($_GET['name'])) $name=$_GET['name'];
	  else $name='unbekannt';
	  // Internetadresse, woher der Aufruf kommt: 
	  $ipremote=getenv("REMOTE_ADDR");
	  $domain=gethostbyaddr($ipremote);
	  // CSV-String zusammenstellen:
	  $ausgabe=date("ymd-His").';'.$ip.';'.$name.';'.$ipremote.';'.$domain."\r\n";
	  // CSV-String an Datei anhängen:
	  file_put_contents("getip.log",$ausgabe,FILE_APPEND);
	  echo 'ok';
    } else echo 'fehler';
} else echo '?';

Auf Ihrem Webserver finden Sie dann die Textdatei getip.log im CSV-Format, in der die lokale IP-Adresse steht. So könnte ein Beispieleintrag in getip.log aussehen:


180520-082623;192.168.0.103 ;Schiefbahn Garten;80.140.39.66;p508C2742.dip0.t-ipconnect.de