环境:Linux python3.5

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

bin:
#!/usr/bin/env python
# -*-coding:utf-8-*-
# Author:zh
import os
import sys
import threading
PATH = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
sys.path.append(PATH)
from core import main
from conf import config if __name__ == '__main__':
conf = config.Configuration()
ip_list = eval(conf.get_config()[0][1])
thread = threading.Thread(target=main.main, args=(ip_list,))
thread.start()

start.py

core:

#!/usr/bin/env python
# -*-coding:utf-8-*-
# Author:zh import paramiko
import os
PATH = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))+os.sep+"file"+os.sep class Fabric(object):
'''这个类用来初始化SFTPClient和SSHClient'''
def __init__(self, hostname, port, username, password):
self.hostname = hostname
self.port = port
self.username = username
self.password = password
self.transport = paramiko.Transport((self.hostname, self.port))
self.transport.connect(username=self.username, password=self.password) def command(self, cmd_input):
# 执行命令
ssh = paramiko.SSHClient()
ssh._transport = self.transport
stdin, stdout, stderr = ssh.exec_command(cmd_input)
res, err = stdout.read(), stderr.read()
result = res if res else err
print(result.decode()) def sftp(self, data):
# 上传下载入口
self.sftp = paramiko.SFTPClient.from_transport(self.transport)
data_split = data.split()
sign = data_split[0]
if len(data_split) == 2:
file_path = data_split[1]
if file_path.rfind("/") == -1:
file_name = file_path
else:
file_name = file_path[file_path.rfind("/")+1:]
local_path = PATH+file_name
elif len(data_split) == 3:
if sign == "get":
local_path = data_split[2]
file_path = data_split[1]
if sign == "put":
file_path = data_split[2]
local_path = data_split[1]
else:
local_path = ''
file_path = ''
if hasattr(self, sign):
func = getattr(self, sign)
try:
func(file_path, local_path)
except Exception as e:
print("错误 %s" % e)
else:
print("输入错误")
self.help() def get(self, *args):
# 下载
file_path = args[0]
local_path = args[1]
self.sftp.get(file_path, local_path) def put(self, *args):
# 上传
file_path = args[0]
local_path = args[1]
self.sftp.put(local_path, file_path) @staticmethod
def help(self):
# 展示帮助信息
show = '''
get path local_path ......从path下下载到本地目录
put local_path path ......从本地上传到path目录下
'''
print(show) def close(self):
# 关闭连接
self.transport.close() def logon():
# 登陆,输入端口,用户名,密码
while True:
port = input("请输入端口:")
if not port:
continue
if not port.isdigit():
print("请输入正确的端口")
continue
port = int(port)
name = input("请输入用户名:")
if not name:
continue
pwd = input("请输入密码:")
if not pwd:
continue
return [port, name, pwd] def show(show_list):
'''展示列表给用户选择,并返回选择信息'''
while True:
for value, comment in enumerate(show_list):
print("%s. %s" % (value+1, comment))
choose = input("请选择:")
if not choose:
continue
if choose == "exit":
exit()
try:
choose = int(choose)-1
show_list[choose]
return choose
except (ValueError, IndexError) as e:
print("输入错误:%s ,请重新输入" % e)
continue def main(ip_list):
# 主方法,程序入口
ip_list = ip_list
choose_ip = show(ip_list)
value_list = logon()
port = value_list[0]
name = value_list[1]
pwd = value_list[2]
while True:
action_list = ["执行命令", "上传下载"]
choose_action = show(action_list)
ssh = Fabric(ip_list[choose_ip], port, name, pwd)
if choose_action == 0:
func = ssh.command
else:
func = ssh.sftp
while True:
cmd_input = input("-->")
if not cmd_input:
continue
if cmd_input == 'b':
ssh.close()
break
if cmd_input == 'exit':
exit()
func(cmd_input)

main.py

conf:

#!/usr/bin/env python
# -*-coding:utf-8-*-
# _author_=zh
import os
import configparser
PATH = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) class Configuration(object):
def __init__(self):
self.config = configparser.ConfigParser()
self.name = PATH+os.sep+"conf"+os.sep+"system.ini" def init_config(self):
# 初始化配置文件,ip :客户端IP,port:客户端端口
if not os.path.exists(self.name):
self.config["config"] = {"ip_list":['192.168.200.128', '192.168.200.129', '192.168.200.130']}
self.config.write(open(self.name, "w", encoding="utf-8", )) def get_config(self, head="config"):
'''
获取配置文件数据
:param head: 配置文件的section,默认取初始化文件config的数据
:return:返回head中的所有数据(列表)
'''
self.init_config() # 取文件数据之前生成配置文件
self.config.read(self.name, encoding="utf-8")
if self.config.has_section(head):
section=self.config.sections()
return self.config.items(section[0])

config.py

												

paramiko类Fabric主机管理的更多相关文章

  1. python作业类Fabric主机管理程序开发(第九周)

    作业需求: 1. 运行程序列出主机组或者主机列表 2. 选择指定主机或主机组 3. 选择让主机或者主机组执行命令或者向其传输文件(上传/下载) 4. 充分使用多线程或多进程 5. 不同主机的用户名密码 ...

  2. python10作业思路及源码:类Fabric主机管理程序开发(仅供参考)

    类Fabric主机管理程序开发 一,作业要求 1, 运行程序列出主机组或者主机列表(已完成) 2,选择指定主机或主机组(已完成) 3,选择主机或主机组传送文件(上传/下载)(已完成) 4,充分使用多线 ...

  3. python第五十二天---第九周作业 类 Fabric 主机管理程序

    类 Fabric 主机管理程序开发:1. 运行程序列出主机组或者主机列表2. 选择指定主机或主机组3. 选择让主机或者主机组执行命令或者向其传输文件(上传/下载)4. 充分使用多线程或多进程5. 不同 ...

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

    # 类 Fabric 主机管理程序开发: # 1. 运行程序列出主机组或者主机列表 # 2. 选择指定主机或主机组 # 3. 选择让主机或者主机组执行命令或者向其传输文件(上传/下载) # 4. 充分 ...

  5. 类 Fabric 主机管理程序开发

    类 Fabric 主机管理程序开发:1. 运行程序列出主机组或者主机列表2. 选择指定主机或主机组3. 选择让主机或者主机组执行命令或者向其传输文件(上传/下载4. 充分使用多线程或多进程5. 不同主 ...

  6. 类似fabric主机管理demo

    类似于fabric的主机管理系统 可以批量对主机进行操作 批量上传文件 批量下载文件 批量执行命令 demo代码 #!/usr/bin/env python # -*- coding:utf-8 -* ...

  7. Python第十五天 datetime模块 time模块 thread模块 threading模块 Queue队列模块 multiprocessing模块 paramiko模块 fabric模块

    Python第十五天  datetime模块 time模块   thread模块  threading模块  Queue队列模块  multiprocessing模块  paramiko模块  fab ...

  8. 第十八章 Python批量管理主机(paramiko、fabric与pexpect)

    这个人的文章不错:http://lizhenliang.blog.51cto.com/all/7876557 转载:http://lizhenliang.blog.51cto.com/7876557/ ...

  9. LNMP服务器虚拟主机管理lnmp

    安装 系统需求: 需要2 GB硬盘剩余空间 安装步骤: 1.使用putty或类似的SSH工具登陆:登陆后运行:screen -S lnmp如果提示screen命令不存在可以执行:yum install ...

随机推荐

  1. MySQL 数据库和一些常用命令的使用

        常用命令总结: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 3 ...

  2. Python 连接、操作数据库

    使用python3+pymysql 一.安装python3 a)         从网上下载安装吧 二.安装pymysql https://pypi.python.org/pypi/PyMySQL h ...

  3. P1567 统计天数

    题目背景 统计天数 题目描述 炎热的夏日,KC非常的不爽.他宁可忍受北极的寒冷,也不愿忍受厦门的夏天.最近,他开始研究天气的变化.他希望用研究的结果预测未来的天气. 经历千辛万苦,他收集了连续N(1& ...

  4. undefined reference to 'dlopen';undefined reference to 'dlclose';undefined reference to 'dlerror'等问题

    在linux下,编译链接的时候,经常会遇到这样一个问题,undefined reference to.....,引起这个问题的原因在于在链接的时候缺少选项.下面举几个例子,并给出解决办法. 1.  u ...

  5. express_webpack自动刷新

    现在,webpack可以说是最流行的模块加载器(module bundler).一方面,它为前端静态资源的组织和管理提供了相对较完善的解决方案,另一方面,它也很大程度上改变了前端开发的工作流程.在应用 ...

  6. 矩阵——特征向量(Eigenvector)

    原文链接 矩阵的基础内容以前已经提到,今天我们来看看矩阵的重要特性——特征向量. 矩阵是个非常抽象的数学概念,很多人到了这里往往望而生畏.比如矩阵的乘法为什么有这样奇怪的定义?实际上是由工程实际需要定 ...

  7. Java常见加密技术的密钥与加密串长度

    Java常见的Java方式 1.Base64编码 2.十六进制(Hex)编码 3.MD消息摘要 4.DES加密 5.3DES加密 6.AES加密 6.RSA加密

  8. 【赛时总结】◇赛时·VI◇ Atcoder ABC-104

    ◇赛时·VI◇ ABC-104 ◆??? 莫名爆炸……ABC都AK不了 QwQ C题竟然沦落到卡数据的地步:D题没有思路,直接放弃 ⋋( ◕ ∧ ◕ )⋌ ◆ 题目&解析 ◇A题◇ Rated ...

  9. java高并发之CountDownLatch,CyclicBarrier和join

    晚上打车回家,在车上看到一篇文章<22岁大学生获谷歌天价Offer,年薪千万!>,讲的是印度一个22岁大学生多次参加ACM大赛,开源多个项目,以非常牛逼的履历通过了谷歌的AI测试,斩获谷歌 ...

  10. 6-1 md5加密

    1.导入hashlib模块,使用它的md5方法进行加密 import hashlib # import md5 python2 s = 'admin123' # .将字符串类型转换成byte类型才能加 ...