python10作业思路及源码:类Fabric主机管理程序开发(仅供参考)
类Fabric主机管理程序开发
一,作业要求
1, 运行程序列出主机组或者主机列表(已完成)
2,选择指定主机或主机组(已完成)
3,选择主机或主机组传送文件(上传/下载)(已完成)
4,充分使用多线程或多进程(已完成)
5,不同主机的用户名,密码,端口可以不同(已完成)
6,可向主机或主机组批量发布命令(已完成)
7,可一次性执行多条操作命令(已完成)
二,程序文件清单

三,程序流程简图

四,程序测试样图





五,程序核心源码
#!usr/bin/env python
# -*- coding:utf-8 -*-
# auther:Mr.chen
# 描述:只能运行在MacOS或linux系统下 import os,sys,pickle,time
import paramiko,threading sys.path.append('..')
PATH = os.path.dirname(os.path.abspath(__file__))
PUT_PATH = PATH.replace('core','Folder/')
GET_PATH = PATH.replace('core','download/')
CONF_PATH = PATH.replace('core','conf/')
semaphore = threading.BoundedSemaphore(1) # 进程锁 def new_Host():
while True:
hostname = raw_input("请输入服务器的主机名(输入n=返回上级):")
if os.path.exists(CONF_PATH+hostname+'_conf'):
print ("主机名已存在,请重新输入!")
continue
if hostname =='n':
return
port = raw_input("请输入服务器的ssh端口号(输入n=返回上级):")
if port == 'n':
return
username = raw_input("请输入登陆的用户名(输入n=返回上级):")
if username == 'n':
return
password = raw_input("请输入用户的密码(输入n=返回上级):")
if password == 'n':
return
dic = {
'hostname':hostname, # 主机名
'port':port, # 端口
'username':username, # 用户名
'password':password, # 密码
'status':0 # 状态(0:未激活 1:已激活 2:激活失败)
}
if os.path.isdir(GET_PATH + hostname) == False:
command = 'mkdir ' + GET_PATH + hostname
os.system(command)
re = hostmessage_Write(dic)
if re == True:
return
else:
print ("主机信息存储失败,请检查原因!") def delete_Host():
List = Traverse_folder()
while True:
dic = {}
num = 0
print ("已存在的主机列表如下:")
for i in List:
print ("{0},主机名:{1}".format(str(num+1),i))
dic[str(num+1)] = i
num += 1
choose = raw_input("请输入你想删除的主机索引(输入n=返回上级):")
if choose == 'n':
return
elif choose in dic:
hostname = dic[choose]
command = 'rm -f '+CONF_PATH+hostname+'_conf'
os.system(command)
print ("删除成功!")
break
else:
print ("您的输入有误!") def auto_activeHost():
text = """
警告!程序准备开启多线程模式激活主机,请确保:
1,远程服务器处于开启状态
2,DNS或本地hosts映射能够解析远程服务器主机名
"""
while True:
print (text)
choose = raw_input("是否确定开始激活远程主机(y/n)?:")
if choose == 'n':
return
elif choose == 'y':
break
else:
print ("你的输入有误!")
print ("程序开始自动激活远程主机,请稍后...")
List = Traverse_folder()
if len(List) == 0:
print ("请先创建主机!")
return
for i in List:
dic = hostmessage_Read(i)
t = threading.Thread(target=auto_Active,args=(dic,)) # 创建多线程对象
t.setDaemon(True) # 将对象设置为守护线程
t.start() # 线程开启
while threading.activeCount() != 1: # 当前活跃的线程数
pass
else:
print ("所有主机激活完毕!")
time.sleep(2) def auto_Active(dic):
ssh = paramiko.SSHClient() # 创建ssh对象
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) #允许连接不在know_hosts文件中的主机
try:
ssh.connect(hostname=dic['hostname'],port=int(dic['port']),username=dic['username'],password=dic['password'],timeout=10)
except Exception,e:
print ("主机名:{0}的主机激活失败!失败原因:{1}".format(dic['hostname'],e))
dic['status'] = 2
hostmessage_Write(dic)
else:
print ("主机名:{0}的主机激活成功!".format(dic['hostname']))
dic['status'] = 1
hostmessage_Write(dic)
finally:
ssh.close() def remote_Host():
List = Traverse_folder(key='status',value=1)
if len(List) == 0:
print ("请先激活主机!")
return
while True:
dic = {}
print ("已激活主机如下:")
num = 0
for i in List:
print ("{0},主机名:{1}".format(str(num+1),i))
dic[str(num+1)] = i
num += 1
choose = raw_input("请输入你想操控的主机的索引(可多选,n=返回上级):")
if choose == 'n':
return
choose = list(set(choose)) #去重复
if set(choose) & set(dic.keys()) == set(choose):
LIST = []
for i in choose:
LIST.append(dic[i])
remote_Host_control(LIST)
else:
print ("您的输入有误!") def remote_Host_control(List):
help = """
help帮助提示:
1.程序的Folder目录是本地文件目录
2,输入put向远程主机上传文件
3,输入get向远程主机下载文件
4,输入其他直接向远程主机发布命令
"""
while True:
print ("正在操控{0}台主机,如下:".format(len(List)))
for i in List:
print ("主机名:{0}".format(i))
command = raw_input("请输入你想执行的命令(输入n=返回上级,输入help获取帮助):>>")
if command == 'n':
return
elif command == 'help':
print help
elif command == 'get':
print ("程序准备下载文件...")
remote_path = raw_input("请输入想要下载的远程服务器文件绝对路径(例如:/etc/hosts):")
LIST = remote_path.split('/')
filename = LIST[len(LIST)-1]
for i in List:
local_path = GET_PATH + i + '/'+filename
t = threading.Thread(target=get_Method,args=(i,[remote_path,local_path]))
t.setDaemon(True)
t.start()
while threading.activeCount() != 1:
pass
else:
print ("命令执行完毕!")
elif command == 'put':
print ("程序准备上传文件...")
while True:
filename = raw_input("请输入想上传的文件的文件名:")
if os.path.exists(PUT_PATH+filename) == False:
print ("文件没有找到,请重新输入!")
continue
local_path= PUT_PATH+filename
remote_path = raw_input("你想将文件保存到远程服务器的哪里?(例如:/etc/):")
remote_path = remote_path + '/' + filename
for i in List:
t = threading.Thread(target=put_Method, args=(i, [local_path,remote_path]))
t.setDaemon(True)
t.start()
while threading.activeCount() != 1:
pass
else:
print ("命令执行完毕!")
break
else:
for i in List:
t = threading.Thread(target=execute_Command,args=(i,command))
t.setDaemon(True)
t.start()
while threading.activeCount() != 1:
pass
else:
print ("命令执行完毕!") def put_Method(hostname,Path):
dic = hostmessage_Read(hostname)
transport = paramiko.Transport((hostname, int(dic['port'])))
try:
transport.connect(username=dic['username'], password=dic['password'])
sftp = paramiko.SFTPClient.from_transport(transport)
sftp.put(Path[0], Path[1])
except Exception, e:
print ("主机名:{0},上传失败!错误原因:{1}".format(hostname, e))
else:
pass
finally:
transport.close() def get_Method(hostname,Path):
dic = hostmessage_Read(hostname)
transport = paramiko.Transport((hostname,int(dic['port'])))
try:
transport.connect(username=dic['username'],password=dic['password'])
sftp = paramiko.SFTPClient.from_transport(transport)
sftp.get(Path[0],Path[1])
except Exception,e:
print ("主机名:{0},下载失败!错误原因:{1}".format(hostname,e))
else:
pass
finally:
transport.close() def execute_Command(hostname,command):
dic = hostmessage_Read(hostname)
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
try:
ssh.connect(hostname=hostname,port=int(dic['port']),username=dic['username'],password=dic['password'])
command_list = command.strip().split(';')
except Exception,e:
semaphore.acquire() # 线程锁开启
print ("主机:{0}连接出现异常:{1}".format(hostname,e))
semaphore.release() # 线程锁释放
return
for com in command_list:
stdin, stdout, stderr = ssh.exec_command(com)
error = stderr.read()
output = stdout.read()
semaphore.acquire() # 线程锁开启
if len(error) != 0:
print ("主机:{0} 执行{1}命令时出错:{2}".format(hostname,com, error))
if len(output) != 0:
print ("主机:{0},执行{1}命令的结果如下:".format(hostname,com))
print (output)
semaphore.release() # 线程锁释放 def Traverse_folder(key = None,value = None):
'''
根据条件遍历某文件夹里的全部文件内容,
找出符合条件的文件返回包含主机名的列表
如果无条件,则返回包含所有主机名的列表
:return:LIST
'''
LIST = []
List = os.listdir(CONF_PATH)
for i in List:
if i == '__init__.py' or i == '__init__.pyc':
continue
else:
with open(CONF_PATH+i,'r') as f:
dic = pickle.load(f)
if key != None:
if dic[key] == value:
LIST.append(dic['hostname'])
else:
LIST.append(dic['hostname'])
return LIST def hostmessage_Write(dic):
with open(CONF_PATH+dic['hostname']+'_conf','w') as f:
pickle.dump(dic,f)
return True def hostmessage_Read(hostname):
if os.path.exists(CONF_PATH+hostname+'_conf'):
with open(CONF_PATH+hostname+'_conf','r') as f:
dic = pickle.load(f)
return dic def Main():
text = """
欢迎来到Fabric主机管理界面
1,创建主机
2,删除主机
3,自动激活所有主机
4,开始远程操控
5,退出程序
"""
while True:
print text
choose = raw_input("请输入你的选择:")
dic = {'1':new_Host,'2':delete_Host,'3':auto_activeHost,'4':remote_Host,'5':Exit}
if choose in dic:
dic[choose]()
else:
print ("你的输入有误!") def Exit():
print ("程序退出!")
exit() if __name__ == "__main__":
Main()
python10作业思路及源码:类Fabric主机管理程序开发(仅供参考)的更多相关文章
- python作业类Fabric主机管理程序开发(第九周)
作业需求: 1. 运行程序列出主机组或者主机列表 2. 选择指定主机或主机组 3. 选择让主机或者主机组执行命令或者向其传输文件(上传/下载) 4. 充分使用多线程或多进程 5. 不同主机的用户名密码 ...
- python 学习分享-实战篇类 Fabric 主机管理程序开发
# 类 Fabric 主机管理程序开发: # 1. 运行程序列出主机组或者主机列表 # 2. 选择指定主机或主机组 # 3. 选择让主机或者主机组执行命令或者向其传输文件(上传/下载) # 4. 充分 ...
- 类 Fabric 主机管理程序开发
类 Fabric 主机管理程序开发:1. 运行程序列出主机组或者主机列表2. 选择指定主机或主机组3. 选择让主机或者主机组执行命令或者向其传输文件(上传/下载4. 充分使用多线程或多进程5. 不同主 ...
- Python09作业思路及源码:高级FTP服务器开发(仅供参考)
高级FTP服务器开发 一,作业要求 高级FTP服务器开发 用户加密认证(完成) 多用户同时登陆(完成) 每个用户有不同家目录且只能访问自己的家目录(完成) 对用户进行磁盘配额,不同用户配额可不同(完成 ...
- 从零开始学Python04作业源码:模拟ATM电子银行(仅供参考)
bin目录:程序启动入口 ATM_start.py: #!/usr/bin/python # -*- coding: utf-8 -*- # 模拟ATM电子银行+登录账户权限控制+管理员管理模块 # ...
- python第五十二天---第九周作业 类 Fabric 主机管理程序
类 Fabric 主机管理程序开发:1. 运行程序列出主机组或者主机列表2. 选择指定主机或主机组3. 选择让主机或者主机组执行命令或者向其传输文件(上传/下载)4. 充分使用多线程或多进程5. 不同 ...
- MYSQL 排行类的相关SQL写法,仅供参考
SELECT * FROM () )) b
- paramiko类Fabric主机管理
环境:Linux python3.5 要求:类 Fabric 主机管理程序开发:1. 运行程序列出主机组或者主机列表2. 选择指定主机或主机组3. 选择让主机或者主机组执行命令或者向其传输文件(上传/ ...
- JMeter5.4.1源码IDEA构建&二次开发(实战)
JMeter5.4.1源码IDEA构建&二次开发(实战) 目录 JMeter5.4.1源码IDEA构建&二次开发(实战) 1.下载源码 2.导入IDEA 2.1 先设置Gradle目录 ...
随机推荐
- 异步任务队列Celery在Django中的使用
前段时间在Django Web平台开发中,碰到一些请求执行的任务时间较长(几分钟),为了加快用户的响应时间,因此决定采用异步任务的方式在后台执行这些任务.在同事的指引下接触了Celery这个异步任务队 ...
- 关于ubuntu实机与虚机互相copy
我的开发环境是在ubuntu上的,但是ubuntu上没有官方支持的QQ,有些不太方便,所以在上面虚了一个Win7(先是win10,但是win10最新版本太坑了,不说了),不过经常会出现复制文件,或者文 ...
- 微信小程序开发心得
微信小程序也已出来有一段时间了,最近写了几款微信小程序项目,今天来说说感受. 首先开发一款微信小程序,最主要的就是针对于公司来运营的,因为,在申请appid(微信小程序ID号)时候,需要填写相关的公司 ...
- 08.LoT.UI 前后台通用框架分解系列之——多样的Tag选择器
LOT.UI分解系列汇总:http://www.cnblogs.com/dunitian/p/4822808.html#lotui LoT.UI开源地址如下:https://github.com/du ...
- [原] Cgroup CPU, Blkio 测试
关于Cgroup的简单测试 [toc] 简单介绍Cgroup (如果对cgroup熟悉可以忽略) 一般情况下,cgroup挂载到一个虚拟文件目录,然后可以通过文件系统的API对其操作. ># m ...
- SAP CRM 性能小技巧
导言 本页面打算收集SAP CRM实施中可以用于避免性能问题的注意事项,重要的事项会由图标标识. 如果你有其他的技巧想要说出来,别犹豫! 性能注意事项 通用 缓存读取类访问,特别是在性能关键的地方,比 ...
- REGEX例子
作为REGEX的例子,代码9.3显示了一个给定的文件有多少行,具有给定的模式,通过命令行输入(注:有更有效率的方式来实现这个功能,如Unix下的grep命令,在这里只是给出了另一种方式).这个程序像下 ...
- MemoryMappedFile 在 Mono in Linux 的开发笔记
前言 MemoryMappedFile(简称MMF)类是.NET中对内存映射文件进行操作的类,内存映射文件是非常高效的本地IO方案,由操作系统提供内存与IO文件之间的映射转换,对内存映射文件的更改由操 ...
- mysql集群(主从)
本文主要记录mysql 主从配置. 经典的原理图 0.环境: 采用阿里云ECS服务器,同区同配置,操作系统为ubuntus 14 64位,服务器如下: 服务器A: 内网IP: 10.44.94.219 ...
- Redis集群案例与场景分析
1.背景 Redis的出现确实大大地提高系统大并发能力支撑的可能性,转眼间Redis的最新版本已经是3.X版本了,但我们的系统依然继续跑着2.8,并很好地支撑着我们当前每天5亿访问量的应用系统.想当年 ...