2009-12-15 23 views
23

Ich fand this und benutze es als meine Basis, aber es funktionierte nicht direkt aus der Box. Mein Ziel ist es auch, es als ein Paket statt eines Befehlszeilendienstprogramms zu behandeln, so dass meine Codeänderungen das widerspiegeln.Netcat-Implementierung 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 

Wenn ich einen Basisbefehl an mein Gerät sende, gibt es Folgendes zurück.

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

Mein Code liest die erste Zeile, aber dann bekomme ich eine Fehlermeldung, dass die Verbindung vorübergehend nicht verfügbar ist und es nicht die zweite Linie bekommen. Wenn ich es zum Blockieren ändere, blockiert es einfach und kehrt nie zurück. Irgendwelche Gedanken?

Antwort

40

Funktioniert es, wenn Sie nur nc verwenden?

Ich glaube, Sie etwas ein wenig einfacher versuchen sollte:

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

ich den shutdown Anruf hinzugefügt, weil vielleicht das Gerät wartet auf Sie Sie sagen, sind das Senden von Daten getan. (Das wäre ein bisschen komisch, aber es ist möglich.)

+2

Das Hinzufügen der Abschaltlinie zu meinem ursprünglichen Code hat es funktioniert und ich werde von Ihrem Code ausleihen, um meinen Code zu verkleinern. – unholysampler

+0

Ich habe das Problem, wo mein Mac OS Pakete nicht sendet, bis ich die Verbindung herunterfahre. Gibt es irgendwelche Möglichkeiten, weil die Verbindung, die ich habe, nicht wieder hergestellt werden kann. –

+0

Bob, du solltest in Erwägung ziehen, Frage zu stellen und diese Frage zu stellen, falls du es noch nicht getan hast. –

3

Wenn es Ihnen nichts ausmacht, diesen Code komplett zu verwerfen, können Sie sich gerne scapy ansehen - es ist im Grunde das Schweizer Taschenmesser der Paket-Tools in Python. Werfen Sie einen Blick auf die interactive tutorial, um zu sehen, ob es Ihren Bedürfnissen entspricht.

Wenn Sie etwas höher als Pakete wollen twisted ist die Go-to-Bibliothek für die Vernetzung in Python ... leider ist die Lernkurve ein bisschen steil.

+1

Ich bin nicht wirklich etwas gebunden. Ich brauche nur eine einfache Schnittstelle, damit ich ein paar Zeichen senden und die Antwort vom Gerät empfangen kann. Ich überprüfe die Links, die du mir gegeben hast. – unholysampler

7

Das Folgende ist eine funktionierende Implementierung auf 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() 

kann es verwendet werden, senden „Inhalt“ zu einem „Host“ auf „Port "(die alle als Stachel eingegeben werden könnten).

Grüße

+0

Ich fand, dass ich hier auch eine 'time.sleep (0.5)' vor 'shutdown' hinzufügen musste. – tripleee