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切换pip安装源的方法详解
Nov 18 Python
Python实现字符串格式化输出的方法详解
Sep 20 Python
python监控键盘输入实例代码
Feb 09 Python
Python简单实现网页内容抓取功能示例
Jun 07 Python
Python使用pymysql从MySQL数据库中读出数据的方法
Jul 25 Python
详解python中的Turtle函数库
Nov 19 Python
详解Python函数式编程—高阶函数
Mar 29 Python
python实现吃苹果小游戏
Mar 21 Python
PHP基于phpqrcode类库生成二维码过程解析
May 28 Python
使用Pycharm在运行过程中,查看每个变量的操作(show variables)
Jun 08 Python
Python Scrapy多页数据爬取实现过程解析
Jun 12 Python
Jupyter Notebook 安装配置与使用详解
Jan 06 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编写PDF文档生成器
2006/10/09 PHP
用PHP和ACCESS写聊天室(四)
2006/10/09 PHP
php网上商城购物车设计代码分享
2012/02/15 PHP
PHP实现ftp上传文件示例
2014/08/21 PHP
PHP中SimpleXML函数用法分析
2014/11/26 PHP
利用PHP如何写APP接口详解
2016/08/23 PHP
php模拟实现斗地主发牌
2020/04/22 PHP
如何利用PHP实现上传图片功能详解
2020/09/24 PHP
基于jQuery捕获超链接事件进行局部刷新代码
2012/05/10 Javascript
解析使用js判断只能输入数字、字母等验证的方法(总结)
2013/05/14 Javascript
JQuery筛选器全系列介绍
2013/08/27 Javascript
Jquery增加鼠标中间功能mousewheel的实例代码
2013/09/05 Javascript
JS的事件绑定深入认识
2014/06/26 Javascript
Javascript基础教程之比较操作符
2015/01/18 Javascript
使用jQuery给input标签设置默认值
2016/06/20 Javascript
javascript insertAfter()定义与用法示例
2016/07/25 Javascript
vue组件中点击按钮后修改输入框的状态实例代码
2017/04/14 Javascript
利用node.js爬取指定排名网站的JS引用库详解
2017/07/25 Javascript
基于jstree使用AJAX请求获取数据形成树
2017/08/29 Javascript
JavaScript实现微信号随机切换代码
2018/03/09 Javascript
Node.js console控制台简单用法分析
2019/01/04 Javascript
小程序登录/注册页面设计的实现代码
2019/05/24 Javascript
基于ts的动态接口数据配置的详解
2019/12/18 Javascript
js点击事件的执行过程实例分析【冒泡与捕获】
2020/04/11 Javascript
Vue 事件的$event参数=事件的值案例
2021/01/29 Vue.js
Python使用迭代器捕获Generator返回值的方法
2017/04/05 Python
django进阶之cookie和session的使用示例
2018/08/17 Python
Python面向对象之继承和组合用法实例分析
2018/08/27 Python
python的pytest框架之命令行参数详解(上)
2019/06/27 Python
Python os模块常用方法和属性总结
2020/02/20 Python
python 爬取免费简历模板网站的示例
2020/09/27 Python
matplotlib绘制多子图共享鼠标光标的方法示例
2021/01/08 Python
安全事故检讨书
2014/01/18 职场文书
2015年党员干部承诺书
2015/01/21 职场文书
2015年感恩母亲节的演讲稿
2015/03/18 职场文书
工作态度检讨书范文
2015/05/06 职场文书