2009-12-15 3 views
23

Я нашел this и использую его как базу, но он не работал прямо из коробки. Моя цель - также рассматривать это как пакет вместо утилиты командной строки, поэтому мои изменения кода отражают это.Внедрение Netcat в 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 

Когда я отправляю основную команду на свое устройство, он возвращает следующее.

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

Мой код читает первую строку, а затем я получаю сообщение об ошибке сказав, что соединение временно недоступно, и он не получает вторую строчку. Если я изменю его на блокировку, он просто блокируется и никогда не возвращается. Есть предположения?

ответ

40

Это работает, если вы просто используете nc?

Я думаю, вы должны попробовать что-то немного проще:

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

Я добавил shutdown вызов, потому что, возможно, устройство ждет вас, чтобы сказать, как вы закончите передачу данных. (Это было бы немного странно, но это возможно.)

+2

Добавление строки выключения к моему исходному коду заставило ее работать, и я займусь из своего кода, чтобы обрезать свой код. – unholysampler

+0

У меня проблема, когда мой mac os не отправляет пакеты до тех пор, пока я не отключу соединение. Есть ли какие-либо способы, потому что соединение, которое у меня не может быть сделано снова. –

+0

Боб, вы должны подумать о том, чтобы нажать «Задать вопрос» и спросить об этом, если вы этого еще не сделали. –

3

Если вы не возражаете отказаться от этого кода в целом, вы можете посмотреть на scapy - это в основном швейцарский армейский нож пакетных инструментов на питоне. посмотрите на interactive tutorial, чтобы узнать, подходит ли оно вашим потребностям.

если вы хотите что-то более высокоуровневое, чем пакеты twisted - это библиотека для общения в питоне ... к сожалению, кривая обучения немного крутая.

+1

Я не привязан к чему-либо действительно. Мне просто нужен простой интерфейс, позволяющий мне отправить несколько символов и получить ответ от устройства. Я проверю ссылки, которые вы мне дали. – unholysampler

7

Ниже рабочая реализация на 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() 

Он может быть использован для отправки «содержание» на «хозяина» на «порт »(которые все могут быть введены как жало).

С уважением

+0

Я нашел, что мне нужно было добавить 'time.sleep (0.5)' перед 'shutdown' здесь. – tripleee

Смежные вопросы