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程序设计有所帮助。