zoukankan      html  css  js  c++  java
  • 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 "
    
    
    
    *********************************************"
    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文件,加入到自启动项中)

  • 相关阅读:
    elasticsearch 中的Multi Match Query
    activiti 流程部署的各种方式
    elasticsearch 嵌套对象之嵌套类型
    elasticsearch Java High Level REST 相关操作封装
    elasticsearch 字段数据类型
    ubuntu 安装 docker
    elasticsearch 通过HTTP RESTful API 操作数据
    facenet 人脸识别(二)——创建人脸库搭建人脸识别系统
    POJ 3093 Margaritas(Kind of wine) on the River Walk (背包方案统计)
    墨卡托投影, GPS 坐标转像素, GPS 坐标转距离
  • 原文地址:https://www.cnblogs.com/cdj811/p/5755092.html
Copyright © 2011-2022 走看看