• 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文件,加入到自启动项中)

  • 相关阅读:
    three.js 居中-模型
    three.js 打包为一个组-几个单独的模型
    ABP 菜单和权限
    set
    P2429 制杖题
    对线性筛的新理解
    P2817 宋荣子的城堡
    P2651 添加括号III
    P2858 [USACO06FEB]奶牛零食Treats for the Cows
    P1005 矩阵取数游戏
  • 原文地址:https://www.cnblogs.com/cdj811/p/5755092.html
Copyright © 2020-2023  润新知