问题:

1、本人工作主要做自动化,经常要去Linux后台进行一些脚本操作,有时要去后台执行命令,如果逐个登陆比较费事,效率会大打折扣

2、虽然有可以直接去后台执行命令的AW,但是该AW存在很多问题,而且遇到交互式操作时不能很好的解决

 

基于以上问题,通过Python写了一个简单的CLI Agent,就叫做TestAgent吧,主要思路:

1、采用POST消息发送到TestAgent,TestAgent进行解析

2、TestAgent接受到消息后,把消息体存为一个文件

3、将文件更改为可执行的,然后启动一个进程去执行脚本

4、如果执行成功将结果返回给客户端,如果失败,同样将错误输出也返回给客户端

5、在POST消息的头域中可以设置超时时间,如果超时,返回“time out”,并将启动的进程给杀掉

 

代码如下:

1 #! /usr/bin/env python
 2 import commands
 3 import socket
 4 import time
 5 import os
 6 import multiprocessing
 7 import uuid
 8 from BaseHTTPServer import BaseHTTPRequestHandler,HTTPServer
 9 
10 #HTTPServer的监听端口
11 PORT=12345
12 
13 class HttpHandler(BaseHTTPRequestHandler):
14     tmpfile=''
15     #处理POST消息
16     def do_POST(self):
17         print self.path
18         content_len = int(self.headers.getheader('content-length',0))
19         #获取timeout
20         timeout = int(self.headers.getheader('timeout',0))
21         if timeout==0:
22             timeout=5
23         #解析消息并存储为文件
24         script=self.rfile.read(content_len)
25         x=uuid.uuid4()
26         self.tmpfile="."+str(x.int)
27         fd=open(self.tmpfile,'w')
28         fd.write(script)
29         fd.close()
30         os.system("chmod +x "+self.tmpfile)
31         script="./"+self.tmpfile
32         #执行脚本
33         self.ExecuteScript(script,timeout)
34         
35     def ExecuteScript(self,script,timeout=5):
36         #启动另一个进程执行脚本
37         p=multiprocessing.Process(target=self.ScriptWorker,args=(script,))
38         p.start()
39         i=0
40         while i<timeout:
41             if(not p.is_alive()):
42                 return "successful"
43             else:
44                 time.sleep(1)
45             i=i+1
46         #超时的话终止进程并杀掉执行任务的进程
47         p.terminate()
48         os.system("kill -9 "+str(p.pid))
49         self.send_error(400,"time out")
50         self.request.shutdown(socket.SHUT_RDWR)
51         self.request.close()
52         #删除临时文件
53         if self.tmpfile != '':
54             os.system("rm "+self.tmpfile)
55         self.tmpfile=''
56         
57     def ScriptWorker(self,script):
58         #执行脚本,返回状态码和输出
59         (status,result)=commands.getstatusoutput(script)
60         print script
61         print result
62         #如果成功返回200,如果失败返回400
63         if status == 0:
64             self.send_response(200)
65         else:
66             self.send_response(400)
67         self.send_header('Content-type','text/html')
68         self.end_headers()
69         self.wfile.write(result)
70         #删除临时文件
71         if self.tmpfile != '':
72             os.system("rm "+self.tmpfile)
73         self.tmpfile=''
74         
75 if __name__=='__main__':
76     os.system('rm .*')
77     server_address=('0.0.0.0',PORT)
78     http_server=HTTPServer(server_address,HttpHandler)
79     http_server.serve_forever()
80

测试:

采用curl或者restful client进行测试

1、执行简单命令

 

python agent python agent操作_Python

2、执行的命令不存在

python agent python agent操作_后台执行_02

3、执行一个Python脚本

python agent python agent操作_后台执行_03

python agent python agent操作_临时文件_04

4、执行一个超时的脚本

python agent python agent操作_python agent_05

5、执行一个带有timeout头域的脚本

python agent python agent操作_Python_06

python agent python agent操作_后台执行_07

python agent python agent操作_Python_08

 

至此,基本所有功能都验证过了

 

PS:该程序理论上可以执行任何脚本,只要脚本的解释器写正确

      使用时一般会再写个monitor脚本,放在crontab中,这样就完全可以不登陆服务器了,可以自动拉起TestAgent

 

希望该程序可以帮助大家,^v^ !!

 地址:https://github.com/litlefirefly/TestAgent