Python中的Netcat实现

问题描述 投票:28回答:3

我找到了this并将其用作我的基础,但是它不能立即使用。我的目标也是将其视为程序包而不是命令行实用程序,因此我的代码更改将反映出来。

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

我的代码读取第一行,但是随后出现错误,指出该连接暂时不可用,并且没有得到第二行。如果我将其更改为阻塞,它将只是阻塞而永不返回。有什么想法吗?

python netcat
3个回答
49
投票

如果仅使用nc,是否可以使用?

我认为您应该尝试一些简单的方法:

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() 通话,因为也许您的设备正在等待您说您已完成数据发送。 (这有点奇怪,但是有可能。)


13
投票

以下是在python3上的有效实现:

shutdown

它可以用于将“内容”发送到“端口”上的“主机”(所有这些都可以作为字符串输入。)

问候


4
投票

[如果您不介意完全废弃该代码,则可能想看看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() -基本上,这是python中打包工具的瑞士军刀。看看scapy是否符合您的需求。

如果您想要比数据包更高级的内容,interactive tutorial是使用python进行联网的必备库...很遗憾,学习过程有些艰辛。

© www.soinside.com 2019 - 2024. All rights reserved.