Vor einiger Zeit habe ich einen Artikel über die Verwendung eines beliebigen DynDNS-Dienstes hinter einem Router, der selber keine Möglichkeit bietet diesen Dienst zu nutzen, geschrieben.
Bei meinem ursprünglichen Skript war es nötig das Linux-Tool wget unter Windows zu verwenden und auf ein eigenes PHP-Skript, das einen eigenen Webspace voraussetzt, zu nutzen. Bei diesem Skript hingegen wird mittels Visual Basic Script die Aufgabe von wget übernommen und die Ausgabe der Webseite https://checkip.dyndns.com/ geladen. Da diese Seite nicht nur die IP-Adresse, sondern auch anderen Quellcode ausgibt, muss dieser noch gefiltert und zurecht gestutzt werden.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
@echo off & setlocal set URL=https://checkip.dyndns.com/ set G=%temp%\GetHTML.vbs echo On Error Resume Next:Set Http=CreateObject("WinHttp.WinHttpRequest.5.1"):Http.Open "GET",WScript.Arguments(0),False:Http.Send:Q=Split(Http.ResponseText,":")(1):WScript.Echo Trim(Split(Q,"<")(0))>%G% set ExtIP= for /f %%i in ('cscript //nologo %G% "%URL%"') do set "ExtIP=%%i" del %G% if not defined ExtIP echo Externe IP konnte nicht ermittelt werden. & goto :eof echo %ExtIP% pause |
Das vorliegende Batch-Skript generiert eine VBS-Datei im Temp-Ordner, welche dann mittels des Befehls csript mit Übergabe der aufzurufenden URL gestartet wird.
Quelle für den Code:
https://www.administrator.de/forum/oeffentlich-ip-adresse-privaten-netz-raus-finden-90533.html
In das bisher genutzte Skript, das die ermittelte IP-Adresse im Account bei SPDYN aktualisiert, habe ich das ganze wie folgt eingebaut:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 |
@echo off & setlocal echo %date% - %time% - Ermittlung der aktuellen oeffentlichen IP gestartet >>C:\publicip.log :: Aktuelle oeffentliche IP-Adresse ermitteln und Variablen setzen set URL=https://checkip.dyndns.com/ set G=%temp%\GetHTML.vbs echo On Error Resume Next:Set Http=CreateObject("WinHttp.WinHttpRequest.5.1"):Http.Open "GET",WScript.Arguments(0),False:Http.Send:Q=Split(Http.ResponseText,":")(1):WScript.Echo Trim(Split(Q,"<")(0))>%G% set actualip= for /f %%i in ('cscript //nologo %G% "%URL%"') do set "actualip=%%i" del %G% set /p lastip=<lastip.tmp set hostname=*.spdns.* set password=to-ke-n :: Abgleichen ob sich die IP-Adresse geaendert hat, wenn nicht keine Aktualisierung durchfuehren if %actualip%==%lastip% goto ENDE1 :: neue IP-Adresse als letzte IP speichern del lastip.tmp echo %actualip% >> lastip.tmp :: Aktualisierung der IP-Adresse bei spdyn durchfuehren :: Syntax für die Update-URL: https://update.spdyn.de/nic/update?hostname=<HOSTNAME>&myip=192.168.0.1&user=<BENUTZERNAME>&pass=<KENNWORT> set URL="https://update.spdyn.de/nic/update?hostname=%hostname%$myip=%actualip%$user=%hostname%$pass=%password%" set G=%temp%\GetHTML.vbs echo On Error Resume Next:Set Http=CreateObject("WinHttp.WinHttpRequest.5.1"):Http.Open "GET",Replace(WScript.Arguments(0),"$","&"),,False:Http.Send:Q=Http.ResponseText:WScript.Echo Trim(Q)>%G% cscript //nologo %G% "%URL%" del %G% echo %date% - %time% - Neue IP gesetzt >>C:\publicip.log goto ENDE2 :ENDE1 echo %date% - %time% - Die IP wurde nicht erneuert >>C:\publicip.log :ENDE2 |
Es gab leider noch ein kleines Problem bei der Erstellung der URL für das SPDYN-Update. Das &-Zeichen wird in VBScript anscheinend für Keyboard-Shortcuts verwendet und falsch interpretiert. Ein Escapen durch ein weiteres & hat leider nicht funktioniert, zumindest nicht für den ersten Parameter in der URL. Deshalb habe ich den String in der Batch-Datei deshalb statt mit den &-Zeichen mit $-Zeichen zusammengebaut, welche dann wiederum im VBScript-Code einfach wieder durch &-Zeichen ersetzt werden. Dafür sorgt der Befehl Replace(WScript.Arguments(0),“$“,“&“).
Soweit funktioniert das Skript nun ohne zusätzliche Tools und ohne eigene Domain. Wenn man allerdings trotzdem das eigene PHP-Skript verwenden möchte, so ist das mit folgender Anpassung möglich:
1 2 3 4 5 |
:: Aktuelle oeffentliche IP-Adresse ermitteln und Variablen setzen set URL=https://blog.devilatwork.de/scripts/get-public-ip-address.php set G=%temp%\GetHTML.vbs echo On Error Resume Next:Set Http=CreateObject("WinHttp.WinHttpRequest.5.1"):Http.Open "GET",WScript.Arguments(0),False:Http.Send:Q=Http.ResponseText:WScript.Echo Trim(Q)>%G% |