Подтвердить что ты не робот

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

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

4b9b3361

Ответ 1

Это работает, если вы просто используете 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

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

Его можно использовать для отправки "контента" на "хост" на "порт" (который все может быть введен как жало).

Привет

Ответ 3

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

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