2009-12-15 16 views
23

Ho trovato this e lo sto usando come base, ma non funzionava correttamente. Il mio obiettivo è anche quello di trattarlo come un pacchetto anziché come un'utilità della riga di comando, quindi le mie modifiche al codice lo rifletteranno.Implementazione Netcat in Python

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 

Quando mando un comando di base al dispositivo, esso restituisce i seguenti.

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

mio codice legge la prima linea, ma poi ho un errore che dice che la connessione è temporaneamente non disponibile e non ottiene la seconda linea. Se lo cambio al blocco, blocca e non ritorna mai. qualche idea?

risposta

40

Funziona se si utilizza solo nc?

Credo che si dovrebbe provare qualcosa di un po 'più semplice:

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

ho aggiunto la chiamata shutdown perché magari il dispositivo è in attesa per voi per dire che hai finito l'invio dei dati. (Che sarebbe un po 'strano, ma è possibile.)

+2

Aggiungendo la linea di spegnimento al mio codice originale ha funzionato e prendo in prestito dal codice per ridurre il mio codice. – unholysampler

+0

Ho il problema dove il mio mac os non invia pacchetti fino a quando non chiudo la connessione. C'è un modo per aggirare perché la connessione che ho non può essere fatta di nuovo. –

+0

Bob, dovresti considerare di fare clic su Fai una domanda e chiedendo questa, se non l'hai già fatto. –

3

se non ti dispiace rottamare del tutto quel codice, ti potrebbe piacere di dare un'occhiata a scapy - è fondamentalmente il coltellino svizzero di strumenti a pacchetto in python. dai uno sguardo allo interactive tutorial per vedere se soddisfa le tue esigenze.

se desideri qualcosa di livello superiore rispetto ai pacchetti twisted è la libreria di go-to per il networking in python ... purtroppo la curva di apprendimento è un po 'ripida.

+1

Non sono legato niente in realtà. Ho solo bisogno di una semplice interfaccia per farmi inviare alcuni caratteri e ricevere la risposta dal dispositivo. Controllerò i link che mi hai dato. – unholysampler

7

La seguente è un'implementazione a lavorare su 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() 

Può essere utilizzato per inviare "contenuti" ad un "host", a "Porta "(che potrebbe essere inserito come pungiglione).

Saluti

+0

Ho trovato che avevo bisogno di aggiungere un 'time.sleep (0.5)' prima di 'shutdown' anche qui. – tripleee