J'ai trouvé this et je l'utilise comme base, mais cela ne fonctionnait pas dès la sortie de la boîte. Mon objectif est également de le traiter comme un package au lieu d'un utilitaire de ligne de commande, donc mes modifications de code refléteront cela.
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
Lorsque j'envoie une commande de base à mon appareil, elle renvoie ce qui suit.
50PMA-019 Connection Open
Atten #1 = 63dB
Mon code lit la première ligne, mais je reçois ensuite une erreur indiquant que la connexion est temporairement indisponible et qu'elle n'obtient pas la deuxième ligne. Si je le change en blocage, il bloque juste et ne revient jamais. Des pensées?
Cela fonctionne-t-il si vous utilisez simplement nc
?
Je pense que vous devriez essayer quelque chose d'un peu plus 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()
J'ai ajouté l'appel shutdown
parce que votre appareil attend peut-être que vous disiez que vous avez fini d'envoyer des données. (Ce serait un peu bizarre, mais c'est possible.)
Ce qui suit est une implémentation fonctionnelle sur 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()
Il peut être utilisé pour envoyer du "contenu" à un "hôte" sur le "port" (qui peut tous être entré comme piqûre).
Cordialement
si cela ne vous dérange pas de supprimer complètement ce code, vous voudrez peut-être regarder scapy - c'est essentiellement le couteau suisse des outils de paquets en python. jetez un œil au tutoriel interactif pour voir si cela correspond à vos besoins.
si vous souhaitez quelque chose de plus haut niveau que les paquets twisted est la bibliothèque de référence pour la mise en réseau en python ... malheureusement, la courbe d'apprentissage est un peu raide.