Seite 1 von 1
IP-Trace mit Python?
Verfasst: Donnerstag 12. August 2004, 20:20
von genrich
Ich hab zwar gesucht, aber nichts passendes gefunden...
Ist ein IP-Trace per Python.cgi möglich? Oder nur unter richtig viel Aufwand?
Da fällt mir gerade ein, man könnte natürlich versuchen online die ApacheLogFiles zu durchsuchen... Aber das wird viel frickelei, schätze ich...
s. Scratchy is an Apache Web Server log parser and HTML report generator written in Python:
http://scratchy.sourceforge.net
Verfasst: Donnerstag 12. August 2004, 23:47
von fs111
Was genau stellst Du Dir denn vor? Die Remote-Adresse bekommst Du ja via cgi. Mit der könntest Du dann ja traceroute starten, und dessen Ausgabe zum Browser umleiten, oder stellst Du Dir etwas ganz anderes vor?
fs111
Verfasst: Freitag 13. August 2004, 07:26
von genrich
Genau das will ich machen, einen Traceroute.
Aber das muß in Python geschehen, denn ich hab leider keine Möglichkeiten Programme auf der Shell zu starten
Verfasst: Freitag 13. August 2004, 08:19
von Milan
Hi. Wesentlich leiter hättest du es dann aber, du müsstest schließlich nur die ausgabe umleiten:
Code: Alles auswählen
import os
ci,co,ce=os.popen3("tracert www.yahoo.de")
ci.close()
e=ce.read()
if not e:
print co.read()
else:
print e
ce.close()
co.close()
So musst du es allerdings schaffen, ICMP Pakete mit einer variablen TTL zu versenden. Ein ICMP Paket wird in seinem TTL Wert von jedem Host um eins verringert und wenn es gleich 0 ist wird es gelöscht. Damit kannst du "messen" (das Grundprinzip von traceroute). Schau dir mal dieses
PDF an, da hab ich was hübsches drin gesehen. Vielleicht bekommst du es damit hin. Ebenfalls interessant wäre vielleicht
pycap.
Verfasst: Freitag 13. August 2004, 09:06
von joerg
Hallo genrich,
schon mal nach 'traceroute.py' gegoogelt? Bei mir klappt's!
Gruß!
Jörg
Verfasst: Freitag 13. August 2004, 09:28
von Milan
Hi ein wenig buggy, wenn die Pakete mal ne andere Strecke nehmen
und der TTL-Wert dadurch anders fällt:
Code: Alles auswählen
>>> traceroute("www.wikipedia.de")
Tracing route to 207.142.131.236 (www.wikipedia.de)
1 2.1 1.8 1.8 192.168.6.1
2 63.5 61.8 62.4 217.5.98.77
3 59.5 59.0 33.1 216.109.118.73 p10.www.dcn.yahoo.com
4 146.4 147.1 147.5 62.154.14.53 nyc-e5.NYC.US.net.DTAG.DE
5 145.6 147.5 146.6 65.59.192.5
6 147.1 147.4 146.6 64.159.1.181 ge-0-3-0.bbr1.NewYork1.Level3.net
7 163.1 15.5 163.3 209.247.11.198 as-0-0.mp2.Tampa1.Level3.net
8 185.0 186.8 187.1 209.247.11.218 ge-9-1.hsa1.Tampa1.Level3.net
9 186.4 187.1 186.4 63.208.0.94 unknown.Level3.net
10 * 100.4 * 216.109.118.73 p10.www.dcn.yahoo.com
11 163.9 * 183.8 216.109.118.73 p10.www.dcn.yahoo.com
12 * 168.8 * 216.109.118.73 p10.www.dcn.yahoo.com
13 165.8 * 169.8 216.109.118.73 p10.www.dcn.yahoo.com
14 * 166.1 * 216.109.118.73 p10.www.dcn.yahoo.com
15 166.2 583.1 395.8 216.109.118.73 p10.www.dcn.yahoo.com
16 633.9 55.5 62.8 217.5.98.77
17 681.0 * 182.1 216.109.118.73 p10.www.dcn.yahoo.com
18 * 170.6 * 216.109.118.73 p10.www.dcn.yahoo.com
19 139.1 12.9 * 216.109.118.73 p10.www.dcn.yahoo.com
20 167.2 181.5 194.9 209.247.11.198 as-0-0.mp2.Tampa1.Level3.net
21 585.8 362.9 181.7 209.247.11.218 ge-9-1.hsa1.Tampa1.Level3.net
22 159.8 256.6 726.3 63.208.0.94 unknown.Level3.net
23 159.3 74.8 100.5 63.208.0.94 unknown.Level3.net
24 * 50.7 * 216.109.118.73 p10.www.dcn.yahoo.com
25 164.0 * 171.6 216.109.118.73 p10.www.dcn.yahoo.com
26 * 170.1 * 216.109.118.73 p10.www.dcn.yahoo.com
27 155.2 * 180.7 216.109.118.73 p10.www.dcn.yahoo.com
28 * 171.8 * 216.109.118.73 p10.www.dcn.yahoo.com
29 168.1 * 180.0 216.109.118.73 p10.www.dcn.yahoo.com
30 * 165.4 * 216.109.118.73 p10.www.dcn.yahoo.com
Ich würde das unbedingt umbauen, sodass gespeichert wird, wo das Paket schon war. Außerdem würde ich die Ausgabe rausnehmen und extra machen, ein Iterator über die Routenabschnitte wäre nicht schlecht. Ich mach mich nachher mal ans werkeln...
Verfasst: Freitag 13. August 2004, 12:26
von genrich
joerg hat geschrieben:
schon mal nach 'traceroute.py' gegoogelt? Bei mir klappt's!
Verdammt ich hab immer nach "Python traceroute" u.ä. gesucht...
Thx...
Doch es funktioniert auf dem Server nicht, Traceback:
Code: Alles auswählen
s2 = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_ICMP)
socket.error: (1, 'Operation not permitted')
Kann ich davon ausgehen, das es gesperrt wurde, oder das tryceroute.py nicht richtig funktioniert?
Etwas stutzig machen mich die Zeile mit "if sys.platform in ['win32']:"
Code: Alles auswählen
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDP)
if sys.platform in ["win32"]:
s.setsockopt(socket.SOL_SOCKET, socket.SO_RCVTIMEO, 300)
s.setsockopt(socket.SOL_IP, socket.IP_TTL, ttl)
s2 = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_ICMP)
s2.bind(('',qport))
if sys.platform in ["win32"]:
s2.setsockopt(socket.SOL_SOCKET, socket.SO_RCVTIMEO, 300)
(Vollständige Listing unter
http://mail.python.org/pipermail/python ... 54753.html )
In einer Antwort (
http://mail.python.org/pipermail/python ... 54755.html ) steht das man bei Linux Root rechte benötigt um einen solchen socket zu öffnen.... Scheiße...
Verfasst: Freitag 13. August 2004, 12:38
von genrich
Ha!
Was ich suchte hab ich durch das Skript doch herrausgefunden... Und es ist wieder so einfach
Code: Alles auswählen
import os,socket
REMOTE_ADDR =os.environ["REMOTE_ADDR"]
print REMOTE_ADDR," - ",socket.gethostbyaddr(REMOTE_ADDR)
Das war die Information die ich eigentlich haben wollte und das klappt auch auf dem Server!
Verfasst: Freitag 13. August 2004, 12:52
von Milan
Um den Domainnamen rauszubekommen würde ich lieber socket.getfqdn nehmen, das ist besser... Versuch mal folgende IP auflösen zu lassen "217.5.98.77"
Aber ansonsten frag mal besser beim nächsten mal direkt, auch wenn man hier über traceroute einiges mehr lernt.
Verfasst: Freitag 13. August 2004, 13:42
von genrich
Hm!
Mit socket.getfqdn() erhalte ich die IP-Adresse zurück und mit socket.gethostbyaddr() erhalte ich ein "socket.herror: (11004, 'host not found')"
Liefert getfqdn() automatich einfach die IP-Adresse zurück, statt eines Fehlers? Also im Prinzip das selbe, wenn man den Fehler bei gethostbyaddr() abfangen würde? Oder steckt da mehr hinter?
Und vorallem, warum ist das bei dieser IP-Adresse?
Verfasst: Freitag 13. August 2004, 15:20
von Milan
Hi. Die Docu dazu sollte eigentlich alles sagen:
getfqdn([name])
Return a fully qualified domain name for name. If name is omitted or empty, it is interpreted as the local host. To find the fully qualified name, the hostname returned by gethostbyaddr() is checked, then aliases for the host, if available. The first name which includes a period is selected. In case no fully qualified domain name is available, the hostname is returned. New in version 2.0.
Versucht einen Hostnamen zu name (als name oder Adresse) zu finden und gibt bei Misserfolg name selbst zurück. Es gibt IP-Adressen, die haben keinen Domainnamen, den man per DNS erfragen könnte. So zum Beispiel mein Router (intern) oder der obige Server von T-Online. Das heißt aber nicht, dass es solche Adressen nicht gibt, sonst könnte ich z.B. nicht im Internet surfen. gethostbyaddr geht aber davon aus, dass es einen Domainname gibt und gibt deswegen eine Fehler, wenn das nicht der Fall ist. Schau dir dazu ruhig den Quellcode von getfqdn an
.