LinuxEye - Linux系统教程

LinuxEye - Linux系统教程

当前位置: 主页 > 脚本编程 >

批量管理python脚本

时间:2013-03-24 11:12来源:51CTO 编辑:allanx 点击:
#!/usr/bin/env python# -*- coding: utf-8 -*-## Syscloud Operation platform.py# # Copyright 2013 allan allan@ALLAN-PC# # This program is free software; you can redistribute it and/or modify# it under the terms of the GNU General Public Licen
#!/usr/bin/env python
# -*- coding: utf-8 -*-
#
#  Syscloud Operation platform.py
# 
#  Copyright 2013 allan <allan@ALLAN-PC>
# 
#  This program is free software; you can redistribute it and/or modify
#  it under the terms of the GNU General Public License as published by
#  the Free Software Foundation; either version 2 of the License, or
#  (at your option) any later version.
# 
#  This program is distributed in the hope that it will be useful,
#  but WITHOUT ANY WARRANTY; without even the implied warranty of
#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
#  GNU General Public License for more details.
# 
#  You should have received a copy of the GNU General Public License
#  along with this program; if not, write to the Free Software
#  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
#  MA 02110-1301, USA.
# 
#  QQ:286575330
import paramiko
import sys
import Queue
import threading
import getopt
class webmonitor:
    def __init__(self):
        try:
            self.pkey_file=‘这是密钥的路径’
            self.known_host = '/root/.ssh/known_hosts'
            self.key=paramiko.RSAKey.from_private_key_file(self.pkey_file, password=‘这里是密钥的密码’)
        except:
            print 'No such file or directory: \'/root/.ssh/jumper_rsa\''
    def help(self):
        return '''
              -h,--help            帮助页面
              -c,--command        执行的命令
              -H,--host            主机IP
              -f, --file        指定文件
              -S, --SENDFILE    传输文件模式
              -C, --COMMAND        执行命令模式
              -L, --localpath    本地文件路径
              -R, --removepath    远程服务器路径
      e.g.
          单台执行命令格式: -C -H “IP地址” -c “命令”
          批量执行命令格式: -C -f “IP地址文件” -c “命令”
          单台传送文件: -S -H “IP地址” -L "本地文件路径" -R “远程服务器文件路径”
          批量传送文件: -S -f "IP地址文件" -L “本地文件路径” -R “远程文件路径”
      '''
    def ssh(self,hostname,port,username, cmd):#ssh 远程执行命令
        ssh = paramiko.SSHClient()
        ssh.load_system_host_keys(self.known_host)
        ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
        ssh.connect(hostname, port, username, password='这是远程服务器密码', pkey=self.key, allow_agent=True, look_for_keys=True)
        stdin, stdout, stderr = ssh.exec_command(cmd)
        if stderr.read() != 0:
            print '%s%s\n[OK]%s\n' % (stderr.read(),stdout.read(),hostname)
            print '========================================================================='
        else:
            print "\033[1;31;40m[ERROR]%s\033[0m" % hostname
            print '========================================================================='
        ssh.close()
    def sftp(self, hostname, port,username,localpath, remotepath):#SFTP 传输文件
        ssh = paramiko.Transport((hostname,port))
        ssh.connect(username=username, pkey=self.key)
        sftp = paramiko.SFTPClient.from_transport(ssh)
        sftp.put(localpath,remotepath)
        sftp.close()
        ssh.close()
        print '========================================================================='
        print "OK %s" % hostname
        return 0
def isset(v):#判断定义的是否为变量
    try:
        type (eval(v))
    except:
        return 0
    else:
        return 1
if __name__ == '__main__':
    try:
        opts, args = getopt.getopt(sys.argv[1:], "L:R:CSH:c:f:h", ["localpath","remotepath","COMMAND","SENDFILE","host","command","file",'help'])
        if sys.argv[1] == "-S":
            for o, value in opts:
                if o in ("-S","--SENDFILE"):
                    print "MODE: SENDFILE"
                elif o in ("-h","--help"):
                    print webmonitor().help()
                elif o in ("-H","--host"):
                    host = value
                elif o in ("-f", "--file"):
                    filein = value
                elif o in ("-c","--command"):
                    cmd = value
                elif o in ("-R","--remotepath"):
                    rpath = value
                elif o in ("-L","--localpath"):
                    lpath = value
                if isset('host') and isset('lpath') and isset('rpath'):
                    webmonitor().sftp(host, 22, "root", lpath, rpath)
                    print '========================================================================='
                elif isset('filein') and isset('lpath') and isset('rpath'):
                    threads = []
                    myqueue = Queue.Queue(maxsize = 0)
                    f = open(filein, "r")
                    for ip in f:
                        if ip[0] == '#':
                            break
                        if len(ip) == 0:
                            break
                        myqueue.put(ip)
                    f.close()
                    for x in xrange(0,myqueue.qsize()):
                        if myqueue.empty():
                            break
                        mutex = threading.Lock()
                        mutex.acquire()
                        threads.append(threading.Thread(target=webmonitor().sftp, args=(myqueue.get(),22,"root", lpath, rpath)))
                        mutex.release()
                    for t in threads:
                        t.start()
                    for t in threads:
                        t.join()
                    print '========================================================================='
        elif sys.argv[1] == "-C":#执行命令模式
            for o, value in opts:
                if o in ("-C","--COMMAND"):
                    print "MODE: COMMAND"
                elif o in ("-H","--host"):
                    host = value
                elif o in ("-f","--file"):
                    filein = value
                elif o in ("-c","--command"):
                    cmd = value
                if isset('host') and isset('cmd'):#单台服务器执行命令
                    webmonitor().ssh(host, 22, "root", cmd)
                elif isset('filein') and isset('cmd'):#多台服务器批量执行命令
                    threads = []
                    myqueue = Queue.Queue(maxsize = 0)
                    f = open(filein, "r")
                    for ip in f:
                        if ip[0] == '#':
                            break
                        if len(ip) == 0:
                            break
                        myqueue.put(ip)
                    f.close()
                    for x in xrange(0,myqueue.qsize()):
                        if myqueue.empty():#判断队列是否为空
                            break
                        mutex = threading.Lock()
                        mutex.acquire()
                        threads.append(threading.Thread(target=webmonitor().ssh, args=(myqueue.get(),22,"root", cmd)))
                        mutex.release()
                    for t in threads:
                        t.start()
                    for t in threads:
                        t.join()
        else:
            print webmonitor().help()
    except:
        print webmonitor().help()

转载请保留固定链接: https://linuxeye.com/program/1407.html

------分隔线----------------------------
标签:Python
栏目列表
推荐内容