码迷,mamicode.com
首页 > 其他好文 > 详细

rPyc 模块应用:在远端上执行命令,并且获取查询结果

时间:2016-08-10 00:34:39      阅读:770      评论:0      收藏:0      [点我收藏+]

标签:

背景:最近项目里将自动化框架进行整改,中间就涉及到了自动化代理这块,原有的自动化代理服务端是用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文件,加入到自启动项中)

技术分享

 

rPyc 模块应用:在远端上执行命令,并且获取查询结果

标签:

原文地址:http://www.cnblogs.com/cdj811/p/5755092.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!