繁体   English   中英

python相当于netcat

[英]python equivalent of netcat

我有一个 TCP 服务器,我需要用 Python 为其编写一个客户端。

服务器是使用arduino_uip库的 arduino; 服务器代码(几乎)与该库TCP 服务器示例相同。 使用 nc 作为客户端可以正常工作。

但是当我使用 python 套接字(如在这个答案中)与服务器通信时,服务器在套接字关闭或关闭时挂起。

那可能是服务器的问题; 但是,由于 nc 作为客户工作正常,我的问题是:

这个答案与 nc 有什么不同,nc 可以解释服务器在连接关闭/关闭时挂起)?

总结什么有效,什么无效:

  • python 客户端和 nc -l 作为服务器:有效
  • nc 作为客户端和 arduino 服务器:有效
  • python客户端和arduino服务器:挂起服务器

这是客户端代码:

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

编辑 :

看来(Vorsprung 的回答让我想到了!)这实际上是一个时间问题。 如果我在关闭之前在上面的代码中添加 sleep(0.5) 一切都很好(就像在 netcat 中,在我按下 Ctrl+C 之前有一个手动延迟)。 我想我现在必须检查那个arduino库......

查看了 netcat 源代码( svn checkout svn://svn.code.sf.net/p/netcat/code/trunk netcat-code ),它只在关闭之前调用 shutdown(),而不仅仅是在设置之后调用插座

这就是我所看到的区别

python相当于netcat

使用 nclib:pip install nclib

文档: https : //nclib.readthedocs.io/en/latest/

Python 3 netcat 侦听器,输入和输出分别分配给变量 command 和 data。

import nclib


def listener(port):
    """ local netcat listener for reverse bash shell from a remote host. """
    server = nclib.TCPServer(('0.0.0.0', int(port)))
    print("listening ...")
    for client in server:
        print('Connected to %s:%d' % client.peer)
        command = ""
        while command != "exit":
            try:
                # if command was entered by the user
                if len(command) > 0:
                    # read the line to hide command from output
                    if command in client.readln().decode('utf-8').strip(" "):
                        pass  # disregard the last command

                # get output until dollar sign (bash --posix forces bash-X.X$)
                data = client.read_until('$')
                print(data.decode('utf-8'), end="")  # print string of received bytes

                # get user input command and write command to socket
                command = input(" ")
                client.writeln(command)

            # handle exceptions and exiting
            except KeyboardInterrupt:
                print("\nKeyboardInterrupt")
                exit(1)
            except Exception as e:
                print("\nException Occurred\n")
                print(e)
                exit(1)
        print("Disconnected :-)")
        exit(1)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM