2009-12-15 10 views
23

Znalazłem this i używam go jako mojej bazy, ale nie działało to od razu po wyjęciu z pudełka. Moim celem jest także potraktowanie go jako pakietu zamiast narzędzia wiersza poleceń, więc moje zmiany w kodzie będą to odzwierciedlać.Implementacja Netcat w Pythonie

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 

Kiedy wysyłam podstawowe polecenie do mojego urządzenia, zwraca następujące dane.

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

Mój kod odczytuje pierwszą linię, ale potem dostaję błąd mówiąc, że połączenie jest tymczasowo niedostępny i nie dostać drugą linię. Jeśli zmienię to na blokowanie, blokuje się i nigdy nie wraca. jakieś pomysły?

Odpowiedz

40

Czy to działa, jeśli po prostu używasz nc?

Myślę, że powinieneś spróbować czegoś prostszego:

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

dodałem wywołanie shutdown bo może urządzenie czeka na ciebie, aby powiedzieć skończysz wysyłanie danych. (To byłoby trochę dziwne, ale jest to możliwe).

+2

Dodanie wiersza wyłączania do mojego oryginalnego kodu sprawiło, że działało, a pożyczę od twojego kodu, aby przyciąć mój kod. – unholysampler

+0

Mam problem, gdzie mój mac os nie wysyła pakietów, dopóki nie zamknę połączenia. Czy są jakieś sposoby, ponieważ nie mogę nawiązać ponownie połączenia. –

+0

Bob, powinieneś rozważyć kliknięcie pytania Zadaj pytanie i zadaj to pytanie, jeśli jeszcze tego nie zrobiłeś. –

3

Jeśli nie masz nic przeciwko złomowaniu tego kodu w całości, możesz spojrzeć na scapy - to w zasadzie szwajcarski nóż armii narzędzi pakietowych w pytonie. spójrz na numer interactive tutorial, aby sprawdzić, czy odpowiada Twoim potrzebom.

Jeśli chcesz coś na wyższym poziomie niż pakiety twisted to biblioteka do nauki dla sieci w Pythonie ... niestety krzywa uczenia się jest troszkę stroma.

+1

Nic nie jestem przywiązany. Potrzebuję tylko prostego interfejsu, aby pozwolić mi wysłać kilka znaków i odebrać odpowiedź z urządzenia. Sprawdzę linki, które mi dałeś. – unholysampler

7

Poniżej znajduje się implementacja działa na 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() 

To może być używany do wysyłania „content” do „host” w „porcie "(które wszystkie mogą być wpisane jako żądło).

Pozdrawiam

+0

Znalazłem, że muszę dodać 'time.sleep (0.5)' przed 'shutdown' tutaj również. – tripleee