python netcat

Implementación de Netcat en Python



(3)

Encontré this y lo estoy usando como mi base, pero no estaba funcionando de inmediato. Mi objetivo también es tratarlo como un paquete en lugar de una utilidad de línea de comandos, por lo que los cambios en mi código reflejarán eso.

class Netcat: def __init__(self, hostname, port): self.hostname = hostname self.port = port def send(self, content): self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) self.socket.connect((self.hostname, self.port)) self.socket.setblocking(0) result = ''''; read_ready, write_ready, in_error = select.select([self.socket], [], [self.socket], 5) if(self.socket.sendall(content) != None): return while(1): buffer = '''' try: buffer = self.socket.recv(128) while(buffer != ''''): result += buffer try: buffer = self.socket.recv(128) except socket.error as err: print (err, type(err)) buffer = '''' if(buffer == ''''): break except socket.error as err: print (err, type(err)) if(buffer == ''''): break return result

Cuando envío un comando básico a mi dispositivo, devuelve lo siguiente.

50PMA-019 Connection Open Atten #1 = 63dB

Mi código lee la primera línea, pero luego aparece un error que dice que la conexión no está disponible temporalmente y que no recibe la segunda línea. Si lo cambio al bloqueo, solo se bloquea y nunca vuelve. ¿Alguna idea?


¿Funciona si solo usas nc ?

Creo que deberías intentar algo un poco más simple:

import socket def netcat(hostname, port, content): s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.connect((hostname, port)) s.sendall(content) s.shutdown(socket.SHUT_WR) while 1: data = s.recv(1024) if data == "": break print "Received:", repr(data) print "Connection closed." s.close()

shutdown llamada de shutdown porque tal vez su dispositivo está esperando que diga que ha terminado de enviar datos. (Eso sería un poco raro, pero es posible).


La siguiente es una implementación de trabajo en python3:

import socket def netcat(host, port, content): s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.connect((host, int(port))) s.sendall(content.encode()) s.shutdown(socket.SHUT_WR) while True: data = s.recv(4096) if not data: break print(repr(data)) s.close()

Se puede usar para enviar "contenido" a un "host" en "puerto" (en el que todos pueden ingresarse como sting).

Saludos


Si no te importa descartar ese código por completo, te gustaría mirar scapy : es básicamente la navaja suiza de paquetes de herramientas en Python. Eche un vistazo al tutorial interactivo para ver si se ajusta a sus necesidades.

si desea algo más alto que paquetes twisted es la biblioteca de acceso a la red en Python ... desafortunadamente, la curva de aprendizaje es un poco empinada.