@JohannesGolf: Den Namen gibt Ping ja aus, aber für MAC und insbesondere Betriebssystem ist das normale Ping nicht gedacht. Das Betriebssystem kann man auch nur raten anhand von bestimmten Mustern in der Kommunikation. ``nmap`` macht so etwas zum Beispiel. Damit bekommt man auch die MAC-Adresse. Dazu braucht der Prozess allerdings die nötigen Rechte um ”rohe Sockets” zu öffnen und selber IP-Pakete zusammen zu basteln. Beispielaufruf:
Wenn man die Daten in einem Programm weiterverarbeiten will, sollte man ``nmap`` aber besser sagen, dass ein strukturierteres Format für die Ausgabe verwendet werden soll. XML zum Beispiel. Da kann man dann mit der entsprechenden Bibliothek (`xml.etree.ElementTree` oder `lxml.etree`) relativ einfach auf die einzelnen Informationen zugreifen.
Oder man installiert sich das `nmap`-Modul. Das erledigt den Aufruf und parst das Ergebnis in eine verschachtelte Wörterbuch- und Listen-Datenstruktur:
Code: Alles auswählen
In [4]: ps.scan('10.0.0.22', arguments='-F -O --osscan-guess')
Out[4]:
{'nmap': {'command_line': u'nmap -oX - -F -O --osscan-guess 10.0.0.22',
'scaninfo': {u'tcp': {'method': u'syn',
'services': u'7,9,13,21-23,25-26,37,53,79-81,88,106,110-111,113,119,135,139,143-144,179,199,389,427,443-445,465,513-515,543-544,548,554,587,631,646,873,990,993,995,1025-1029,1110,1433,1720,1723,1755,1900,2000-2001,2049,2121,2717,3000,3128,3306,3389,3986,4899,5000,5009,5051,5060,5101,5190,5357,5432,5631,5666,5800,5900,6000-6001,6646,7070,8000,8008-8009,8080-8081,8443,8888,9100,9999-10000,32768,49152-49157'}},
'scanstats': {'downhosts': u'0',
'elapsed': u'11.78',
'timestr': u'Fri May 9 12:24:15 2014',
'totalhosts': u'1',
'uphosts': u'1'}},
'scan': {u'10.0.0.22': {'fingerprint': u'OS:SCAN(V=5.21%D=5/9%OT=21%CT=7%CU=37913%PV=Y%DS=1%DC=D%G=Y%M=801F02%TM=536\nOS:CACCF%P=i686-pc-linux-gnu)SEQ(SP=106%GCD=1%ISR=10D%TI=Z%CI=I%II=I%TS=7)O\nOS:PS(O1=M5B4ST11NW6%O2=M5B4ST11NW6%O3=M5B4NNT11NW6%O4=M5B4ST11NW6%O5=M5B4S\nOS:T11NW6%O6=M5B4ST11)WIN(W1=3890%W2=3890%W3=3890%W4=3890%W5=3890%W6=3890)E\nOS:CN(R=Y%DF=Y%T=40%W=3908%O=M5B4NNSNW6%CC=Y%Q=)T1(R=Y%DF=Y%T=40%S=O%A=S+%F\nOS:=AS%RD=0%Q=)T2(R=N)T3(R=N)T4(R=Y%DF=Y%T=40%W=0%S=A%A=Z%F=R%O=%RD=0%Q=)T5\nOS:(R=Y%DF=Y%T=40%W=0%S=Z%A=S+%F=AR%O=%RD=0%Q=)T6(R=Y%DF=Y%T=40%W=0%S=A%A=Z\nOS:%F=R%O=%RD=0%Q=)T7(R=Y%DF=Y%T=40%W=0%S=Z%A=S+%F=AR%O=%RD=0%Q=)U1(R=Y%DF=\nOS:N%T=40%IPL=164%UN=0%RIPL=G%RID=G%RIPCK=G%RUCK=G%RUD=G)IE(R=Y%DFI=N%T=40%\nOS:CD=S)\n',
'hostname': u'xbmc-6ce5.local',
'osclass': [{'accuracy': u'92',
'osfamily': u'Linux',
'osgen': u'2.6.X',
'type': u'general purpose',
'vendor': u'Linux'},
{'accuracy': '',
'osfamily': u'2-Series',
'osgen': '',
'type': u'specialized',
'vendor': u'Crestron'},
{'accuracy': '',
'osfamily': u'embedded',
'osgen': '',
'type': u'firewall',
'vendor': u'Check Point'},
{'accuracy': u'90',
'osfamily': u'Linux',
'osgen': u'2.4.X',
'type': u'firewall',
'vendor': u'Check Point'},
{'accuracy': u'89',
'osfamily': u'Linux',
'osgen': u'2.6.X',
'type': u'webcam',
'vendor': u'AXIS'},
{'accuracy': u'89',
'osfamily': u'Linux',
'osgen': u'2.4.X',
'type': u'WAP',
'vendor': u'Linux'},
{'accuracy': '',
'osfamily': u'embedded',
'osgen': '',
'type': u'WAP',
'vendor': u'Linksys'},
{'accuracy': '',
'osfamily': u'embedded',
'osgen': '',
'type': u'printer',
'vendor': u'Xerox'},
{'accuracy': u'88',
'osfamily': u'Linux',
'osgen': u'2.4.X',
'type': u'general purpose',
'vendor': u'Linux'},
{'accuracy': '',
'osfamily': u'embedded',
'osgen': '',
'type': u'WAP',
'vendor': u'D-Link'},
{'accuracy': '',
'osfamily': u'embedded',
'osgen': '',
'type': u'router',
'vendor': u'Peplink'},
{'accuracy': '',
'osfamily': u'embedded',
'osgen': '',
'type': u'storage-misc',
'vendor': u'ZyXEL'},
{'accuracy': u'87',
'osfamily': u'Linux',
'osgen': u'2.6.X',
'type': u'WAP',
'vendor': u'Linux'},
{'accuracy': '',
'osfamily': u'embedded',
'osgen': '',
'type': u'switch',
'vendor': u'Aruba'},
{'accuracy': '',
'osfamily': u'embedded',
'osgen': '',
'type': u'webcam',
'vendor': u'AXIS'},
{'accuracy': '',
'osfamily': u'embedded',
'osgen': '',
'type': u'PBX',
'vendor': u'Vodavi'},
{'accuracy': '',
'osfamily': u'embedded',
'osgen': '',
'type': u'printer',
'vendor': u'Lexmark'}],
'osmatch': [{'accuracy': u'92', 'line': u'22327', 'name': u'Linux 2.6.22'},
{'accuracy': u'91',
'line': u'8120',
'name': u'Crestron XPanel control system'},
{'accuracy': u'91', 'line': u'21851', 'name': u'Linux 2.6.19 - 2.6.31'},
{'accuracy': u'90', 'line': u'23329', 'name': u'Linux 2.6.24'},
{'accuracy': u'90',
'line': u'5722',
'name': u'Check Point SBox-200 firewall'},
{'accuracy': u'90',
'line': u'5811',
'name': u'Check Point VPN-1 UTM appliance'},
{'accuracy': u'90', 'line': u'25360', 'name': u'Linux 2.6.9 - 2.6.30'},
{'accuracy': u'89',
'line': u'4042',
'name': u'AXIS 211A Network Camera (Linux 2.6)'},
{'accuracy': u'89',
'line': u'4059',
'name': u'AXIS 211A Network Camera (Linux 2.6.20)'},
{'accuracy': u'89',
'line': u'19715',
'name': u'DD-WRT v23 - v24 (Linux 2.4.20 - 2.4.37)'}],
'status': {'reason': u'arp-response', 'state': u'up'},
u'tcp': {21: {'name': u'ftp', 'reason': u'syn-ack', 'state': u'open'},
22: {'name': u'ssh', 'reason': u'syn-ack', 'state': u'open'},
80: {'name': u'http', 'reason': u'syn-ack', 'state': u'open'},
111: {'name': u'rpcbind', 'reason': u'syn-ack', 'state': u'open'},
139: {'name': u'netbios-ssn', 'reason': u'syn-ack', 'state': u'open'}}}}}
``nmap`` kann auch mehrere Hosts nacheinander prüfen. Es gibt verschiedene Möglichkeiten mehr als einen Host anzugeben.