python第五十二天---第九周作业 类 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 configparser
2 import os ,sys
3 BASE_DIR=os.path.dirname(os.path.dirname(os.path.abspath(__file__)))#获取相对路径转为绝对路径赋于变量
4 sys.path.append(BASE_DIR)#增加环境变量
5 from core.main import loging
6 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 config
10 #修改个信息 磁盘大小
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 True
105         else:
106             print(‘文件不存在!‘)
107             return False
108     def ssh_run(self,addrs,user,paswd,ports):#ssh
109         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             return
117         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     查看帮助:  helps
136     返回上层:  quit
137     退出程序:  exit
138 ‘‘‘
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             continue
154         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                     continue
166                 if inst==‘helps‘:
167                     print(info_l)
168                     continue
169                 lst.inst_attr(inst)#获取指令
170                 if lst.inst():#指令判断
171                     lst.open_list()#开启线程创建
172                 else:
173                     lst.open_list2()
174                 pass
175         except ValueError as e:
176             print(e)

时间: 2024-10-26 17:45:56

python第五十二天---第九周作业 类 Fabric 主机管理程序的相关文章

类 Fabric 主机管理程序开发

类 Fabric 主机管理程序开发:1. 运行程序列出主机组或者主机列表2. 选择指定主机或主机组3. 选择让主机或者主机组执行命令或者向其传输文件(上传/下载4. 充分使用多线程或多进程5. 不同主机的用户名密码.端口可以不同 代码如下: #-*-coding:utf-8-*- import threadingimport queue,time,os,paramiko #服务器连接信息获取验证def auth_action(): BASE_DIR = os.path.dirname(os.pa

paramiko类Fabric主机管理

环境:Linux python3.5 要求:类 Fabric 主机管理程序开发:1. 运行程序列出主机组或者主机列表2. 选择指定主机或主机组3. 选择让主机或者主机组执行命令或者向其传输文件(上传/下载)4. 充分使用多线程或多进程5. 不同主机的用户名密码.端口可以不同 结构:bin-----| start.py ......启动目录,需配置主机列表core----| main.py ......主目录conf----| config.py ......配置目录 system.ini ...

2017-2018-2 20179205《网络攻防技术与实践》第九周作业

<网络攻防技术与实践>第九周作业 视频学习总结 一.KaliSecurity压力测试工具 ??压力测试通过确定一个系统的瓶颈或者不能接受的性能点,来获得系统能够提供的最大的服务级别的测试.通俗地讲,压力测试是为了测试应用程序的性能会变得不可接受. ??Kali下压力测试工具包含VoIP压力测试.Web压力测试.网络压力测试及无线压力测试. 1.Voip压力测试工具 包括iaxflood和inviteflood 2.web压力测试工具:THC-SSL-DOS ??借助THC-SSL-DOS攻击工

机电传动控制第九周作业(一)

<机电传动控制>第九周作业(一) 1单相桥式晶闸管整流电路仿真 搭建的模型图: 当触发角为pi/4时,仿真结果为: 当触发角为pi/2时:仿真结果为: 触发角为pi/2,电感值为0.01时,仿真结果: 触发角为pi/2,电感值为1时,仿真结果为: 触发角为pi/2,电感值为0.5时,仿真结果: 触发角为pi/4,电感值为0.5时,仿真结果: 2三相六脉波桥式晶闸管整流电路仿真 搭建的电路图: 触发角为0,仿真结果: 触发角为pi/4,仿真结果: 触发角为pi/2,仿真结果: 触发角为0,电感为

机电传动控制作业第九周作业补充

机电传动控制作业第九周作业补充: 手绘波形图: 3. 直流电机开环调压调速系统模型搭建 搭建的电路图: 仿真结果之一: 问题: 我按照上图所示的电路进行仿真时,在调节电源电压的大小和触发角时,发现很难调节到使电机转速刚好在额定转速下运行,尤其在引入电感后,更加难以调节.所以我想问下老师我这个电路图搭建的有没有问题?我需要从何处改进呢?

python之路——作业:类Farbic主机管理程序(仅供参考)

一.作业需求 1. 运行程序列出主机组或者主机列表2. 选择指定主机或主机组3. 选择让主机或者主机组执行命令或者向其传输文件(上传/下载)4. 充分使用多线程或多进程5. 不同主机的用户名密码.端口可以不同 二.实现功能 1.创建主机2.运行程序列出主机列表3.选择指定主机或主机组4.选择让主机或主机组执行命令或传输文件5.充分使用多线程注意:新用户使用本程序1.创建主机------->需根据自己现已开启的主机创建主机,将主机信息以文件的形式保存下来: 2.连接主机------->根据用户创

2017-2018-1 20179205《Linux内核原理与设计》第九周作业

<Linux内核原理与设计>第九周作业 视频学习及代码分析 一.进程调度时机与进程的切换 不同类型的进程有不同的调度需求,第一种分类:I/O-bound 会频繁的进程I/O,通常会花费很多时间等待I/O操作的完成:CPU-bound 是计算密集型,需要大量的CPU时间进行运算,使得其他交互式进程反应迟钝,因此需要不同的算法来使系统的运行更高效,以及CPU的资源最大限度的得到使用.第二种分类包括批处理进程(batch process):实时进程(real-time process)以及交互式进程

孤荷凌寒自学python第五十二天初次尝试使用python读取Firebase数据库中记录

(完整学习过程屏幕记录视频地址在文末) 今天继续研究Firebase数据库,利用google免费提供的这个数据库服务,今天主要尝试使用firebase_admin模块来连接firebase数据库. 获得成功. 一.简单总结下今天对firebase_admin模块对象的学习 (一)要通过firebase_admin模块连接到firebase数据库,那么必须要拥有一个从firebase网站上自己的数据库的[用户和权限]处设置的'连接私钥'等相关信息的一个json文件,并下载到项目文件夹中来. (二)

马哥2016全新Linux+Python高端运维班第九周作业

1.详细描述一次加密通讯的过程,结合图示最佳. SSL协议基础: SSL协议位于TCP/IP协议与各种应用层协议之间,本身又分为两层: 1)SSL记录协议:建立在可靠传输层协议(TCP)之上,为上层协议提供数据封装.压缩.加密等基本功能. 2)SSL握手协议:在SSL记录协议之上,用于实际数据传输前,通讯双方进行身份认证.协商加密算法.交换加密密钥等. SSL协议通信过程: 1)浏览器发送一个连接请求给服务器:服务器将自己的证书(包含服务器公钥S_PuKey).对称加密算法种类及其他相关信息返回