python socket筆記

參考:https://docs.python.org/2.7/library/socketserver.html

python socket可以實現類似fabric、saltstack的功能,達到自動化運維效果。

  1. 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*





發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章