代码之家  ›  专栏  ›  技术社区  ›  unholysampler

Netcat在Python中的实现

  •  24
  • unholysampler  · 技术社区  · 16 年前

    我发现 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
    

    3 回复  |  直到 16 年前
        1
  •  59
  •   Kolay.Ne Raj Chinna    6 年前

    如果你只使用 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
  •  21
  •   d0n    11 年前

    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)。

    当做

        3
  •  5
  •   Autoplectic    16 年前

    如果您不介意完全废弃这些代码,您可能会想看看 scapy --它基本上是python中包工具的瑞士军刀。看一看 interactive tutorial 看看它是否适合你的需要。

    如果你想要比数据包更高级的东西 twisted 是python中用于联网的go to库。。。不幸的是,学习曲线有点陡峭。