2010/2/23 Boris Perez Canedo <inf200...@ucf.edu.cu>: >> El 23 de febrero de 2010 17:38, Boris Perez Canedo >> <inf200...@ucf.edu.cu> escribió: >> >>> Hace pocos dias escribi sobre la instalacion de scapy en Windows. En ese >>> momento >>> trataba de instalar scapy usando python2.6. Me daba un error de sintaxis >>> con la >>> palabra "with" que es reservada para python2.6 en adelante y que >>> aparentemente scapy >>> usa como variable. Hice algo que no se si esta del todo bien, borre la >>> variable with >>> que se pasaba como argumento en dos funciones de la siquiente manera: >>> >>> tr = map(lambda x: Gnuplot.Data(x,"lines"), trt.values())# with = "lines" >>> >>> world = Gnuplot.File(conf.gnuplot_world,"lines")# with = "lines" >>> >>> donde ahora esta "lines" antes estuvo with = "lines" pero esto en >>> python2.6 da el >>> error ya mencionado. >> >> Es posible que el truco funcione. >> >> Hacerte notar que el fallo está en Gnuplot, más que en scapy. Aunque >> el proyecto python-gnuplot hace tiempo que no se actualiza, >> distribuciones como ubuntu han sustituído en gnuplot 'with' por >> 'with_' (con subrayado), cambiando la API que usan otros paquetes como >> scapy: >> >> <http://trac.secdev.org/scapy/changeset/852:055a9be0f2d3> >> >> >>> Todo parecia funcionar bien hasta que corro este script y me da el >>> siguiente error que >>> me parece no tiene nada que ver con lo que hice ya que el paquete para >>> graficos no lo >>> instale pq no lo necesitaba. >>> >>> Obtener todos los ip usados en una subred. >>> mi subnet mask es 255.255.252.0 >>> mi direccion ip 10.14.19.12 >>> por si me equivoque al determinar la direccion de red.(10.14.16.0/22) >>> >>> from scapy import * >>> >>> ans,unans=srp(Ether(dst="ff:ff:ff:ff:ff:ff")/ARP(pdst="10.14.16.0/22"),timeout=2) >>> ans.summary(lambda (s,r): r.sprintf("%Ether.src% %ARP.psrc%") ) >>> >>> El error: >>> >>> Begin emission: >>> Finished to send 1024 packets.(aqui todo parece bien) >>> >>> Traceback (most recent call last): >>> File "D:\Trabajo\scripts\arping.py", line 2, in <module> >>> >>> ans,unans=srp(Ether(dst="ff:ff:ff:ff:ff:ff")/ARP(pdst="10.14.16.0/22"),timeout=2) >>> File "C:\Python26\lib\site-packages\scapy.py", line 11295, in srp >>> a,b,c=sndrcv(s ,x,*args,**kargs) >>> File "C:\Python26\lib\site-packages\scapy.py", line 11113, in sndrcv >>> os.write(1, ".") >>> OSError: [Errno 9] Bad file descriptor >> > Hola y disculpen haber tenido que escribir tanto sobre mi problema. > > > Acabo de correr el script en Windows y funciona, lo que sucedia era que > antes lo corri desde el IDLE de python2.6 y por eso daba el error, pero > cuando lei tu comentario > >> Da error al intentar escribir en el fichero con id=1, probablemente >> stdout/stdin en sistemas linux. >> > > se me ocurrio correrlo desde la consola. Voy a ver si en Ubuntu obtengo el > mismo resultado. > > Muchas gracias. > > Otra cosa, estoy utilizando el scapy para obtener entre otras cosas los ips > utilizados en una subred dada. > > Mientras me rompia la cabeza pensando que era lo que salia mal con > scapy, pense en hacer algo como esto: > > import os,re > from multiprocessing import Process, Lock > > def ping(lck, host): > options = '-n 1 -w 2 ' > f = os.popen('ping ' + options + host) > data = f.read() > match = re.search(r"\b(?:\d{1,3}\.){3}\d{1,3}\b(?=.+TTL)", data) # > machea una direccion ip utilizada > if match: > ip = match.group() > lck.acquire() > print ip > lck.release() > > > if __name__ == '__main__': > lock = Lock() > > for host in ['10.14.16.5','10.14.19.12']: > Process(target=ping, args=(lock, host)).start() > > Que parece funcionar bien. Pero aqui el problema es como a partir de una > direccion de red (10.14.16.0/22) generar una lista de ip similar a la que > utilizo arriba (pero con todos). > > Saludos. > Boris > > > > ________________________________ > > La mejor vacuna contra el virus A(H1N1) es la higiene personal > > _______________________________________________ > Python-es mailing list > Python-es@python.org > http://mail.python.org/mailman/listinfo/python-es > FAQ: http://python-es-faq.wikidot.com/ > >
También puedes usar scapy para eso. En el propio manual de scapy tienes un ejemplo [1] >>> net = IP(dst="10.14.16.0/22") >>> [pkt for pkt in net] [<IP dst=10.14.16.0 |>, <IP dst=10.14.17.0 |>, <IP dst=10.14.18.0 |>, <IP dst=10.14.19.0 |>, <IP dst=10.14.16.1 |>, <IP dst=10.14.17.1 |>, <IP dst=10.14.18.1 |>, <IP dst=10.14.19.1 |>, <IP dst=10.14.16.2 |>, <IP dst=10.14.17.2 |>, <IP dst=10.14.18.2 |>, <IP dst=10.14.19.2 |>,... Intenta hacer funcionar scapy porque él ya implementa todo lo que puedas necesitar. Esto sería más o menos lo que buscas. Lista las IP de los host que respondan a "ping". ans, unans = sr(IP(dst="10.14.18.0/22")/ICMP(), timeout=10) for pkt in ans: print pkt[0].dst Saludos [1] http://www.secdev.org/projects/scapy/doc/usage.html _______________________________________________ Python-es mailing list Python-es@python.org http://mail.python.org/mailman/listinfo/python-es FAQ: http://python-es-faq.wikidot.com/