Python socket套接字实现C/S模式远程命令执行功能案例
作者:LandGrey 发布时间:2021-11-27 13:22:01
本文实例讲述了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=36180.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程序设计有所帮助。
来源:https://blog.csdn.net/c465869935/article/details/52808821


猜你喜欢
- Mysql Workbench是一款开源的数据库客户端,在IT行业这款开源的软件也是相当有名气的,很多使用musql的同仁都喜欢使用这款客户
- 这一段时间,我在进行“09帮助中心升级”项目,负责其中的白板和视觉设计,总算和Axure有了第一次的正式会晤。由于之前已经零散地学习过一些A
- 一直一来,我都在想办法看能不能用 col 控制表格的列隐藏,但是无奈,FF对COL支持不够好(其实是以前没有发现COL在FF下要怎么弄)。今
- 很久很久以前,有一群人,他们决定用8个可以开合的晶体管来组合成不同的状态,以表示世界上的万物。他们看到8个开关状态是好的,于是他们把这称为字
- 今天以前的同学问我关于这方面的SQL语句,我特意记忆一下,毕竟这个也比较常见了select * from (select * from me
- Django的权限系统很简单,它可以赋予users或groups中的users以权限。Django admin后台就使用了该权限系统,不过也
- Mysql 查询时间段交集使用场景数据库表有两个字段starttime,endtime。现在给出(a,b)的时间段,查出和(starttim
- 前言我们在日常文本处理中,经常会将数据结构保存在列表中,如果将列表中的项进行关联,创建我们想要的字典结构,存取就会十分方便!示例详解比如说将
- 是不是有这么一个场景,对外提供一堆数据或者是要返回给用户一个结果。但是不想把内部的一些数据和逻辑暴露给对方。。。简单点来说,就是想以服务的方
- argparse 是python自带的命令行参数解析包,可以用来方便地读取命令行参数。一、传入一个参数import argpars
- # _*_ coding:utf-8 _*_# name login_baidu.pyimport urllib,urllib2,httpl
- python中捕获键盘操作一共有两种方法第一种方法:使用pygame中event方法使用方式如下:使用键盘右键为例if event.type
- 寻找含有关键字文件和删除文件夹我们往往在操作文件时,会不知道文件具体的路径。一般如果只是处理一个文件的话我们可以在文件所在的文件夹下运行py
- 凡搞WEB开发的人都离不开HTTP(超文本传输协议),而要了解HTTP,除了HTML本身以外,还有一部分不可忽视的就是HTTP消息头。做过S
- 喜欢用Python写脚本的小伙伴可以跟着一起写一写呀。编写环境:Python2.x00x1:需要用到的模块需要用到的模块如下:import
- 1.官网下载MySQL下载Mysql点击下载mysql. 或点击这里下载下载完成后解压到某一个文件夹(记住这个路径,一会要用到)2.配置初始
- 1、注册一个新浪应用,得到appkey和secret,以及token,将这些信息写入配置文件sina_weibo_config.ini,内容
- 背景在业务数据统计分析中基本都会涉及到各省区的分析,数据可视化是数据分析的一把利器,这些省区的数据一般会用地图可视化出来,这样一些规律可以被
- 大家可能经常会遇到这种情况:sql="select * from table"set rs=conn.execute(s
- 一:图形界面安装 1、打开Anconda2、点击Environment3、将Installed点击为Not installed4、搜索dja