web-dev-qa-db-fra.com

Implémentation de Netcat dans Python

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?

28
unholysampler

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.)

48
Jason Orendorff

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

11
d0n

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.

4
Autoplectic