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.