問題:html
一、本人工做主要作自動化,常常要去Linux後臺進行一些腳本操做,有時要去後臺執行命令,若是逐個登錄比較費事,效率會大打折扣python
二、雖然有能夠直接去後臺執行命令的AW,可是該AW存在不少問題,並且遇到交互式操做時不能很好的解決git
基於以上問題,經過Python寫了一個簡單的CLI Agent,就叫作TestAgent吧,主要思路:github
一、採用POST消息發送到TestAgent,TestAgent進行解析服務器
二、TestAgent接受到消息後,把消息體存爲一個文件restful
三、將文件更改成可執行的,而後啓動一個進程去執行腳本curl
四、若是執行成功將結果返回給客戶端,若是失敗,一樣將錯誤輸出也返回給客戶端socket
五、在POST消息的頭域中能夠設置超時時間,若是超時,返回「time out」,並將啓動的進程給殺掉測試
代碼以下:ui
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進行測試
一、執行簡單命令
二、執行的命令不存在
三、執行一個Python腳本
四、執行一個超時的腳本
五、執行一個帶有timeout頭域的腳本
至此,基本全部功能都驗證過了
PS:該程序理論上能夠執行任何腳本,只要腳本的解釋器寫正確
使用時通常會再寫個monitor腳本,放在crontab中,這樣就徹底能夠不登錄服務器了,能夠自動拉起TestAgent
但願該程序能夠幫助你們,^v^ !!
地址:https://github.com/litlefirefly/TestAgent