簡體   English   中英

Python 中的 Netcat 實現

[英]Netcat implementation in 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

我的代碼讀取了第一行,但隨后我收到一條錯誤消息,指出連接暫時不可用,並且沒有收到第二行。 如果我將其更改為阻塞,它只會阻塞並且永遠不會返回。 有什么想法嗎?

如果你只使用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調用,因為也許您的設備正在等待您說您已完成發送數據。 (這有點奇怪,但這是可能的。)

以下是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()

它可用於將“內容”發送到“端口”上的“主機”(所有這些都可能作為刺痛輸入)。

問候

如果您不介意完全廢棄該代碼,您可能想看看scapy——它基本上是 Python 中數據包工具的瑞士軍刀。 查看交互式教程,看看它是否符合您的需求。

如果您想一些更高級別比包扭曲是去到圖書館在網絡蟒...不幸的是,學習曲線是一點點陡峭。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM