參考:https://docs.python.org/2.7/library/socketserver.html。
python socket可以實現類似fabric、saltstack的功能,達到自動化運維效果。
socket學習記錄:
## socket_server.py import socket import os import sys import subprocess def work(): sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sock.bind(('',9999)) sock.listen(5) while True: try: conn, addr = sock.accept() ret = conn.recv(4096) result = subprocess.Popen(ret,shell=True,stdout=subprocess.PIPE,stdin=subprocess.PIPE,stderr=subprocess.PIPE) result = result.stdout.read() conn.send(result) except KeyboardInterrupt: print 'Now we will exit' sys.exit(0) sock.close() if __name__ == '__main__': work() ## socket_client.py import socket import sys def socket_send(command): sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sock.connect(('172.16.34.107', 9999)) sock.send(command) result = sock.recv(44096) sock.close() return result if __name__ == '__main__': cmd = sys.argv[1:] cmd = ' '.join(cmd) #print cmd, type(cmd) print socket_send(cmd)
測試運行:python socket_client.py uptime
2.利用socketserver實現多線程無阻塞式通信。
##server1.py ##coding=utf-8 import SocketServer import os,time,sys,subprocess class s_server(SocketServer.BaseRequestHandler): now = time.strftime('%Y-%m-%d %H:%M:%S') log_file=file('/srv/py/logs/socket-s.log','a') def runcmd(self,comm): self.log_file.write("At %s from %s running: %s\n" %(self.now,self.client_address[0],comm)) self.log_file.flush() self.request.sendall("Has ready") log=file('/dev/null','a') if comm.split()[0]=="cd": os.chdir(comm.split()[1]) self.request.sendall("Changed directoy successful") elif comm.split()[0]=='cmd.run': cmd=' '.join(comm.split()[1:]) p=subprocess.Popen(cmd,bufsize=0,shell=True,stderr=subprocess.PIPE,stdout=log) result=p.stderr.read() if p.wait()==0 and not result: self.request.sendall('succesed.') else:self.request.sendall(result) else: cmd=subprocess.Popen(comm,shell=True,stdout=subprocess.PIPE,stderr=subprocess.PIPE) result=cmd.stderr.read() + '\n' + cmd.stdout.read() self.request.sendall(result) log.flush() log.close() def handle(self): self.log_file.write("Connected from %s\n" %self.client_address[0]) self.log_file.flush() while 1: try: data=self.request.recv(8192) if data.split()[0]=="put": self.accept(filename) elif data.split()[0]=="get": self.send(filename) else: self.runcmd(data) except IndexError: break def accept(self,filename): ''' ...... ''' def send(self,filename): ''' ...... ''' if __name__=="__main__": h,p='',9999 server=SocketServer.ThreadingTCPServer((h,p),s_server) server.serve_forever() ##client1.py ###coding=utf-8 import socket,time,os,sys import rlcompleter def runcmd(serverip): received=sock.recv(8192) if received=="Changed directoy successful": print "Changed directoy successful" else: print '\033[32;1mFrom %s:\033[0m' %serverip print received.strip('\n') + '\n' if __name__=='__main__': ip = sys.argv[1] h,p=ip,9999 sock=socket.socket(socket.AF_INET,socket.SOCK_STREAM) sock.connect((h,p)) cmd = sys.argv[2:] cmd = ' '.join(cmd) sock.sendall(cmd) action=sock.recv(8192) runcmd(h) sock.close()
測試運行:
python client1.py 172.16.34.107 uptime
python client1.py 172.16.34.107 cmd.run yum install -y vim*