Реализация 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

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


person unholysampler    schedule 15.12.2009    source источник


Ответы (3)


Будет ли это работать, если вы просто используете 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, потому что, возможно, ваше устройство ждет, когда вы скажете, что закончили отправку данных. (Это было бы немного странно, но это возможно.)

person Jason Orendorff    schedule 15.12.2009
comment
Добавление строки выключения в мой исходный код заставило его работать, и я позаимствую ваш код, чтобы сократить свой код. - person unholysampler; 15.12.2009
comment
У меня проблема, когда мой Mac OS не отправляет пакеты, пока я не отключу соединение. Есть ли какие-нибудь обходные пути, потому что соединение, которое у меня есть, не может быть установлено снова. - person Bob Ebert; 07.03.2016
comment
Боб, вам следует подумать о том, чтобы нажать «Задать вопрос» и задать этот вопрос, если вы еще этого не сделали. - person Jason Orendorff; 12.03.2016
comment
content здесь закодированная строка? Если у меня есть файл .csv, содержащий несколько столбцов, и мне нужно отправить записи, как я могу использовать эту функцию netcat()? - person Cherry Wu; 17.12.2019

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

Его можно использовать для отправки «контента» на «хост» через «порт» (все это можно ввести как sting).

С уважением

person d0n    schedule 04.01.2015
comment
Я обнаружил, что здесь тоже нужно добавить time.sleep(0.5) перед shutdown. - person tripleee; 29.01.2016

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

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

person Autoplectic    schedule 15.12.2009
comment
Я ничего не привязан на самом деле. Мне просто нужен простой интерфейс, чтобы я мог отправить несколько символов и получить ответ от устройства. Я проверю ссылки, которые вы мне дали. - person unholysampler; 15.12.2009