Python rPyc 模块应用:在远端上执行命令,并且获取查询结果
背景:最近项目里将自动化框架进行整改,中间就涉及到了自动化代理这块,原有的自动化代理服务端是用C++编写的,经常出现运行在system会话下,导致代理无法执行远程过来的命令,在百度上搜了下,发现Python有rPyc模块,于是拿来试了下看看是否满足要求。一用才发现rPyc真的是很强大,几行代码轻松搞定,所以在这里与大家一起分享下,也欢迎大家提建议和更好的方法。
目的:远端的执行机A上,能使用命令,在B机上查询相应的信息
上代码:
客户端代码:
1 # -*- coding:utf-8 -*- 2 ############################################################## 3 # rPyc模块的调用 4 # 目的是为了A执行机上,能在B机上执行cmd命令并且获取返回值 5 # rPyc 客户端 6 ############################################################## 7 8 import rpyc 9 10 import os, subprocess 11 12 #建立与服务端的连接#要连接的服务端IP,此处为我本机IP,应该我服务端就运行在本地,可以用localhost 13 conn = rpyc.connect("192.168.0.100", 6677) 14 15 #exposed_execCmd是服务端提供的方法 16 getCmdRsp = conn.root.exposed_execCmd("dir") 17 print getCmdRsp 18 19 getCmdRsp = conn.root.execGetCmdRsp("tasklist | findstr python*") 20 print getCmdRsp 21 22 print "\n\n\n\n*********************************************" 23 24 getCmdRsp = conn.root.subprocessCmd("tasklist | findstr python*") 25 print getCmdRsp 26 27 getCmdRsp = conn.root.subprocessCmdRsp("tasklist | findstr python*") 28 print getCmdRsp 29 conn.close()
服务端代码:
1 # -*- coding:utf-8 -*- 2 ############################################################## 3 # rPyc模块的调用 4 # 目的是为了A执行机上,能在B机上执行cmd命令并且获取返回值 5 # rPyc 服务端 6 ############################################################## 7 8 from rpyc import Service 9 from rpyc.utils.server import ThreadedServer 10 import os, subprocess 11 12 class Test_ThreadedServer(Service): 13 #对服务端来说,只有以“exposed_*开头的方式才能被客户端调用,所以要提供给客户端的方法都得加"exposed_” 14 15 #返回0和1; 0=True,1=False 16 def exposed_execCmd(self,cmd): 17 return os.system(cmd) 18 19 #返回cmd命令的查询结果 20 def exposed_execGetCmdRsp(self,cmd): 21 return os.popen(cmd).read() 22 23 # 返回0和1; 0=True,1=False 24 def exposed_subprocessCmd(self,cmd): 25 return subprocess.call(cmd) 26 27 # 返回cmd命令的查询结果 28 def exposed_subprocessCmdRsp(self, cmd): 29 return subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT).stdout.read() 30 31 Test_server = ThreadedServer(Test_ThreadedServer, port=6677, auto_register=False) 32 Test_server.start()
直接运行服务端代码,会在后台启动一个Python进程或者pythonw进程(好像跟启动方式有关系)
服务端启动后,会一直监听来自6677端口来的消息(注意客户端与服务端端口要对应,端口号随意,只要没被占用就行)
效果图:基本已经实现自动化需要的功能(后续可以编译成exe文件,加入到自启动项中)