Реализация Netcat в Python - PullRequest
       40

Реализация Netcat в Python

28 голосов
/ 15 декабря 2009

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

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

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

Ответы [ 3 ]

47 голосов
/ 15 декабря 2009

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

11 голосов
/ 04 января 2015

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

Привет

4 голосов
/ 15 декабря 2009

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

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

...