Python socket套接字实现C/S模式远程命令执行功能案例
本文实例讲述了Pythonsocket套接字实现C/S模式远程命令执行功能。分享给大家供大家参考,具体如下:
一.前言
要求:
使用python的socket套接字编写服务器/客户机模式的远程命令执行脚本。
serverCmd.py远程机器上用来执行客户端发送命令的脚本
clientCmd.py本地机器上,向远程服务器发送命令的脚本
servers.txt 本地机器上,存放所有的远程服务器IP地址文件(仅支持第一个IP)发送:cmd[command]形式消息,让远程主机执行命令(本地主机无回显)
发送:closesession消息,双方关闭会话。
二.源码
下载地址:点击此处本站下载。
注:
1.代码注释较少,建议有一定套接字编程基础。
2.或者直接简单部分修改IP使用。
3.clientCmd.py和servers.txt(修改IP地址后)放在同一目录。
4.程序为简单Demo,仅为学习记录。
serverCmd.py
#!/usr/bin/envpython
#coding:utf-8
#BuildbyLandGrey
#
importtime
importsocket
importthreading
importtraceback
importsubprocess
defparsecmd(strings):
midsplit=str(strings).split("")
iflen(midsplit)>=2andmidsplit[0]=="cmd":
try:
command=subprocess.Popen(strings[4:],shell=True)
command.communicate()
print"\n"
exceptException,e:
printe.message
traceback.print_exc()
defrecvdata(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"[+]Serverisrunningonport:%sat%s"%(str(port),time.strftime("%Y%m%d%H:%M:%S",time.localtime()))
whileTrue:
mainsocket,mainhost=s.accept()
print"[+]Connectsuccess->%sat%s"%(str(mainhost),time.strftime("%Y%m%d%H:%M:%S",time.localtime()))
ifmainhost:
whileTrue:
data=mainsocket.recv(1024)
ifdata:
print"[+]Receive:%s"%data
mainsocket.sendall("[Server]success")
parsecmd(data)
ifdata=="closesession":
mainsocket.close()
print"[+]Quitsuccess"
break
break
if__name__=="__main__":
#somepublicvariable
connPort=47091
onethreads=threading.Thread(target=recvdata,args=(connPort,))
onethreads.start()
clientCmd.py
#!/usr/bin/envpython
#coding:utf-8
#BuildbyLandGrey
#
importtime
importsocket
defreadtarget():
globalserver_list
withopen(r"servers.txt")asf:
forlineinf.readlines():
ifline[0:1]!="#"andlen(line.split("."))==4:
server_list.append(line)
defconnserver(host,port):
s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.connect((host,port))
whileTrue:
print"\n[*]Pleaseinputcommand:"
data=raw_input()
ifnotdata:
break
s.sendall(data)
recvdata=s.recv(1024)
print"[+]Send%s:%s->%s"%(host,str(connPort),data)
time.sleep(0)
ifrecvdata:
print"[+]Receive:%s"%recvdata
ifdata=="closesession":
s.close()
break
if__name__=="__main__":
server_list=[]
connPort=47091
readtarget()
ifserver_list!=[]:
forhostinserver_list:
connserver(host,connPort)
servers.txt
#serveriplist
192.168.0.139
三.运行效果
pythonserverCmd.py
[+]Serverisrunningonport:47091at2016101317:50:19
[+]Connectsuccess->('192.168.0.241',4255)at2016101317:50:32
[+]Receive:hello
[+]Receive:你好
[+]Receive:cmdip
'ip'不是内部或外部命令,也不是可运行的程序
或批处理文件。[+]Receive:cmdipconfig
WindowsIP配置
以太网适配器本地连接:
连接特定的DNS后缀.......:
本地链接IPv6地址........:****::****:****:****:*******
IPv4地址............:192.168.0.139
子网掩码 ............:255.255.255.0
默认网关.............:192.168.0.1隧道适配器isatap.{****-6122-4F83-8828-****}:
媒体状态 ............:媒体已断开
连接特定的DNS后缀.......:[+]Receive:cmdpingwww.baidu.com
正在Pingwww.a.shifen.com[180.97.33.108]具有32字节的数据:
来自180.97.33.108的回复:字节=32时间=66msTTL=36
来自180.97.33.108的回复:字节=32时间=66msTTL=36
来自180.97.33.108的回复:字节=32时间=64msTTL=36
来自180.97.33.108的回复:字节=32时间=65msTTL=36180.97.33.108的Ping统计信息:
数据包:已发送=4,已接收=4,丢失=0(0%丢失),
往返行程的估计时间(以毫秒为单位):
最短=64ms,最长=66ms,平均=65ms[+]Receive:要结束了
[+]Receive:closesession
[+]Quitsuccess
pythonclientCmd.py
[*]Pleaseinputcommand:
hello
[+]Send192.168.0.139:47091->hello
[+]Receive:[Server]success[*]Pleaseinputcommand:
你好
[+]Send192.168.0.139:47091->你好
[+]Receive:[Server]success[*]Pleaseinputcommand:
cmdip
[+]Send192.168.0.139:47091->cmdip
[+]Receive:[Server]success[*]Pleaseinputcommand:
cmdipconfig
[+]Send192.168.0.139:47091->cmdipconfig
[+]Receive:[Server]success[*]Pleaseinputcommand:
cmdpingwww.baidu.com
[+]Send192.168.0.139:47091->cmdpingwww.baidu.com
[+]Receive:[Server]success[*]Pleaseinputcommand:
要结束了
[+]Send192.168.0.139:47091->要结束了
[+]Receive:[Server]success[*]Pleaseinputcommand:
closesession
[+]Send192.168.0.139:47091->closesession
[+]Receive:[Server]success
更多关于Python相关内容可查看本站专题:《PythonSocket编程技巧总结》、《Python数据结构与算法教程》、《Python函数使用技巧总结》、《Python字符串操作技巧汇总》、《Python入门与进阶经典教程》及《Python文件与目录操作技巧汇总》
希望本文所述对大家Python程序设计有所帮助。