python远程调用脚本(一)

上周@维西提出需求希望在Dbfree实现远程调用脚本模块,所有模块去访问主机上的脚本,不需要登陆主机,只要调用远程调用脚本模块的方法就能实现。

python进行远程调用脚本方法:
一、登陆主机办法,python模块支持如pssh pexpect
二、远程以方法方式调用(不需要登陆主机),python模块rpyc,支持分布式
三、socket方式,个人感觉比较复杂,需要熟悉网络协议,起点比较高

pssh、pexpect在以前文章有介绍,这次介绍一下rpyc,就像rpyc文档介绍一下,rpyc支持远程调用、分布式计算,以较少代码量实现需复杂socket编程。rpyc的认证方式学习。
以代码方式介绍:

需求:分别执行server端的三个不同脚本,并返回执行结果给client端

server端:

$ls
iamperl.pl  iampython.py  iamshell.sh  server.py
 
#!/usr/bin/en python
import os
from rpyc import Service
from rpyc.utils.server import ThreadedServer
class remote_call_script( Service ):
      def exposed_iamshell( self ):
          return os.system("/home/luoxuan/iamshell.sh")
 
      def exposed_iamperl( self ):
          return os.system("/home/luoxuan/iamperl.pl")
 
      def exposed_iampython( self ):
          return os.system("/home/luoxuan/iampython.py")
 
s = ThreadedServer( remote_call_script, port=11111, auto_register=False )
s.start()

client端:

$ls client.py 
client.py
 
#!/usr/bin/env python
import rpyc
c = rpyc.connect('xxxx.xxxx.xxxx.xxxx', 11111)
if c.root.iamshell() == 0:
   print "shell ok"
 
if c.root.iamperl() == 0:
   print "perl ok"
 
if c.root.iampython() == 0:
   print "python ok"
 
c.close()

因文档中这样例子很多,不详细介绍,需注意两点:

1、server端定义方法需要被client调用,必须定义以exposed 开头的方法,不然会报错AttributeError: ‘remote_call_script’ object has no attribute ‘exposed_iamshell’
2、server端默认不设认证机制,如果需要认证有推荐两种方法: ThreadedServer的authenticator参数与SSL模块

server端:
$nohup python server.py &
[1] 3246
$ps -ef|grep server.py|grep -v grep
luoxuan 3246 4386 0 14:45 pts/7 00:00:00 python server.py

client端:
$python client.py
shell ok
perl ok
python ok

当然还需要考虑很多异常处理,如超时、验证失败等

下篇介绍Socket方式调用


One Response to “python远程调用脚本(一)”

  1. 季庄新闻说道:

    不错。以前用过paramiko模块,还挺好用的。如有兴趣,网上有不少例子。

Post a Comment