59494
Goto Top

Externe IP auslesen und in Datei und Datenbank schreiben

Bin neu und brauche Hilfe ;)

Zuersteinmal hallo. Ich bin neu hier und habe die Seite über eine Suchmaschine gefunden. Zwar habe ich nicht die LÖsung gefunden doch war die Seite das kompenteste was ich gelesen habe. Ich wette, ich bin im falschen Unterforum gelandet, da ich nicht genau angeben kann wozu dieser Beitrag nun gehört.

Vorab einige vielleicht benötigte Angaben

Betriebssystem: Vista Ultimate64 als Admin
Netzwerk: Internet<->Router<->Computer
Kenntnisse: grundlegende Kenntnisse vorhanden, jedoch absolut unterbegabt und selbst mit Einlesung keinerlei Verständnis von Programmierung, tut mir leid. Ich lese und lese und verstehe nur Bahnhof
Auf dem betroffenem PC läuft Xampp (also Apache/SQL usw)


Ich suche ein Programm/Tool/Batch/Dienst (ich weiß nicht mit was es möglich ist), welcher

- automatisch läuft und in jede X Minuten untenstehende Sache ausführt
- Externe aktuelle IP auslesen
- Vergleich mit IP in der Hosts-Datei(C/Windows/System32/Drivers/etc/ ist die drin) und falls diese abweicht, die mit der externen IP ersetzen. Die Hosts-Datei hat nur einen von mir geänderten Eintrag der wie folgt lautet: 127.0.0.1 xx.xx.xx.xx (letzteres ist die externe IP)
- Vergleich mit einem Eintrag aus einer sql-Datenbank und dort die IP abgleicht und bei Bedarf ersetzt)

Letzteres ist mir wichtiger
Wie stelle ich das an. Leider habe ich keinerlei Ahnung. Wichtig ist vor allem das es ständig auf dem Server läuft

Content-Key: 77179

Url: https://administrator.de/contentid/77179

Printed on: April 25, 2024 at 16:04 o'clock

Member: utopia
utopia Jan 04, 2008 at 02:08:19 (UTC)
Goto Top
Hi, willkommen. Bin auch erst seit wenigen Minuten hier angemeldet, versuche aber mal mein Glück, dir zu helfen.

Ich würde das über eine Batch-Datei machen, die Automatisch alle x Minuten ausgeführt wird.

Schritt 1: Ermittlung der externen IP-Adresse

Das ist wohl am schwierigsten.
Variante A: Ich würde versuchen über deinen DNS-Provider die IP aktualisiert zu halten. z.B. DynDNS. Funktionsweise:
Bei jedem Anmelden im Internet ändert sich die IP-Adresse (dynamische IP). Der Router meldet sich bei DynDNS und teilt mit, dass er mit einer neuen IP im Netz ist. So wird der DNS-Eintrag aktualisiert. Wie kommst du nun an deine IP? Du setzt eine Namensauflösung ab
nslookup //dein_dnydns_name//.dyndns.org
Dann hast du schonmal u.a. die externe IP auf dem Bildschirm.
Variante B: Such dir eine Internetseite, die nur deine IP anzeigt und speichere diese dann in einer Datei

Schritt 2: Hosts aktualisieren
In deiner Batchdatei schreibst du:
echo "127.0.0.1  localhost ip_address" > C:/Windows/System32/Drivers/etc/hosts  

Schritt 3: Datenbank aktualisieren
\\PFAD-ZU-MYSQL-BIN\\/mysql -e "UPDATE ip_address_table SET ip_address_att = "ip_address" WHERE id = 1"  

Schritt 4: Als Permanenter Job
Systemsteuerung -> Geplanter Task - > Neuer Task
Durchsuchen ... -> Script auswählen -> Täglich ausführen -> Ausführender Benutzer -> Fertig stellen
Task rechts anklicken -> Eigenschaften -> Reiter Zeitplan -> Button Erweitert...
Häkchen bei Task wiederholen -> Alle x Minuten -> OK -> OK


Ich hoffe ich konnte dir helfen.
Mitglied: 59494
59494 Jan 04, 2008 at 13:06:18 (UTC)
Goto Top
Erstmal vielen Dank für die Antwort. Die hat mir viel zu meinem Veständnis geholfen.
Mittlerweile habe ich feststellen können dass ich die Hostfile doch nicht mehr brauche.

Ich habe jetzt zwar verstanden wie ich das als permanten Job einrichten kann, nicht aber wie ich das selbst mache.
Sprich ich erstelle ne Txt, bennene die zu xyz.cmd um(richtig?) und dann bearbeiten und da kommt das script rein.
Aber wie weiter?

nslookup xyz.dyndns.org
\\PFAD-ZU-MYSQL-BIN\\/mysql -e "UPDATE GewuenschteTabelle SET adress= "ip_address" WHERE id = 1"

So GewueschteTabelle ist der Tabellenname? Ja aber die Datenbank muss doch auch noch angegeben werden oder
Und wo find ich den Pfad zur mysql-bin.
In dem obigen Zweizeiler fehlt doch irgendwie noch der übergang, sprich auslesen der ip(steht ja adress: xxx.xxx.xxx.xx

Sorry, das klingt so blöd was ich schreibe aber ich weiß das alles wirklich nicht


Edit: Bin schon weiter:
test.bat=>

REM 1. * IP-Adresse mittels ipconfig auslesen u. in ip1.txt schreiben *
nslookup schlingendorntal.dyndns.org | find "Ad" > ip1.txt
REM * ergibt den Inhalt " IP-Adresse. . . . . . . . . . . . : 213.123.123.123" in ip1.txt *

REM 2. * nun den vorderen Teil " IP-Adresse. . . . . . . . . . . . :" in ip2.txt ablegen *
for /f "tokens=1-2 delims=:" %%i in (ip1.txt) do echo %%j > ip2.txt

Und wie gehts nun weiter

In der Ip2.txt steht nun die ip-Adress leider mit leerzeichen so in etwa(ohne ""): " xx.xxx.xxx.xx"

Wie gehts weiter sprich wieder auslesen(vielleicht ohne leerzeichen) und dann
Member: Biber
Biber Jan 04, 2008 at 14:59:37 (UTC)
Goto Top
Moin Drullo321,

willkommen im Forum.
Zum Zwischenspeichern der gefundenen IP folgende Zeilen in Deine Batchdatei einbauen:
:: ----HoleIPviaNslookup.cmd
@echo off & setlocal
for /f "tokens=2" %%i in ('nslookup xyz.dyndns.org^|find "Add"') do set "IP=%%i"  
....
:: Jetzt steht die IP in der Variablen %IP% und kann in dem SQL.Statement als %IP% eingesetzt werden.

Eine Batchdatei anlegen: Code in einem Texteditor eintippen, falls gar nichts anderes vorhanden auch im Notepad, "speichern unter" irgendwo, wo Du sie wiederfindest mit dem Namen "DeinKreativerBatchname.cmd" in Anführungszeichen, damit nicht der doofe Notepad die Endung ".txt" anhängt.

Anmerkung: Wenn Du komplexe Anforderungen hast oder glaubst zu haben, dann...
  • wenn Du gar nichts hast: für formulierbare Teilprobleme jeweils einen Thread. Fragen, Antworten abwarten, als "erledigt" kennzeichnen.
  • wenn Du schon einen Ansatz hast: Poste das. ggf mit Pseudo-Code. Sich beim Antworten alles (Namen/Pfade/Variablen etc) neu UND allgemein verständlich auszudenken ist lumpig.

Insbesondere die Nachfrage "Und wo find ich den Pfad zur mysql-bin." ist ...ähh.. hmmm.... schwer zu beantworten von meiner Tastatur aus.

Grüße
Biber
Mitglied: 59494
59494 Jan 04, 2008 at 15:08:11 (UTC)
Goto Top
Ja tut mir leid. Mit der Nachfrage zur mysqlbin meinte ich eher das Format, also z.Bsp. C:\xyz\xyz oder doch C:/xyz/xyz.

Kannst du bitte nochmal über das Script schauen. Es sieht nun folgendermaßen aus:

@echo off & setlocal
for /f "tokens=2" %%i in ('nslookup schlingendorntal.dyndns.org^|find "Add"') do set "ip_adress=%%i"
C:\xampp\mysql\data\datenbankname\ /mysql -e "UPDATE dbtabelle SET adress = "ip_adress" WHERE id = 1"
Member: Biber
Biber Jan 04, 2008 at 15:45:41 (UTC)
Goto Top
Moin Drullo321,

Fast.
In der Aufrufzeile muss erstens die Variable IP wirklich in der Schreibweise %IP% eingefügt werden:
... "UPDATE dbtabelle SET adress = '%IP%' WHERE id = 1"
Hierzu solltest Du einfach mal diesen Teil (oder die ganze Zeile) mit vorangestelltem "ECHO" anzeigen lassen vor dem Ausführen.
ECHO Statement; "UPDATE dbtabelle SET adress = '%IP%' WHERE id = 1"
Wobei offen gestanden der Sinn dieses Updates mir noch verschlossen bleibt.
Wenn Du immer nur einen Datensatz mit einem Feld in der Tabelle hast, weißt Du doch nie, ob und wie aktuell dieser Wert ist.
Wäre nicht sinnvoller, jeweils einen neuen DS anzufügen mit zumindest der Datumsangabe und beim SELECT den Neuesten zu holen?

Zweitens...bevor Du das Statement abfeuern kannst, solltest Du ja a) connected und b) authentifiziert sein.
Also wäre es evtl sinnvoller, aus dem Batch heraus eine kleine update.sql zu schreiben, in der zuerst Schritt a) und b) und dann als Schritt c) diese UPDATE-Zeile.
Und dazu wiederum wäre es am sinnvollsten, zuerst so eine Mini-.sql nur mit a) und b) anzulegen und zum Fliegen zu bringen und dann c) anzufügen.

Grüße
Biber
Mitglied: 59494
59494 Jan 04, 2008 at 15:57:26 (UTC)
Goto Top
Hört sich total kompliziert an. Kannst du mir was kleines schreiben ;(
Member: Biber
Biber Jan 04, 2008 at 16:12:16 (UTC)
Goto Top
Moin Drullo321,

klar kann ich das.
Sobald Du die Vorarbeit "zuerst so eine Mini-.sql nur mit a) und b) anzulegen und zum Fliegen zu bringen" erledigt hast und diese zwei Zeilen funktionieren, kannst Du dieses Gerüst als ConnectMe.sql abspeichern.
Im Batch bruchst Du dann nur noch zu schreiben:
...[...IP-Ermittlung...]
Copy ConnectMe.sql %temp%\IpUpdate.sql
ECHO UPDATE dbtabelle SET adress = '%IP%' WHERE id = 1; >>%temp%\IpUpdate.sql  
[PfadZurMysql.exe]mysql -e %temp%\IpUpdate.sql
REM -oder- START %temp%\IpUpdate.sql

Grüße
Biber
Mitglied: 59494
59494 Jan 04, 2008 at 19:47:15 (UTC)
Goto Top
Hilfe, Bahnhof.

Du verlangst von mir etwas das so klingt wie als wäre ich nen Pilot, von dem verlangt wird mal eben ne schwierige HerzOp drchzuführen

Also sehe ich das richtig. Ich habe eine COnnectMeSql mit zwei Zeilen, die die Zugangsdaten für mysql enthalten. Dann habe ich hier die batch. Was ist das für ne IPUpdate.sql

Ich blicke überhaupt nicht durch und habe 0 Ahnung ;(
Member: Biber
Biber Jan 05, 2008 at 00:23:45 (UTC)
Goto Top
Nun mal keine Panik, Drullo321,

immerhin war diese Aktion Deine Idee und nicht meine. Ich hätte mich so etwas nie getraut.

Dann machen wir es ganz spartanisch und mit der zeitlosen Eleganz von Münteferings Socken.
::----DerGanzeUpdateIPBatch.cmd --
@echo off & setlocal
Set "pfadzurMySqlexe=D:\as\musst\Du\anpassen"  
for /f "tokens=2" %%i in ('nslookup xyz.dyndns.org^|find "Add"') do set "IP=%%i"  
Set stmt="UPDATE dbtabelle SET adress = '%IP%' WHERE id = 1"  
"%pfadzurMySqlexe%\mysql" --user=DeinDrulloname --password=DeinDrulloPassword --execute=%stmt% DeinDBName  
:: -ODER alternativ zur Vorzeile
:: ALTERNATIV :"%pfadzurMySqlexe%\mysql" --u DeinDrulloname -p DeinDrulloPassword -e %stmt% DeinDBName  

Das sollte das machen, was Dein Plan ist.
Den tieferen Sinn begreife ich nicht. Muss ja auch nicht sein.

Grüße
Biber
Mitglied: 59494
59494 Jan 05, 2008 at 10:14:25 (UTC)
Goto Top
Ich habe dein Script noch ein wenig editiert (weil es nicht so funktioniert hat):

@echo off & setlocal
Set abc=C:\xampp\mysql\bin\mysql.exe
for /f "tokens=2" %i in ('nslookup xyz.dyndns.org^|find "Add"') do set "IP=%i"
Set stmt="UPDATE tabelle SET address = '%IP%' WHERE id = 1"
%abc% --user=root --password=meinPW --execute=%stmt% datenbank

Jetzt habe ich nur noch EIN Problem
Wenn ich das zeilenweise manuell in cmd eingebe, funktioniert es.
Wenn ich es per bat ausführen lasse, hängt er mir noch ein ) hinter die IP in der DB also xx.xx.xx.xx) ODER wie jetzt erade ändert gar nichts wenn ich das script ausführe
Wie beheb ich das?
Member: Biber
Biber Jan 05, 2008 at 10:57:45 (UTC)
Goto Top
Moin Drullo321,

dann versuchen wir mal, den/die Fehler zu finden.
Du kannst es einweder dam CMD-Prompt testen und dann bei allen Zählvariablen (=alle %%i usw in FOR-Anweisungen) ein statt zwei %-Zeichen schreiben.
Oder im Batch die Anweisung vor dem Ausführen mit "echo der befehl der ausgeführt werden soll" anzeigen lassen.
Und Schließen kannst Du durch eine neue Zeile "pause" verhindern.

In der jetzigen Variante ist das Setzen der %pfadZurMySQLexe% ohnehin nicht nötig. mySql.exe wird ja nur 1x aufgerufen. Streichen. Im Moment ist Als ich meinen Kommentar geschrieben habe war die erste SET-Anweisung ohnehin falsch. Siehe Set /?.

Also bitte testen am CMD-Prompt:
nslookup sxyz.dyndns.org|find "Add"  
for /f "tokens=2" %i in ('nslookup sxyz.dyndns.org^|find "Add"') do set "IP=%i"  
echo IP: [%IP%]
Set stmt="UPDATE tabelle2 SET adress = '%IP%' WHERE id = 1"  
echo Stmt: [%Stmt%]
"C:\xampp\mysql\bin\mysql.exe" --user=root --password=unkenntlichgemacht --execute=%stmt% datenbank  

..und jeweils nur weitertesten, wenn von der ersten Zeile an alles etwas Brauchbares zurückgibt.
Eventuell sinnvoll: erstmal ein einfaches SELECT via CMD-Prompt testen.
Set stmt="Select adress from  tabelle2 WHERE id = 1"  
echo Stmt: [%Stmt%]
"C:\xampp\mysql\bin\mysql.exe" --user=root --password=unkenntlichgemacht --execute=%stmt% datenbank  

[Edit] Okay, fehlt nur noch die Kontrolle mit "echo [%IP%]" und echo [%stmt%], den Rest hast Du schon selbst gefunden. [/Edit]

Gruß
Biber
Mitglied: 59494
59494 Jan 05, 2008 at 11:08:06 (UTC)
Goto Top
Kannst du nochmal mein Edit lesen. habe massiv editiert während du das wohl geschrieben hast. tut mir leid. Während dessen les ich mir deins nochmal durch

wenn ich im script wieder %I durch %%i ersetze geht es wieder aber nur automatisch ausgeführt. Unlogisch für mich