由于有大量的windows虚拟机用来做一些任务。这些windows上的机器程序要经常更新。每次部署升级,需要一台台的远程桌面上去操作,进行简单升级操作。这样讲花费大量时间。并且伴随windows机器的增加,将更加难管理。
无需远程桌面,即可完成基本操作,如:部署升级程序,远程启动及停止代理服务,重启,关机等。
采用python socket 的C/S形式来实现,在管理端发送管理命令到被管理端执行,进行更新程序代码等操作。需在windows机器上安装python。实现代码如下:
1、以下是server端,部署到被管理的windows或者linux机器
- #!/usr/bin/python
- #Script Name : pyserver.py
-
- import os
- import logging
- import sys
- import socket
-
- host='0.0.0.0'
- port=4567
- maxclient=10
- if sys.platform == 'win32':
- logfile='c:/server.log'
- else:
- logfile='/tmp/server.log'
-
- def initlog():
- logger=logging.getLogger()
- hdlr=logging.FileHandler(logfile)
- formatter=logging.Formatter('%(asctime)s %(levelname)s %(message)s')
- hdlr.setFormatter(formatter)
- logger.addHandler(hdlr)
- logger.setLevel(logging.NOTSET)
- return logger
-
- def socketserver():
- s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
- s.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)
- s.bind((host,port))
- s.listen(maxclient)
- # print "Server is running on port %d; press ctrl-c to terminate." % port
- while True:
- clientsock,clientaddr=s.accept()
- # print "connect from %s" % str(clientaddr)
- message="connect from : %s" % str(clientaddr)
- lg.info(message)
- clientfile=clientsock.makefile('rw',0)
- data=clientsock.recv(1024)
- message="Execute command : %s" %data
- lg.info(message)
- command=os.popen(data).read()
- clientfile.write("%s" % command)
- clientfile.close()
- clientsock.close()
-
- try:
- lg=initlog()
- socketserver()
- except KeyboardInterrupt:
- print "User Press Ctrl+C,Exit"
2、以下是管理端,用于发送命令到被管理端
- #!/usr/bin/env python
- #Script Name : pyclient.py
-
- import os
- import sys
- import getopt
- import socket
- import logging
- import time
-
- port=4567
- logfile='/tmp/client.log'
- file=''
- ip=''
-
- def initlog():
- logger=logging.getLogger()
- hdlr=logging.FileHandler(logfile)
- formatter=logging.Formatter('%(asctime)s %(levelname)s %(message)s')
- hdlr.setFormatter(formatter)
- logger.addHandler(hdlr)
- logger.setLevel(logging.NOTSET)
- return logger
-
- def usage():
- print '''
- Usage: python client.py [options...]
- Options:
- -f : read host list from file
- -I : read host from this command line
- -c : command run at remote host
- -h : this help info
- python client.py -I 10.16.134.164 -c "/sbin/ifconfig"
- '''
-
- def socketclient(IP,port,cmd):
- s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
- s.connect((IP,port))
- ISOTIMEFORMAT = '%Y-%m-%d %X'
- date = time.strftime(ISOTIMEFORMAT, time.localtime())
- result ="-------------------------------------------------------------------\n"
- result = "%sDATE : %s\nHOST : %sCOMMAND : %s\n" %(result,date,IP,cmd)
- while 1:
- if not cmd:
- break
- s.sendall(cmd)
- cmd=s.recv(1024)
- if not cmd:
- break
- #print cmd
- result = "%sRESULT :\n\n%s" %(result,cmd)
- print result
- writeLog(logfile,result)
- s.close()
-
- def writeLog(file,message):
- logger = open(file, 'a+')
- logger.writelines(message)
- logger.close()
-
- try:
- opts,args = getopt.getopt(sys.argv[1:],'hI:f:c:')
- except getopt.GetoptError:
- usage()
- sys.exit()
-
- if len(opts) == 0:
- usage()
- sys.exit()
-
- for opt,arg in opts:
- if opt in ('-h','--help'):
- usage()
- sys.exit()
- elif opt == '-f':
- #print 'read flie %s' %arg
- file = arg
- elif opt == '-I':
- #print 'server IP is %s' %arg
- ip = arg
- elif opt == '-c':
- #print 'command is %s' %arg
- command = arg
-
-
- if file:
- for ip in os.popen('cat %s' %file).readlines():
- socketclient(ip,port,command)
- else:
- if ip :
- socketclient(ip,port,command)
- else:
- print 'Error '
简单的实现了以上需求。大家可以一起讨论下,用更好的方法来实现以上的需求。