IP ermitteln

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
JohnR
User
Beiträge: 23
Registriert: Freitag 25. Juni 2010, 19:42

Hallo

Ich verwende diesen Skript um meine IP zu ermitteln

Code: Alles auswählen

site = urllib.urlopen("http://dmiessler.com/ip").read()
grab = re.findall('\d{2,3}.\d{2,3}.\d{2,3}.\d{2,3}',site)
address = grab[0]
würde aber gerne als URL

Code: Alles auswählen

http://www.ip-adress.com/ip_lokalisieren/
verwenden, da ich nicht weiss wie lange die private Seite noch existent ist.

Wenn ich die URL aber einfach verwende bekomme ich die Fehlermeldung

Code: Alles auswählen

IndexError: list index out of range
Was müßte ich denn verändern damit die Seite mit dem Skript funktioniert ?


Gruß John
Dav1d
User
Beiträge: 1437
Registriert: Donnerstag 30. Juli 2009, 12:03
Kontaktdaten:

Ich würde eine andere URL verwenden:

Code: Alles auswählen

http://checkip.dyndns.org/
the more they change the more they stay the same
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

Die Fehlermeldung bekommst du, weil der reguläre Ausdruck nichts gefunden hat was passt. Warum verwendest du denn eigentlich \d{2,3}? Das muss zwangsläufig fehlschlagen, wenn ein Teil der IP-Adresse nur aus einer Ziffer besteht.
JohnR
User
Beiträge: 23
Registriert: Freitag 25. Juni 2010, 19:42

öhm ich habe den skript im Netz gefunden , also der Author hat ihn in ein Forum gestellt als Antwort auf die Frage wie lese ich meine IP aus.

Meine Kenntnisse in Python sind noch recht dürftig, ich habe erst seit ca. 1 Woche überhaupt damit zu tun.

Was sollte ich denn außer \d{2,3}? verwenden damit es nicht zu Fehlern kommt wenn ein Teil der IP-Adresse nur aus einer Ziffer besteht ?

Danke für die bisherigen Antworten.
BlackJack

@JohnR: Die Syntax von regulären Ausdrücken wird in der Dokumentation beschrieben: Regular Expression Syntax.
JohnR
User
Beiträge: 23
Registriert: Freitag 25. Juni 2010, 19:42

o.k.

wenn ich das richtig anwende sollte es ja jetzt so aussehen

Code: Alles auswählen

site = urllib.urlopen("http://checkip.dyndns.org").read()
grab = re.findall('\d{1,2,3}.\d{1,2,3}.\d{1,2,3}.\d{1,2,3}',site)
address = grab[0]
aber ich bekomme immer noch den Fehler

Code: Alles auswählen


C:\Python25\test>ip.py
Traceback (most recent call last):
File "C:\Python25\test\ip.py", line 9, in <module>
address = grab[0]
IndexError: list index out of range
wenn ich allerdings

Code: Alles auswählen

grab = re.findall('\d{2,3}.\d{2,3}.\d{2,3}.\d{2,3}',site)

belasse bekomme ich die IP

Was mache ich denn da jetzt falsch?
karolus
User
Beiträge: 141
Registriert: Samstag 22. August 2009, 22:34

Hallo
In welcher Doku hast du '\d{1,2,3}' gefunden ?

Code: Alles auswählen

grab = re.findall('\d{1,3}.\d{1,3}.\d{1,3}.\d{1,3}',site)
Gruß Karo
JohnR
User
Beiträge: 23
Registriert: Freitag 25. Juni 2010, 19:42

öhm hm da mangelte es mir offensichtlich an Verständnis

Danke.
schwedenmann
User
Beiträge: 42
Registriert: Sonntag 21. Oktober 2007, 13:38
Wohnort: Wegberg

Hallo

Hier mein zusammengefrickeltes Script um die eigene IP zu ermitteln und in ein log zuschreiben.
Alles für Linux

Code: Alles auswählen

#!/usr/bin/python
# -*- coding: utf-8 -*-
import os
import sys
import subprocess
import string
import urllib2
import re
import logging
import time
# log my IP (lmIP)
#Version 0.2
# Copyright schwedenmann, 2009
# License, GPL3
# looking if pppd is running or not
befehl = "ps -e | grep pppd"
print befehl
process = subprocess.Popen(befehl , shell=True, stdout=subprocess.PIPE)
f = process.stdout.read()
print f
print len(f)
# get ip from  checkip if ppd is running, otherwise see line 51
if len(f) >= 4:
    html = urllib2.urlopen('http://checkip.dyndns.org').read() 
#    print html
    ip = re.search(r'[0-9\.]+',html).group(0) 
    print "IP ist "+ ip 
#
#
#logging ip to testlog3.log in working directory
    logger = logging.getLogger(ip)
    logger.setLevel(logging.INFO)
# create file handler which logs even debug messages
    fh = logging.FileHandler("testlog3.log")
    fh.setLevel(logging.INFO)
# create console handler with a higher log level
    ch = logging.StreamHandler()
    ch.setLevel(logging.INFO)
# create formatter and add it to the handlers
    formatter = logging.Formatter("%(asctime)s - %(name)s - %(message)s")
    ch.setFormatter(formatter)
    fh.setFormatter(formatter)
# add the handlers to logger
    logger.addHandler(ch)
    logger.addHandler(fh)

# "application" code
#logger.debug("debug message")
    logger.info("aktuelle IP")
#logger.warn("warn message")
else :
    print "kein Internet"
mfg
schwedenmann
mfg
schwedenmann
JohnR
User
Beiträge: 23
Registriert: Freitag 25. Juni 2010, 19:42

Danke :D
BlackJack

@schwedenmann: In der Tat zusammengefrickelt. Und ziemlich unübersichtlich. Und es behauptet ich hätte kein Internet. Interessant, dass ich trotzdem diesen Beitrag hier erstellen kann. ;-)
Benutzeravatar
HerrHagen
User
Beiträge: 430
Registriert: Freitag 6. Juni 2008, 19:07

Hier mal eine etwas einfachere Variante, die nicht nur unter Linux läuft und unter GPL steht :wink:

Code: Alles auswählen

import re
import urllib

# retrieve data from url
url = urllib.urlopen("http://checkip.dyndns.org/")
data = url.read()
url.close()

#extract url
ip = re.findall(r"Current IP Address:(.*?)</", data)[0].strip()

# write in file
f = open("test.log", "a")
f.write(ip + "\n")
f.close()
Dav1d
User
Beiträge: 1437
Registriert: Donnerstag 30. Juli 2009, 12:03
Kontaktdaten:

Ich hab auch noch was, aber nicht in py:

Code: Alles auswählen

#!/bin/bash

wget http://checkip.dyndns.org/ -q -O- - |
grep -Eo '\<[[:digit:]]{1,3}(\.[[:digit:]]{1,3}){3}\>'
Edit: der SyntaxHighlighter für bash ist im ars**

Code: Alles auswählen

#!/bin/bash

wget http://checkip.dyndns.org/ -q -O- - |
grep -Eo '\<[[:digit:]]{1,3}(\.[[:digit:]]{1,3}){3}\>'
the more they change the more they stay the same
schwedenmann
User
Beiträge: 42
Registriert: Sonntag 21. Oktober 2007, 13:38
Wohnort: Wegberg

Hallo
Und es behauptet ich hätte kein Internet. Interessant, dass ich trotzdem diesen Beitrag hier erstellen kann.
Ist schon klar, du sitzt wahrscheinlich hinter einem Router !

Das Ganze war nur ne Übung, in einem Forum kamm mal ne Frage, wie man die eigene IP (wohl aus Angst, wenn man keinen beweis für die IP xy, zum zeitpunkt z hat).
dareauf hab ich für diese Code "gefrickelt", ich konnte mit so auch die Syntax für eine logdatei mit dem modul logging erarbeiten.
Deshalb auch die Abfrage ob Internet oder nicht per pppd (geht natürlich auch anders, wenn eben die URl-Abfrage kein Ergebnis bringt). macht auch Sinn, wenn man nachweisen kann, das man zum Zeitpunkt x kein Internet gehabt hat, also keinen Eintrag zum zeitpunkt X im log.
Das Script müßte man nat. als cron laufen lassen, bzw. daraus einen daemon machen, um lückenlos zu loggen.

P.S.
Wie macht man aus einem Progarmm, Scrip einen daemon (afaik heißt das daemon-Prozeß) , anstatt es als cron-job laufen zu lassen.
mfg
schwedenmann
Dav1d
User
Beiträge: 1437
Registriert: Donnerstag 30. Juli 2009, 12:03
Kontaktdaten:

@schwedenmann: Ich sitze auch hinter nem Router und habe ne IP sowie Internt. Um aus nem Py-Skript nen daemon zu machen: http://pypi.python.org/pypi/python-daemon/, oder hier hat lunar noch was geschrieben.
the more they change the more they stay the same
Antworten