Python中的Netcat实现

unh*_*ler 28 python netcat

我发现了这个并且正在使用它作为我的基础,但它没有开箱即用.我的目标也是将其视为包而不是命令行实用程序,因此我的代码更改将反映出来.

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
Run Code Online (Sandbox Code Playgroud)

当我向设备发送基本命令时,它返回以下内容.

50PMA-019 Connection Open
Atten #1 = 63dB
Run Code Online (Sandbox Code Playgroud)

我的代码读取第一行,但后来我得到一个错误,说连接暂时不可用,并且它没有获得第二行.如果我将其更改为阻止,它只会阻塞而永远不会返回.有什么想法吗?

Jas*_*rff 48

如果你只是使用它是否有效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()
Run Code Online (Sandbox Code Playgroud)

我添加了shutdown通话,因为您的设备可能正在等待您说您已完成发送数据.(这可能有点奇怪,但它有可能.)

  • 将关闭行添加到我的原始代码使它工作,我将借用你的代码来减少我的代码. (2认同)

小智 11

以下是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()
Run Code Online (Sandbox Code Playgroud)

它可用于将"内容"发送到"端口"上的"主机"(所有这些都可以作为sting输入).

问候

  • 我发现我也需要在此处的“关闭”之前添加一个“time.sleep(0.5)”。 (4认同)

Aut*_*tic 5

如果您不介意完全废弃该代码,您可能想看看scapy——它基本上是 Python 中数据包工具的瑞士军刀。查看交互式教程,看看它是否符合您的需求。

如果您想一些更高级别比包扭曲是去到图书馆在网络蟒...不幸的是,学习曲线是一点点陡峭。