Applescript - WAN-IP in eine Text datei schreiben ?

IPTracker

Plan: Die IP-Adresse soll von Client-Rechnern in regelmässigen Abständen getrackt und auf einem Server gespeichert werden.

Voraussetzungen:
Server - Webserver mit PHP
Clients - keine

Todo:
Authentifizierung
GeoLocation

Anmerkungen am Ende beachten.


Server:

Auf dem Server ein Verzeichnis erstellen (z.B. ip), darin folgende index.php Datei erstellen:
PHP:
<?php
 $IP = $_SERVER['REMOTE_ADDR'];
 echo $IP;
 $QS = $_SERVER['QUERY_STRING'];
 $handle = fopen ("ip.txt", "a+");
 fwrite ($handle, date("c")." # ".$IP."\t# ".$QS."\n");
 fclose ($handle);
?>
Beim Aufruf im Browser wird die aktuelle WAN-IP des Clients ausgegeben.
Es wird eine Datei "ip.txt" auf dem Server im Verzeichnis .../ip erzeugt,
mit z.B. folgendem Inhalt (ISO-Datum # WAN-IP # hostname):

1940-11-22T12:01:59+01:00 # 87.151.244.127 # clientrechnername.local

Alle weiteren Einträge werden an die Datei "ip.txt" angehängt.

Testen auf dem Client im Terminal:
Code:
curl example.de/ip/index.php?$(hostname)
Client:

Anzeigen der Server-"ip.txt":
Im Terminal kann die Datei "ip.txt" mit folgendem Befehl abgerufen werden.
Code:
curl http://server/ip/ip.txt
Tracken:

Variante 1:
Script wird manuell gestartet, trackt beim Aufruf, dann jeweils zur vollen Stunde

Auf dem Client wird ein Shellscript "iptracker" in ~/bin oder /usr/local/bin mit folgendem Inhalt erzeugt:
Code:
#!/bin/bash

# server ersetzen mit z.B. example.de/ip
# Beispiel:
# URL="http://example.de/ip/" oder URL="http://example.de/ip/index.php"

URL="http://server/"

echo "Starting IPTracker"
while true
 do
  /usr/bin/curl $URL?$(/bin/hostname)
  # beide sleeps jeweils ein-/auskommentieren, falls zur vollen Stunde oder Aufruf + 1 Stunde getrackt werden soll
  # volle Stunde, 0:23, 1:00, 2:00 usw.
  /bin/sleep $((60 * (60 - 10#$(date "+%M")) - 10#$(date "+%S")))
  # Aufruf + 1 Stunde
  #/bin/sleep 3600
 done
In ~/bin oder /usr/local/bin ausführen: [sudo] chmod 755 iptracker

Starten mit: ~/bin/iptracker [&]
oder /usr/local/bin/iptracker [&]
(... & lässt das Script im Hintergrund laufen)


Variante 2:
Script wird mit Launchd jede Stunde gestartet (empfohlen)

Auf dem Client wird ein Shellscript "iptracker" in /usr/local/bin mit folgendem Inhalt erzeugt:
Code:
#!/bin/bash

# server ersetzen mit z.B. example.de/ip
# Beispiel:
# URL="http://example.de/ip/" oder URL="http://example.de/ip/index.php"

URL="http://server/"

/usr/bin/curl $URL?$(/bin/hostname)
Auf dem Client wird eine Plist "org.ki.iptracker.plist" in /Library/LaunchDaemons mit folgendem Inhalt erzeugt:
Code:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>Label</key>
    <string>org.ki.iptracker</string>
    <key>Program</key>
        <string>/usr/local/bin/iptracker</string>
    <key>StartInterval</key>
        <integer>3600</integer>
</dict>
</plist>
In /usr/local/bin ausführen: sudo chmod 755 iptracker

Einmalig starten/registrieren mit: launchctl load /Library/LaunchDaemons/org.ki.iptracker.plist


Variante 3:
Script wird mit StartupItems gestartet, trackt beim Aufruf, dann jeweils zur vollen Stunde

Das Verzeichnis "iptracker" in /Library/StartupItems erstellen.
Hier hinein das gleiche Script wie aus Variante 1 speichern.
Folgende weitere Datei "StartupParameters.plist" speichern:
Code:
{
 Description = "iptracker";
 Provides = ("iptracker");
 Requires = (Network, "Network Configuration");
 OrderPreference = "none";
 Messages =
 {
  start = "Starting iptracker";
 };
}
In /Library/StartupItems ausführen: sudo chown 0:0 iptracker StartupParameters.plist; sudo chmod 755 iptracker


Anmerkungen:
Server:
Falls keine "ip.txt" erzeugt wird, muss sie erstellt werden. Rechte evtl. auf 666.
 
Zuletzt bearbeitet von einem Moderator:
@olivetti

mir fällt gerade auf das irgend wie es doch nicht so will wie es soll ...

habe Variante 2 genutzt,
und irgend wie scheiters wohl am shellscript

weil mit dem befehl

#!/bin/bash

# server ersetzen mit z.B. example.de/ip
# Beispiel:
# URL="http://example.de/ip/" oder URL="http://example.de/ip/index.php"

URL="http://server/"

/usr/bin/curl $URL?$(/bin/hostname)

kommt nur
curl: (3) <url> malformed
logout

und wenn ich nur ein Shellscript selber mache aus version 1
#!/bin/bash

# server ersetzen mit z.B. example.de/ip
# Beispiel:
# URL="http://example.de/ip/" oder URL="http://example.de/ip/index.php"

URL="http://server/"

dann macht der das aber im textfile kommt kein eintrag

hmmm
 
Direkt mal im Terminal

curl http://deinserver.de/deineip.php

aufrufen.
Dann kommt einfach die WAN-IP zurück und in der ip.txt steht nur Datum # IP # ohne hostname.

Wenn das geht, dann

curl http://deinserver.de/deineip.php?$(hostname)

und schauen was in der ip.txt steht.

(Alles direkt im Terminal eingeben, mit bash als shell)
 
Direkt mal im Terminal

curl http://deinserver.de/deineip.php

aufrufen.
Dann kommt einfach die WAN-IP zurück und in der ip.txt steht nur Datum # IP # ohne hostname.

Wenn das geht, dann

curl http://deinserver.de/deineip.php?$(hostname)

und schauen was in der ip.txt steht.

(Alles direkt im Terminal eingeben, mit bash als shell)

jo hatte auch schon mit curl rausgefunden ;)
Danke jetzt rockt es richtig, nur noch die letzte frage zur PHP datei
<?php
$IP = $_SERVER['REMOTE_ADDR'];
echo $IP;
$QS = $_SERVER['QUERY_STRING'];
$handle = fopen ("ip.txt", "a+");
fwrite ($handle, date("c")." # ".$IP."\t# ".$QS."\n");
fclose ($handle);
?>


kann ich auch sagen der letzte wert immer ganz oben anzeigen, jetzt ist es ja absteigend, wollte es aber aufsteigend glaub ich nutzen ;)
 
Wenn der Client reversen soll, gibt's tac (reverse cat):

Code:
curl http://server/ip/ip.txt | tac

Wenn der Server reversen soll:

PHP:
<?php
 $IP = $_SERVER['REMOTE_ADDR'];
 echo $IP;
 $QS = $_SERVER['QUERY_STRING'];
 $FILE = "ip.txt";
 $DATA = file_get_contents($FILE);
 $handle = fopen ($FILE, "w+");
 fwrite ($handle, date("c")." # ".$IP."\t# ".$QS."\n".$DATA);
 fclose ($handle);
?>
 
Zuletzt bearbeitet:
Wenn der Client reversen soll, gibt's tac (reverse cat):

Code:
curl http://server/ip/ip.txt | tac

Wenn der Server reversen soll:

PHP:
<?php
 $IP = $_SERVER['REMOTE_ADDR'];
 echo $IP;
 $QS = $_SERVER['QUERY_STRING'];
 $FILE = "ip.txt";
 $DATA = file_get_contents($FILE);
 $handle = fopen ($FILE, "w+");
 fwrite ($handle, date("c")." # ".$IP."\t# ".$QS."\n".$DATA);
 fclose ($handle);
?>


alter falter du bist ein Programmier GOTT ;)
 
Ja, das bauen wir schon noch ein.
Erstmal Passwortschutz und dann Geolocation.
Nur habe ich die nächsten Tage eher weniger Zeit dafür.
 
Ja, das bauen wir schon noch ein.
Erstmal Passwortschutz und dann Geolocation.
Nur habe ich die nächsten Tage eher weniger Zeit dafür.

erst mal juhu ;)

passwortschutz mache ich mit einer .htaccess Datei, so kommt man schon ganricht ins verzeichniss rein. Denke mal das sollte schon recht sicher sein.
Dann jage ich alles noch über einen SSL Dienst, also auch da sollte keine möglichkeit sein die Daten so mitzulesen und so an die passwörter zu kommen.
 
Ich muss den Thread hier mal nochmal ausgraben, da ich mich in letzter Zeit etwas mit Geolocation bzw. JSON beschäftigt habe, um mit Geektool meine aktuelle Position (via WIFI-Tracking) auf dem Desktop anzeigen zu lassen (Adresse + Karte). Folgendes könnte für dich interessant sein:

Bestimmen der Adresse:

Code:
# Scannen der WLANs in der Nähe
wifi=[$(airport -s | grep : | sed -e 's/^.\{33\}/{"mac_address":"/' -e 's/\ .*/","signal_strength":8,"age":0},/' | tr "\n" " ")]};

# Bestimmen der Position via JSON
loc=$(echo '{"version": "1.1.0","host": "maps.google.com","request_address": true,"address_language": "en_GB", "wifi_towers": '$wifi  | sed -e 's/" /"/' -e 's/ "/"/g' > /tmp/post.$$ && curl -X POST -d @/tmp/post.$$ http://www.google.com/loc/json | sed -e 's/{/\n/g' -e 's/,/\n/g');

# Aufarbeiten der Information
city=$(echo $loc | sed -e 's/.*county":"//' -e 's/"n"city.*//');
street=$(echo $loc | sed -e 's/.*street":"//' -e 's/"n"street_number.*//');
PLZ=$(echo $loc | sed -e 's/.*postal_code":"//' -e 's/"}n"accuracy.*//');
street_number=$(echo $loc | sed -e 's/.*number":"//' -e 's/"n"postal.*//');

# Ausgeben der Information
echo $street\ $street_number,\ $PLZ\ $city;

Herunterladen eines Kartenaussschnitts:

Code:
# Scannen der WLANs in der Nähe
wifi=[$(airport -s | grep : | sed -e 's/^.\{33\}/{"mac_address":"/' -e 's/\ .*/","signal_strength":8,"age":0},/' | tr "\n" " ")]}

# Bestimmen der Position via JSON
loc=$(echo '{"version": "1.1.0","host": "maps.google.com","request_address": true,"address_language": "en_GB", "wifi_towers": '$wifi  | sed -e 's/" /"/' -e 's/ "/"/g' > /tmp/post.$$ && curl -X POST -d @/tmp/post.$$ http://www.google.com/loc/json | sed -e 's/{/\n/g' -e 's/,/\n/g');

# Aufarbeiten der Information
lat=$(echo $loc | sed -e 's/.*latitude\"\://' -e 's/n\"longitude.*//');
long=$(echo $loc | sed -e 's/.*longitude\"\://' -e 's/n\"address.*//');

# Festlegen der Parameter
width=400
height=400
zoom=15
if [ -n "$3" ]; then
    zoom="$3"
fi

# Festlegen des Speicherorts
filename="~/temp/location.png"

# Herunterladen des Bildes
curl "http://maps.google.com/maps/api/staticmap?center=$lat,$long&zoom=$zoom&size=${width}x${height}&sensor=false" > $filename;

# small error checking
if [ $? -ne 0 ]; then
    echo "An error occured" >&2
    exit 1
fi

Ich bin nicht wirklich fit im Shellscripting, etwaige Fehler sehe man mir daher bitte nach. Für Anregungen bin ich stets dankbar.
 
Ich muss den Thread hier mal nochmal ausgraben, da ich mich in letzter Zeit etwas mit Geolocation bzw. JSON beschäftigt habe, um mit Geektool meine aktuelle Position (via WIFI-Tracking) auf dem Desktop anzeigen zu lassen (Adresse + Karte). Folgendes könnte für dich interessant sein:

Bestimmen der Adresse:

Code:
# Scannen der WLANs in der Nähe
wifi=[$(airport -s | grep : | sed -e 's/^.\{33\}/{"mac_address":"/' -e 's/\ .*/","signal_strength":8,"age":0},/' | tr "\n" " ")]};

# Bestimmen der Position via JSON
loc=$(echo '{"version": "1.1.0","host": "maps.google.com","request_address": true,"address_language": "en_GB", "wifi_towers": '$wifi  | sed -e 's/" /"/' -e 's/ "/"/g' > /tmp/post.$$ && curl -X POST -d @/tmp/post.$$ http://www.google.com/loc/json | sed -e 's/{/\n/g' -e 's/,/\n/g');

# Aufarbeiten der Information
city=$(echo $loc | sed -e 's/.*county":"//' -e 's/"n"city.*//');
street=$(echo $loc | sed -e 's/.*street":"//' -e 's/"n"street_number.*//');
PLZ=$(echo $loc | sed -e 's/.*postal_code":"//' -e 's/"}n"accuracy.*//');
street_number=$(echo $loc | sed -e 's/.*number":"//' -e 's/"n"postal.*//');

# Ausgeben der Information
echo $street\ $street_number,\ $PLZ\ $city;

Herunterladen eines Kartenaussschnitts:

Code:
# Scannen der WLANs in der Nähe
wifi=[$(airport -s | grep : | sed -e 's/^.\{33\}/{"mac_address":"/' -e 's/\ .*/","signal_strength":8,"age":0},/' | tr "\n" " ")]}

# Bestimmen der Position via JSON
loc=$(echo '{"version": "1.1.0","host": "maps.google.com","request_address": true,"address_language": "en_GB", "wifi_towers": '$wifi  | sed -e 's/" /"/' -e 's/ "/"/g' > /tmp/post.$$ && curl -X POST -d @/tmp/post.$$ http://www.google.com/loc/json | sed -e 's/{/\n/g' -e 's/,/\n/g');

# Aufarbeiten der Information
lat=$(echo $loc | sed -e 's/.*latitude\"\://' -e 's/n\"longitude.*//');
long=$(echo $loc | sed -e 's/.*longitude\"\://' -e 's/n\"address.*//');

# Festlegen der Parameter
width=400
height=400
zoom=15
if [ -n "$3" ]; then
    zoom="$3"
fi

# Festlegen des Speicherorts
filename="~/temp/location.png"

# Herunterladen des Bildes
curl "http://maps.google.com/maps/api/staticmap?center=$lat,$long&zoom=$zoom&size=${width}x${height}&sensor=false" > $filename;

# small error checking
if [ $? -ne 0 ]; then
    echo "An error occured" >&2
    exit 1
fi

Ich bin nicht wirklich fit im Shellscripting, etwaige Fehler sehe man mir daher bitte nach. Für Anregungen bin ich stets dankbar.

Wow hut ab, Geektool kannte ich bis jetzt grade garnicht ^^

ist jetzt die frage ob man das mal eben in Php übernehmen kann ;)
 
Ein Großteil müsste wahrscheinlich sowieso auf der Clientseite passieren, wie zum Beispiel das Scannen der WLANs, alles andere geht wahrscheinlich auch mit php, das muss aber jemand anderes machen ;)
 
ja bin gerade auch dran, du hattestgesagt du kennst dich was aus,
gibts eine google URL auf die ich gehe und der mir einfach eine kordinate ausspuckt ?
 
Ganz so einfach geht's nicht ;)

Es müssen zuerst Ortungsinformationen gesammelt werden und gesammelt gespeichert werden, die sieht z.B. so aus:

Code:
{
  "version": "1.1.0",
  "host": "maps.google.com",
  "home_mobile_country_code": 310,
  "home_mobile_network_code": 410,
  "radio_type": "gsm",
  "carrier": "Vodafone",
  "request_address": true,
  "address_language": "en_GB",
  "location": {
    "latitude": 51.0,
    "longitude": -0.1
  },
  "cell_towers": [
    {
      "cell_id": "42",
      "location_area_code": 415,
      "mobile_country_code": 310,
      "mobile_network_code": 410,
      "age": 0,
      "signal_strength": -60,
      "timing_advance": 5555
    },
    {
      "cell_id": "88",
      "location_area_code": 415,
      "mobile_country_code": 310,
      "mobile_network_code": 580,
      "age": 0,
      "signal_strength": -70,
      "timing_advance": 7777
    }
  ],
  "wifi_towers": [
    {
      "mac_address": "01-23-45-67-89-ab",
      "signal_strength": 8,
      "age": 0
    },
    {
      "mac_address": "01-23-45-67-89-ac",
      "signal_strength": 4,
      "age": 0
    }
  ]
}

Dann wird das als HTTP Request an Google gesendet:

Code:
curl -X POST -d @/tmp/post.$$ http://www.google.com/loc/json

Google sendet dir dann das Ergebnis zurück:

Code:
{
  "location": {
    "latitude": 51.0,
    "longitude": -0.1,
    "altitude": 30.1,
    "accuracy": 1200.1,
    "altitude_accuracy": 10.1,
    "address": {
      "street_number": "100",
      "street": "Amphibian Walkway",
      "postal_code": "94043",
      "city": "Mountain View",
      "county": "Mountain View County",
      "region": "California",
      "country": "United States of America",
      "country_code": "US"
    }
  }
}

Quelle: http://code.google.com/p/gears/wiki/GeolocationAPI

Es wird also wohl nicht anders gehen, als das auf dem Client laufen zu lassen, und dann kannst du das auch gleich als Shellskript realisieren. Du stehst dann eben wieder vor dem Problem, dass du die Daten an den Server schicken musst.
 
intresannt, ja aber das muss auch irgend wie per PHP gehen, da ja googlemaps das ja auch schaft.
hmmm wird noch was schwerer
 
Bestimmen der Adresse:


Code:
# Scannen der WLANs in der Nähe
wifi=[$(airport -s | grep : | sed -e 's/^.\{33\}/{"mac_address":"/' -e 's/\ .*/","signal_strength":8,"age":0},/' | tr "\n" " ")]};

# Bestimmen der Position via JSON
loc=$(echo '{"version": "1.1.0","host": "maps.google.com","request_address": true,"address_language": "en_GB", "wifi_towers": '$wifi  | sed -e 's/" /"/' -e 's/ "/"/g' > /tmp/post.$$ && curl -X POST -d @/tmp/post.$$ [url]http://www.google.com/loc/json[/url] | sed -e 's/{/\n/g' -e 's/,/\n/g');

# Aufarbeiten der Information
city=$(echo $loc | sed -e 's/.*county":"//' -e 's/"n"city.*//');
street=$(echo $loc | sed -e 's/.*street":"//' -e 's/"n"street_number.*//');
PLZ=$(echo $loc | sed -e 's/.*postal_code":"//' -e 's/"}n"accuracy.*//');
street_number=$(echo $loc | sed -e 's/.*number":"//' -e 's/"n"postal.*//');

# Ausgeben der Information
echo $street\ $street_number,\ $PLZ\ $city;
Herunterladen eines Kartenaussschnitts:



Code:
# Scannen der WLANs in der Nähe
wifi=[$(airport -s | grep : | sed -e 's/^.\{33\}/{"mac_address":"/' -e 's/\ .*/","signal_strength":8,"age":0},/' | tr "\n" " ")]}

# Bestimmen der Position via JSON
loc=$(echo '{"version": "1.1.0","host": "maps.google.com","request_address": true,"address_language": "en_GB", "wifi_towers": '$wifi  | sed -e 's/" /"/' -e 's/ "/"/g' > /tmp/post.$$ && curl -X POST -d @/tmp/post.$$ [url]http://www.google.com/loc/json[/url] | sed -e 's/{/\n/g' -e 's/,/\n/g');

# Aufarbeiten der Information
lat=$(echo $loc | sed -e 's/.*latitude\"\://' -e 's/n\"longitude.*//');
long=$(echo $loc | sed -e 's/.*longitude\"\://' -e 's/n\"address.*//');

# Festlegen der Parameter
width=400
height=400
zoom=15
if [ -n "$3" ]; then
    zoom="$3"
fi

# Festlegen des Speicherorts
filename="~/temp/location.png"

# Herunterladen des Bildes
curl "http://maps.google.com/maps/api/staticmap?center=$lat,$long&zoom=$zoom&size=${width}x${height}&sensor=false" > $filename;

# small error checking
if [ $? -ne 0 ]; then
    echo "An error occured" >&2
    exit 1
fi


su läuft das den bei dir so ?
Weil ich habe das jetzt mal mit dem Terminal durchgejagt und leider läuft das nicht ganz so rund

ich bekomme da z.b. dann
Code:
-bash: ~/temp/location.png: No such file or directory

denke dann aber das liegt daran das es nicht 100% Shell ist sondern für Geektool ist

hmm
 
Nene, der Fehler liegt schon an mir :D

~ funktioniert nicht, da muss der volle Pfad hin. Die Zeile lautet also z.B.

Code:
filename="/temp/location.png"

Wenn das ein Mod bitte noch im Original ändern würde wärs fantastisch. Danke!
 
Zuletzt bearbeitet:
Zurück
Oben Unten