Python socket套接字实现C/S模式远程命令执行功能案例


Posted in Python onJuly 06, 2018

本文实例讲述了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 相关文章推荐
Python设计模式之观察者模式实例
Apr 26 Python
Python中的各种装饰器详解
Apr 11 Python
使用Python制作获取网站目录的图形化程序
May 04 Python
Python中的choice()方法使用详解
May 15 Python
Python中的命令行参数解析工具之docopt详解
Mar 27 Python
python http接口自动化脚本详解
Jan 02 Python
python实现的MySQL增删改查操作实例小结
Dec 19 Python
python实现给微信指定好友定时发送消息
Apr 29 Python
python在OpenCV里实现投影变换效果
Aug 30 Python
用python实现英文字母和相应序数转换的方法
Sep 18 Python
Python imutils 填充图片周边为黑色的实现
Jan 19 Python
python脚本和网页有何区别
Jul 02 Python
python脚本监控Tomcat服务器的方法
Jul 06 #Python
解决csv.writer写入文件有多余的空行问题
Jul 06 #Python
Python简单爬虫导出CSV文件的实例讲解
Jul 06 #Python
Python实现的从右到左字符串替换方法示例
Jul 06 #Python
Python用csv写入文件_消除空余行的方法
Jul 06 #Python
Python实现string字符串连接的方法总结【8种方式】
Jul 06 #Python
python 读取目录下csv文件并绘制曲线v111的方法
Jul 06 #Python
You might like
PHP的面向对象编程
2006/10/09 PHP
php操作xml
2013/10/27 PHP
thinkphp实现面包屑导航(当前位置)例子分享
2014/05/10 PHP
Laravel框架路由管理简单示例
2019/05/07 PHP
Javascript 垃圾收集机制介绍理解
2013/05/14 Javascript
javascript每日必学之多态
2016/02/23 Javascript
JavaScript中匿名函数的用法及优缺点详解
2016/06/01 Javascript
jQuery焦点图轮播效果实现方法
2016/12/19 Javascript
jQuery动态追加页面数据以及事件委托详解
2017/05/06 jQuery
AngularJS自定义指令详解(有分页插件代码)
2017/06/12 Javascript
详解如何实现一个简单的Node.js脚手架
2017/12/04 Javascript
使用Vue 实现滑动验证码功能
2019/06/27 Javascript
Vue为什么要谨慎使用$attrs与$listeners
2020/08/27 Javascript
js前端对于大量数据的展示方式及处理方法
2020/12/02 Javascript
[02:04]2020年夜魇暗潮预告片
2020/10/30 DOTA
Python中使用Tkinter模块创建GUI程序实例
2015/01/14 Python
在Python中移动目录结构的方法
2016/01/31 Python
Python IDLE入门简介
2017/12/08 Python
浅谈Python中range和xrange的区别
2017/12/20 Python
Python实现数据结构线性链表(单链表)算法示例
2019/05/04 Python
PyTorch 随机数生成占用 CPU 过高的解决方法
2020/01/13 Python
Python3.7安装PyQt5 运行配置Pycharm的详细教程
2020/10/15 Python
纯CSS实现设置半个字符的样式
2014/07/03 HTML / CSS
CSS3 Flex 弹性布局实例代码详解
2018/11/01 HTML / CSS
体育教育专业毕业生自荐信
2013/11/15 职场文书
教学实验楼管理制度
2014/02/01 职场文书
劲霸男装广告词
2014/03/21 职场文书
供货协议书范本
2014/04/22 职场文书
《恐龙》教学反思
2014/04/27 职场文书
公司收款委托书范本
2014/09/20 职场文书
销售经理工作失职检讨书
2014/10/24 职场文书
公司开业主持词
2015/07/02 职场文书
教导处教学工作总结
2015/08/12 职场文书
python自动计算图像数据集的RGB均值
2021/06/18 Python
Python爬虫基础之简单说一下scrapy的框架结构
2021/06/26 Python
pytest实现多进程与多线程运行超好用的插件
2022/07/15 Python