环境: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. vuejs计算属性getter和setter

    当页面获取某个数据的时候,先会在data里面找,找不到就会去计算属性里面找,在计算属性里面,获取的时候会自动去执行get方法 <div id='app'> {{fullName}} < ...

  2. node执行环境

    nodejs本质上是一个javascript的执行环境,只是由于他的封装,加上更多web底层的一个处理,赋予了更多的能力,那么执行环境到底是什么呢,我们到浏览器里面体验看看,在chrome里面控制台, ...

  3. 【转】Data URL和图片,及Data URI的利弊

    Data URL给了我们一种很巧妙的将图片“嵌入”到HTML中的方法.跟传统的用img标记将服务器上的图片引用到页面中的方式不一样,在Data URL协议中,图片被转换成base64编码的字符串形式, ...

  4. 20145238-荆玉茗 《Java程序设计》第9周学习总结

    20145238第九周<Java学习笔记> 第十六章 整合数据库 JDBC入门 ·数据库本身是个独立运行的应用程序 ·撰写应用程序是利用通信协议对数据库进行指令交换,以进行数据的增删查找 ...

  5. C# continue语句

    一.C# continue语句 continue语句在循环体中结束本次循环,而重新开始下一次循环. 语法格式如下: continue;二.示例   using System;using System. ...

  6. windows下配置kafka

    https://blog.csdn.net/evankaka/article/details/52421314

  7. 使用免费公开的api接口示例(iOS)

    做项目难免需要测试,要测试就需要一些接口,现在网上的很多接口都是需要收费的. 以下是目前找到的免费 JSON API免费接口 云聚数据 网吧数据 其中选取了一个百度百科的接口 百度接口 百度百科接口: ...

  8. XCode快捷键使用

    :first-child{margin-top:0!important}.markdown-body>:last-child{margin-bottom:0!important}.markdow ...

  9. 【iOS】史上最全的iOS持续集成教程 (上)

    :first-child{margin-top:0!important}.markdown-body>:last-child{margin-bottom:0!important}.markdow ...

  10. MySQL存储引擎MyISAM与InnoDB

    一. MySQL存储引擎MyISAM与InnoDB如何选择 MySQL有多种存储引擎,每种存储引擎有各自的优缺点,可以择优选择使用:MyISAM.InnoDB.MERGE.MEMORY(HEAP).B ...