• python 学习分享-实战篇类 Fabric 主机管理程序开发


    # 类 Fabric 主机管理程序开发:
    # 1. 运行程序列出主机组或者主机列表
    # 2. 选择指定主机或主机组
    # 3. 选择让主机或者主机组执行命令或者向其传输文件(上传/下载)
    # 4. 充分使用多线程或多进程
    # 5. 不同主机的用户名密码、端口可以不同
    import paramiko,threading,pickle,os
    
    Base_path = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
    config_path = Base_path +'/core/config'
    #主机配置信息管理
    list_host = [{'host':'192.168.117.236','port':22,'user':'ubuntu1','password':'ubuntu1','group':1},
                 {'host':'192.168.117.237','port':22,'user':'ubuntu2','password':'ubuntu2','group':1},
                 {'host':'192.168.117.239','port':22,'user':'ubuntu3','password':'ubuntu3','group':2},
                 {'host':'192.168.117.240','port':22,'user':'aaa','password':'bbb','group':2}]
    def pickle_dump(path,file):
        #存入配置文件
        with open(path,'wb') as f:
            pickle.dump(file,f)
    #pickle_dump(config_path,list_host)
    def pickle_load(path):
        #取出配置文件
        with open(path,'rb') as f:
            list_host_new = pickle.load(f)
        return list_host_new
    # list_host_new = pickle_load(config_path)
    # print(list_host_new)
    
    
    class Paramiko_sshd(object):
        #sshd类
        def __init__(self,host,port,user,password):
            self.host = host
            self.port = port
            self.user = user
            self.password = password
    
        def sshd_command(self,command):
            #ssh远程主机执行命令,并返回结果
            try:
                ssh_client = paramiko.SSHClient()
                ssh_client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
                ssh_client.connect(self.host,self.port,self.user,self.password)
                std_in,std_out,std_err = ssh_client.exec_command(command)
                print(self.host.center(30,'*'))
                print(command.upper().center(30,'='))
                for line in std_out:
                    print(line.strip('
    '))
                ssh_client.close()
            except Exception as e:
                print(e)
        def sshd_upload_file(self,server_path,local_path):
            #上传文件
            try:
                t = paramiko.Transport((self.host,self.port))
                t.connect(username=self.user,password=self.password)
                sftp = paramiko.SFTPClient.from_transport(t)
                sftp.put(local_path,server_path)
                t.close()
                print(self.host.center(30, '*'))
                print('上传成功')
            except Exception as e:
                print(e)
        def sshd_down_file(self,server_path,local_path):
            #下载文件
            try:
                t = paramiko.Transport((self.host, self.port))
                t.connect(username=self.user, password=self.password)
                sftp = paramiko.SFTPClient.from_transport(t)
                sftp.get(server_path, local_path)
                t.close()
                print(self.host.center(30, '*'))
                print('下载成功')
            except Exception as e:
                print(e)
    def help():
        #帮助信息
        command_option = input('''
        *************请选择***********
        1.执行命令
        2.上传文件
        3.下载文件
        4.返回
        5.退出程序
        ''').strip()
        return command_option
    
    def review():
        while 1:
            #展示界面
            list_host_new = pickle_load(config_path)
            host_group_1 = []
            host_group_2 = []
            for line in list_host_new:
                if line['group'] == 1:
                    host_group_1.append(line)
                else:
                    host_group_2.append(line)
            print('group-1'.center(30,'='))
            for line_1 in host_group_1:
                print('host:',line_1['host'],'port:',line_1['port'])
            print('group-2'.center(30,'='))
            for line_2 in host_group_2:
                print('host:',line_2['host'],'port:',line_2['port'])
    
            group_select = input('请输入您要操作的主机组:33[1;35m group-1 33[0m | 33[1;35m group-2 33[0m '
                                 '或输入33[1;35mexit33[0m退出程序 ==>').strip()
            if group_select in ['group-1','group-2']:
                if group_select == 'group-1':     #增加中间变量,来确定是对组一操作还是对组二进行操作
                    group_sure = host_group_1
                else:
                    group_sure = host_group_2
                while 1:
                    command_option = help()
                    if command_option == '1':
                        command = input('请输入执行的命令:').strip()
                        for line_3 in group_sure:
                            sshd = Paramiko_sshd(line_3['host'],line_3['port'],line_3['user'],line_3['password'])
                            t = threading.Thread(target=sshd.sshd_command,args=(command,))
                            t.start()
                            t.join()
    
                    elif command_option == '2':
                        server_path = input('请输入上传到的服务器目录:').strip()
                        local_path = input('请输入本地文件目录:').strip()
                        for line_3 in group_sure:
                            sshd = Paramiko_sshd(line_3['host'],line_3['port'],line_3['user'],line_3['password'])
                            t = threading.Thread(target=sshd.sshd_upload_file,args=(server_path,local_path,))
                            t.start()
                            t.join()
    
                    elif command_option == '3':
                        server_path = input('请输入下载的服务器目录文件路径:').strip()
                        local_path = input('请输入存放到本地的路径:').strip()
                        for line_3 in group_sure:
                            sshd = Paramiko_sshd(line_3['host'],line_3['port'],line_3['user'],line_3['password'])
                            t = threading.Thread(target=sshd.sshd_down_file,args=(server_path,local_path,))
                            t.start()
                            t.join()
                    elif command_option == '4':
                        break
                    elif command_option == '5':
                        exit()
                    else:
                        print('%s为非法命令,请重新输入!'%command_option)
            elif group_select == 'exit':
                break
            else:
                print('%s为非法命令,请重新输入!'%group_select)
    
    
    
    if __name__ =='__main__':
        review()
  • 相关阅读:
    Java锁---偏向锁、轻量级锁、自旋锁、重量级锁
    Java自旋锁
    设计模式的原则
    CGLIB介绍与原理(通过继承的动态代理)
    Android Messenger
    Android AIDL的用法
    长连接和短连接和推送
    Java对称加密算法
    Android 热修复技术中的CLASS_ISPREVERIFIED问题
    Java类加载器
  • 原文地址:https://www.cnblogs.com/laay/p/7416914.html
Copyright © 2020-2023  润新知