分享关于类 Fabric 主机管理程序开发的实例
类 Fabric 主机管理程序开发:
1. 运行程序列出主机组或者主机列表
2. 选择指定主机或主机组
3. 选择让主机或者主机组执行命令或者向其传输文件(上传/下载)
4. 充分使用多线程或多进程
5. 不同主机的用户名密码、端口可以不同
README
类 Fabric 主机管理程序 执行命令(SSH) 向其传输文件(上传/下载) Fabric/#程序目录 |- - -__init__.py |- - -bin/#启动目录 | |- - -__init__.py | |- - -Fabric_start.py#视图启动 | |- - -user_reg.py#主机添加启动 | |- - -cfg/#配置目录 | |- - -__init__.py | |- - -config.py#配置文件 | |- - -core/#下载文件目录 | |- - -__init__.py | |- - -main.py#主要逻辑 类 | |- - -db/#主机列表文件目录 | |- - - | |- - -get_file/#下载文件目录 | | |- - -put_file/#上传文件目录 |- - -REDMAE
Fabric/#程序目录 |- - -__init__.py |- - -bin/#启动目录 | |- - -__init__.py | |- - -Fabric_start.py#视图启动


1 import configparser2 import os ,sys3 BASE_DIR=os.path.dirname(os.path.dirname(os.path.abspath(__file__)))#获取相对路径转为绝对路径赋于变量4 sys.path.append(BASE_DIR)#增加环境变量5 from core.main import loging6 if __name__ == '__main__':7 8 loging()
| |- - -user_reg.py#主机添加启动


1 #!usr/bin/env python 2 #-*-coding:utf-8-*- 3 # Author calmyan 4 5 import configparser 6 import os ,sys 7 BASE_DIR=os.path.dirname(os.path.dirname(os.path.abspath(__file__)))#获取相对路径转为绝对路径赋于变量 8 sys.path.append(BASE_DIR)#增加环境变量 9 from cfg import config10 #修改个信息 磁盘大小11 def set_info(gr_name,addse,name,pwd,ports):12 config_info=configparser.ConfigParser()#读数据13 file_dir='%s%s'%(config.AUTH_FILE,gr_name)#主机组用户名密码文件路径14 15 config_info[addse]={}#ip 主机16 config_info.set(addse,config.USER,name)#用户17 config_info.set(addse,config.PWD,pwd)#密码18 config_info.set(addse,config.PORTS,ports)#端口19 with open(file_dir,'a') as f:20 config_info.write(f)#写入文件21 #config_info.write(open(file_dir,'a'))#写入文件22 print('创建完成'.center(60,'='))23 print('组:【%s】\nIP:[%s]\n用户名:[%s]\n密码:[%s]\n端口:[%s]'%(gr_name,addse,name,pwd,ports))24 25 if __name__ == '__main__':26 gr_name=input('组名:')#组27 addse=input('IP地址:')#ip地址28 name=input('用户名:')#用户29 pwd=input('密码:')#密码30 ports=input('端口:')#端口31 32 set_info(gr_name,addse,name,pwd,ports)
|- - -cfg/#配置目录 | |- - -__init__.py |- - -config.py#配置文件


1 #!usr/bin/env python 2 #-*-coding:utf-8-*- 3 # Author calmyan 4 5 import configparser 6 import os ,sys 7 BASE_DIR=os.path.dirname(os.path.dirname(os.path.abspath(__file__)))#获取相对路径转为绝对路径赋于变量 8 sys.path.append(BASE_DIR)#增加环境变量 9 10 AUTH_FILE='%s/db/'%BASE_DIR#主机组 信息用户名密码文件路径11 FILE_DIR='%s/put_file'%BASE_DIR#要上传文件所在的目录12 GET_FILE_DIR='%s/get_file'%BASE_DIR#要上传文件所在的目录13 #print(AUTH_FILE)14 PWD='pwd'#密码15 USER='user'16 PORTS='ports'17 INST_LIST=['put','get']#指令列表18 19 PUT='put'20 GET='get'
|- - -core/#下载文件目录 | |- - -__init__.py | |- - -main.py#主要逻辑 类


1 #!usr/bin/env python 2 #-*-coding:utf-8-*- 3 # Author calmyan 4 5 import configparser 6 import os ,sys 7 import threading,time 8 import paramiko,queue 9 BASE_DIR=os.path.dirname(os.path.dirname(os.path.abspath(__file__)))#获取相对路径转为绝对路径赋于变量 10 sys.path.append(BASE_DIR)#增加环境变量 11 from cfg import config 12 13 class Fabric_gr(object): 14 def __init__(self,gr_name):#组名 15 self.gr_name='%s%s'%(config.AUTH_FILE,gr_name)#主机组用户名密码文件路径 16 self.config_info=configparser.ConfigParser()#读数据对象 17 self.name_l=[]#定义一个列表 18 self.attr=[] 19 self.file_dir=''#上传文件路径 20 self.get_file=''#下载传文件路径 21 22 def group_open(self):#打开组文件 23 self.config_info.read(self.gr_name)#读取文件 24 for i in range(len(self.config_info.sections())): 25 self.name_l.append(self.config_info.sections()[i])#信息添加到列表 26 else: 27 print('主机列表:'.center(40,'=')) 28 for i in self.name_l: 29 print(('[%s]'%i).center(40,' ')) 30 31 def inst_attr(self,inst):#获取指令 32 self.instruction=inst 33 self.attr=self.instruction.split() 34 self.inst_a=self.attr[0] 35 36 def inst(self):#指令判断 37 if self.inst_a in config.INST_LIST: 38 return True 39 else: 40 return False 41 42 def open_list(self):#创建 线程 方法 43 if self.inst_a==config.PUT: 44 if self.File_Dir():#查找本地文件 45 pass 46 else: 47 return 48 self.re_lilst=[]#定义一个列表 49 for j in range(len(self.name_l)): 50 sttr=self.config_info.sections()[j]#获取到对象 51 user_dict={}#创建一个空字典 52 for i,v in self.config_info[sttr].items():#可以循环输出 获ip 用户 密码 端口 53 user_dict[i]=v 54 sttr=threading.Thread(target=self.thr_run,args=(sttr,user_dict[config.USER],user_dict[config.PWD],int(user_dict[config.PORTS])))#创建新线程 55 sttr.start()#启动线程 56 self.re_lilst.append(sttr)#不用JOIN,避免阻塞为串行 57 else: 58 for i in self.re_lilst:#等待线程 完成 59 i.join() 60 61 def open_list2(self):#创建 线程 方法 62 self.re_lilst=[]#定义一个列表 63 for j in range(len(self.name_l)): 64 sttr=self.config_info.sections()[j]#获取到对象 65 user_dict={}#创建一个空字典 66 for i,v in self.config_info[sttr].items():#可以循环输出 获ip 用户 密码 端口 67 user_dict[i]=v 68 sttr=threading.Thread(target=self.ssh_run,args=(sttr,user_dict[config.USER],user_dict[config.PWD],int(user_dict[config.PORTS])))#创建新线程 69 sttr.start()#启动线程 70 self.re_lilst.append(sttr)#不用JOIN,避免阻塞为串行 71 else: 72 for i in self.re_lilst:#等待线程 完成 73 i.join() 74 75 76 def thr_run(self,addrs,user,paswd,ports):#传输通道 77 try: 78 transport=paramiko.Transport((addrs,ports))#传输模块 Transport 服务器地址 端口 79 transport.connect(username=user,password=paswd)#用户名,,密码 80 sftp=paramiko.SFTPClient.from_transport(transport)#调用传输方法 81 print('[%s]连接成功!'%addrs) 82 self.file_dir='%s/%s'%(config.FILE_DIR,self.attr[1])#上传文件路径 83 if self.inst_a==config.PUT: 84 sftp.put(self.file_dir,self.attr[2])#上传文件 ,本地路径文件 ,服务器的路径文件 85 print('【%s】文件上传完成!'%addrs) 86 elif self.inst_a==config.GET: 87 self.get_file='%s/%s_%s'%(config.GET_FILE_DIR,addrs,self.attr[2])#下载文件路径 88 print(self.get_file) 89 sftp.get(self.attr[1],self.get_file)#下载文件 ,服务器的路径文件 ,本地路径文件 90 print('【%s】文件下载完成!'%addrs) 91 else: 92 print('【%s】文件相关操作失败!'%addrs) 93 pass 94 except Exception as e: 95 print(e) 96 97 def File_Dir(self):#判断文件是否存在 98 file=self.attr[1] 99 100 print(file)101 self.file_dir='%s/%s'%(config.FILE_DIR,file)#文件路径102 if os.path.isfile(self.file_dir):103 print('成功找到文件!')104 return True105 else:106 print('文件不存在!')107 return False108 def ssh_run(self,addrs,user,paswd,ports):#ssh109 ssh =paramiko.SSHClient()#创建一个SSH连接对象110 ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())#允许连接不在KNOV_HOSTs文件中的主机 自动添加111 try:112 ssh.connect(hostname=addrs,port=ports,username=user,password=paswd)#连接,主机 端口 用户名 密码113 print('[%s]连接成功!'%addrs)114 except Exception as e:115 print(e)116 return117 stdin,stdout,stderr=ssh.exec_command(self.instruction)#.exec_command 为执行命令,返回结果 ,标准输入,标准输出,标准错误,错误与输出只会返回其一118 result=stdout.read()#获取结果119 try:120 if len(result)<1:#如果为空 返回错误信息121 result=stderr.read()122 print(addrs.center(60,'='))123 print(result.decode())124 else:125 print(addrs.center(60,'='))126 print(result.decode())127 except Exception as e:128 print(e)129 130 131 info_l='''--------指令帮助--------132 上传文件: put file /home/tmp/file (指令 本地文件 服务端位置文件)133 下载文件: get /home/tmp/file file (指令 服务端位置文件 本地文件)134 其他指令: ssh相关命令 如 df pwd ifconfig ls等135 查看帮助: helps136 返回上层: quit137 退出程序: exit138 '''139 140 141 def loging():142 print(info_l)143 while True:144 s=os.listdir(config.AUTH_FILE)145 print('主机组'.center(60,'='))146 for i,v in enumerate(s):147 print('编号:%s 组名:%s'%(i,v))148 gr_name=input('选择组:')149 if gr_name=='exit':150 exit()151 if gr_name=='helps':152 print(info_l)153 continue154 try:155 gr_file=s[int(gr_name)]156 157 lst=Fabric_gr(gr_file)#实例连接158 lst.group_open()#打开159 while True:160 #print(info_l)161 inst=input('指令>>>:')162 if inst=='exit':163 exit()164 if inst=='quit':165 continue166 if inst=='helps':167 print(info_l)168 continue169 lst.inst_attr(inst)#获取指令170 if lst.inst():#指令判断171 lst.open_list()#开启线程创建172 else:173 lst.open_list2()174 pass175 except ValueError as e:176 print(e)
以上是分享关于类 Fabric 主机管理程序开发的实例的详细内容。更多信息请关注PHP中文网其他相关文章!

热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

AI Hentai Generator
免费生成ai无尽的。

热门文章

热工具

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3汉化版
中文版,非常好用

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

C语言中没有内置求和函数,需自行编写。可通过遍历数组并累加元素实现求和:循环版本:使用for循环和数组长度计算求和。指针版本:使用指针指向数组元素,通过自增指针遍历高效求和。动态分配数组版本:动态分配数组并自行管理内存,确保释放已分配内存以防止内存泄漏。

Python和JavaScript开发者的薪资没有绝对的高低,具体取决于技能和行业需求。1.Python在数据科学和机器学习领域可能薪资更高。2.JavaScript在前端和全栈开发中需求大,薪资也可观。3.影响因素包括经验、地理位置、公司规模和特定技能。

distinct 和 distinguish 虽都与区分有关,但用法不同:distinct(形容词)描述事物本身的独特性,用于强调事物之间的差异;distinguish(动词)表示区分行为或能力,用于描述辨别过程。在编程中,distinct 常用于表示集合中元素的唯一性,如去重操作;distinguish 则体现在算法或函数的设计中,如区分奇数和偶数。优化时,distinct 操作应选择合适的算法和数据结构,而 distinguish 操作应优化区分逻辑效率,并注意编写清晰可读的代码。

!x 的理解!x 是 C 语言中的逻辑非运算符,对 x 的值进行布尔取反,即真变假,假变真。但要注意,C 语言中真假由数值而非布尔类型表示,非零视为真,只有 0 才视为假。因此,!x 对负数的处理与正数相同,都视为真。

C语言标识符不能包含空格,因为会造成混乱和难以维护。具体规则如下:必须以字母或下划线开头。可包含字母、数字或下划线。不能包含非法字符(如特殊符号)。

C语言中没有内置的sum函数用于求和,但可以通过以下方法实现:使用循环逐个累加元素;使用指针逐个访问并累加元素;对于大数据量,考虑并行计算。

C语言中蛇形命名法是一种编码风格约定,使用下划线连接多个单词构成变量名或函数名,以增强可读性。尽管它不会影响编译和运行,但冗长的命名、IDE支持问题和历史包袱需要考虑。

H5页面需要持续维护,这是因为代码漏洞、浏览器兼容性、性能优化、安全更新和用户体验提升等因素。有效维护的方法包括建立完善的测试体系、使用版本控制工具、定期监控页面性能、收集用户反馈和制定维护计划。
