Python Socket实现C/S模式远程命令执行教程

Dylan
Dylan
发布时间:2026-10-13| 2人浏览过
原创

本文介绍使用Python socket模块构建客户端/服务器(C/S)模式的远程命令执行脚本。通过serverCmd.py监听端口并解析执行客户端发送的cmd指令,clientCmd.py负责读取目标IP列表并发送命令。示例包含完整源码、配置文件及运行效果演示,涵盖ipconfig、ping等命令的远程执行与回显处理。

本文介绍使用Python socket模块构建客户端/服务器(C/S)模式的远程命令执行脚本。

一. 前言

要求:

使用Python的socket套接字编写服务器/客户机模式的远程命令执行脚本。

serverCmd.py 远程机器上用来执行客户端发送命令的脚本 clientCmd.py 本地机器上,向远程服务器发送命令的脚本 servers.txt 本地机器上,存放所有的远程服务器IP地址文件(仅支持第一个IP)

发送:cmd [command]形式消息,让远程主机执行命令(本地主机无回显)

发送:close session消息,双方关闭会话。

二. 源码

下载地址: 点击此处本站下载。

注:

1. 代码注释较少,建议有一定套接字编程基础。 2. 或者直接简单部分修改IP使用。 3. clientCmd.py和servers.txt(修改IP地址后)放在同一目录。 4.程序为简单Demo,仅为学习记录。

serverCmd.py

#!/usr/bin/env python
# coding:utf-8
# Build by LandGrey
#
import time
import socket
import threading
import traceback
import subprocess
def parsecmd(strings):
  midsplit = str(strings).split(" ")
  if len(midsplit) >= 2 and midsplit[0] == "cmd":
    try:
      command = subprocess.Popen(strings[4:], shell=True)
      command.communicate()
      print "\n"
    except Exception, e:
      print e.message
      traceback.print_exc()
def recvdata(port):
  s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
  s.bind(('', port))
  s.listen(1)
  print "[+] Server is running on port:%s at %s" % (str(port), time.strftime("%Y%m%d %H:%M:%S", time.localtime()))
  while True:
    mainsocket, mainhost = s.accept()
    print "[+] Connect success -> %s at %s" % (str(mainhost), time.strftime("%Y%m%d %H:%M:%S", time.localtime()))
    if mainhost:
      while True:
        data = mainsocket.recv(1024)
        if data:
          print "[+] Receive:%s" % data
          mainsocket.sendall("[Server]success")
          parsecmd(data)
        if data == "close session":
          mainsocket.close()
          print "[+] Quit success"
          break
      break
if __name__ == "__main__":
  # some public variable
  connPort = 47091
  onethreads = threading.Thread(target=recvdata, args=(connPort,))
  onethreads.start()

clientCmd.py

#!/usr/bin/env python
# coding:utf-8
# Build by LandGrey
#
import time
import socket
def readtarget():
  global server_list
  with open(r"servers.txt") as f:
    for line in f.readlines():
      if line[0:1] != "#" and len(line.split(".")) == 4:
        server_list.append(line)
def connserver(host, port):
  s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  s.connect((host, port))
  while True:
    print "\n[*] Please input command:"
    data = raw_input()
    if not data:
      break
    s.sendall(data)
    recvdata = s.recv(1024)
    print "[+] Send %s:%s -> %s" % (host, str(connPort), data)
    time.sleep(0)
    if recvdata:
      print "[+] Receive :%s" % recvdata
    if data == "close session":
      s.close()
      break
if __name__ == "__main__":
  server_list = []
  connPort = 47091
  readtarget()
  if server_list != []:
    for host in server_list:
      connserver(host, connPort)

servers.txt

# server ip list 192.168.0.139

三. 运行效果

python serverCmd.py

[+] Server is running on port:47091 at 20161013 17:50:19 [+] Connect success -> ('192.168.0.241', 4255) at 20161013 17:50:32 [+] Receive:hello [+] Receive:你好 [+] Receive:cmd ip 'ip' 不是内部或外部命令,也不是可运行的程序 或批处理文件。

[+] Receive:cmd ipconfig

Windows IP 配置

以太网适配器 本地连接:

连接特定的 DNS 后缀 . . . . . . . : 本地链接 IPv6 地址. . . . . . . . : ****::****:****:****:******* IPv4 地址 . . . . . . . . . . . . : 192.168.0.139 子网掩 . . . . . . . . . . . . : 255.255.255.0 默认网关. . . . . . . . . . . . . : 192.168.0.1

隧道适配器 isatap.{****-6122-4F83-8828-****}:

媒体状态 . . . . . . . . . . . . : 媒体已断开 连接特定的 DNS 后缀 . . . . . . . :

[+] Receive:cmd ping www.baidu.com

正在 Ping www.a.shifen.com [180.97.33.108] 具有 32 字节的数据: 来自 180.97.33.108 的回复: 字节=32 时间=66ms TTL=36 来自 180.97.33.108 的回复: 字节=32 时间=66ms TTL=36 来自 180.97.33.108 的回复: 字节=32 时间=64ms TTL=36 来自 180.97.33.108 的回复: 字节=32 时间=65ms TTL=36

180.97.33.108 的 Ping 统计信息: 数据包: 已发送 = 4,已接收 = 4,丢失 = 0 (0% 丢失), 往返行程的估计时间(以毫秒为单位): 最短 = 64ms,最长 = 66ms,平均 = 65ms

[+] Receive:要结束了 [+] Receive:close session [+] Quit success

python clientCmd.py

[*] Please input command: hello [+] Send 192.168.0.139:47091 -> hello [+] Receive :[Server]success

[*] Please input command: 你好 [+] Send 192.168.0.139:47091 -> 你好 [+] Receive :[Server]success

[*] Please input command: cmd ip [+] Send 192.168.0.139:47091 -> cmd ip [+] Receive :[Server]success

[*] Please input command: cmd ipconfig [+] Send 192.168.0.139:47091 -> cmd ipconfig [+] Receive :[Server]success

[*] Please input command: cmd ping www.baidu.com [+] Send 192.168.0.139:47091 -> cmd ping www.baidu.com [+] Receive :[Server]success

[*] Please input command: 要结束了 [+] Send 192.168.0.139:47091 -> 要结束了 [+] Receive :[Server]success

[*] Please input command: close session [+] Send 192.168.0.139:47091 -> close session [+] Receive :[Server]success

更多关于Python相关内容可查看本站专题:《Python Socket编程技巧总结》、《Python数据结构与算法教程》、《Python函数使用技巧总结》、《Python字符串操作技巧汇总》、《Python入门与进阶经典教程》及《Python文件与目录操作技巧汇总》

希望本文所述对大家Python程序设计有所帮助。

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。