zoukankan      html  css  js  c++  java
  • python写的批量操作远程主机脚本(命令执行,上传、下载文件)

    最近在学习python,借助fabric模块写了个批量操作服务器的脚本,在此分享给大家,如有不足之处,欢迎大家指正

    准备工作:

    安装python 2.6.5:

    yum -y install readline*

    tar xf Python-2.6.5.tar.bz2

    cd Python-2.6.5

    将目录下Modules/Setup.dist文件中"readline readline.c -lreadline -ltermcap"行前的注释去掉

    编译安装:

    ./configure --enable-shared

    make -j8 && make install

    安装setuptools

    tar xf setuptools-0.6c11.tar.gz

    cd setuptools-0.6c11

    python setup.py install

    安装fabric

    执行安装时,软件会自动从网上查找依赖的安装包并进行安装

    tar xf fabric-0.9rc2.tar.gz

    cd goosemo-fabric-1eacbf2

    python setup.py install

    ############################################################################

    pyssh脚本:

    #!/usr/bin/env python
    # -*- coding: utf-8 -*-

    #####################################################
    # Author: mayulin – mayulin@cy2009.com
    # Last modified: 2011-04-28 12:27
    # Filename: pssh.py
    #####################################################

    from fabric.api import env,run,put,get
    from os import path
    from re import findall
    from sys import argv
    from fabric.context_managers import hide
    from time import sleep

    USER='root'
    HOST,IP_LIST=[],[]
    PORT='22'
    PRI_KEY,PASSWORD,CMD,uSRC,uDST,dSRC,dDST='','','','','','',''
    timeout=1

    for i in range(1,len(argv)+1):
        if argv[i-1] == '-h' or len(argv)==1:
                print """
                USAGE:
           -u [user]       Use this argument to specify the user,default is 'root'
           -H [host]       The host that you want to connect
           -f [file]       The file content multiple ip address you want to connect
           -P [port]       The ssh port,default is 22
           -p [pwd|file]   You can specify password or a priviate key file to connect the host
           -c [command]    The command you want the host(s) to run
           -U [src,dst]    The local file that you want to upload to the remote host(s)
           -D [src,dst]    The remote file that you want to download to the local host
           -t [timeout]    The program running timeout,default is 1(s)
           -h              Print this help screen
                """

        if argv[i-1] == '-u':
                USER=argv[i]
                env.user='%s'%(USER)
        else:
                env.user='%s'%(USER)
        if argv[i-1] == '-H':
            arg=findall('(\d+\.\d+\.\d+\.\d+|\s+\.{3,4})',argv[i])
            for j in arg:
                if type(j).__name__ !='NoneType':
                    HOST.append(j)
                else:
                    print 'The HostIP input error'
        if argv[i-1] == '-P':
            PORT=argv[i]
        if argv[i-1] == '-f':
            if path.isfile('%s'%(argv[i])) == True:
                IP_LIST=open('%s'%(argv[i]),'r').readlines()
        if argv[i-1] == '-p':
            if path.isfile(argv[i]) == True:
                PRI_KEY=argv[i]
                env.key_filename='%s'%(PRI_KEY)
            else:
                PASSWORD=argv[i]
                env.password='%s'%(PASSWORD)
        if argv[i-1] == '-c':
            CMD=argv[i]
        if argv[i-1]=='-t':                                                                                       
            timeout=argv[i]  

        SLP='sleep %s'%(timeout)

        if argv[i-1] == '-U':
            x=src=argv[i].split(',')
            uSRC=x[0]
            uDST=x[1]

        if argv[i-1] == '-D':
            y=src=argv[i].split(',')
            dSRC=y[0]
            dDST=y[1]           

    else:
        IP_PORT=[]
        if len(IP_LIST)!=0:
            for k in IP_LIST:
                IP_PORT.append(k.strip()+':'+PORT)
        if len(HOST)!=0:
            for k in HOST:
                IP_PORT.append(k.strip()+':'+PORT)
    if CMD != '':
        def command():
                with hide('running'):
                    run("%s;%s" %(CMD,SLP))
        for ip in IP_PORT:
            env.host_string=ip

            print "Execute command : \"%s\" at Host : %s" %(CMD,ip.split(':')[0])
            print "-------------------------------------------------"
            command()
            print "-------------------------------------------------"
        
    if uSRC and uDST !='':
        def upload():
            with hide('running'):
                put("%s" %(uSRC),"%s" %(uDST))
        for ip in IP_PORT:
                env.host_string=ip
                print "Upload local file : \"%s\" to Host : %s \"%s\"" %(uSRC,ip.split(':')[0],uDST)
                print "-------------------------------------------------"
                upload()
                print "-------------------------------------------------"
                
    if dSRC and dDST !='':
        def download():
            with hide('running'):
                get("%s" %(dSRC),"%s" %(dDST))
        for ip in IP_PORT:
            env.host_string=ip
                print "Download remote file : \"%s\" from Host : %s to local \"%s\"" %(dSRC,ip.split(':')[0],dDST)
                print "-------------------------------------------------"
                download()
                print "-------------------------------------------------"
     

    ###########################################################################################

    脚本执行效果:

    显示帮助:

    clip_image002

    在多个远程主机上执行shell命令:

    clip_image004

    clip_image006

    将远程主机上的文件下载到本地目录:

    clip_image008

    将本地文件上传到多个远程主机上

    clip_image010

    本文出自 “梦~从这里起航” 博客,请务必保留此出处http://mayulin.blog.51cto.com/1628315/555459

  • 相关阅读:
    C#中的Dictionary的使用
    关于加密和解密的方法
    单链表逆置
    稀疏矩阵存储
    数组内存地址
    堆和栈的区别
    vc++6.0快捷键
    springMvc-02
    SpringMvc-01
    数据库字段设置问题,具体问题具体分析
  • 原文地址:https://www.cnblogs.com/chenjianhong/p/4145051.html
Copyright © 2011-2022 走看看