环境: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. 在vue中同时使用过渡和动画

    在上次的动画中,在显示和隐藏有动画效果,但是,刷新页面的时候,第一次的显示没有动画效果 需求:刷新页面的时候也有动画效果 <transition name='fade' appear enter ...

  2. maven项目右键快捷方式,然后点击Run As

    在某一个maven项目右键快捷方式,然后点击Run As就可以发现几个Maven的命令: 1.Maven Build: 这个命令用于编译Maven工程,执行命令后会在target文件夹中的classe ...

  3. 轻量级HTTP服务器Nginx(入门与安装篇)

    轻量级HTTP服务器Nginx(入门篇)   文章来源于南非蚂蚁   一.什么是Nginx 相信很多读者都对Apache非常熟悉,与Apache类似,Nginx是一款高性能的HTTP和反向代理服务器软 ...

  4. c++ 读入和写入文件

    读入 #include<ifstream> ifstream infile; infile.open(img_dir); while(getline(infile,tmp)){ } 写入 ...

  5. 剑指offer39 平衡二叉树

    剑指上用了指针传递,这里用的引用传递 class Solution { public: bool IsBalanced_Solution(TreeNode* pRoot) { ; return IsB ...

  6. mac home brew install go

    mac利器home brew安装Go 首先你得需要安装home brew和ruby环境(因为home brew依赖ruby) 如果没有请自行到链接安装 准备好之后就开始安装go了 brew updat ...

  7. android build.prop详解

    # begin build properties开始设置系统性能 # autogenerated by buildinfo.sh{通过设置形成系统信息} ro.build.id=MIUI(版本ID) ...

  8. svn更改地址怎么办

    开发过程中有时会遇到服务器更换地址的情况,比如之前地址是 svn://www.aaa.com 后来换成了 svn://www.bbb.com 这时候怎么办呢?分客户端和服务器端2种情况处理 客户端: ...

  9. 【洛谷P1525】[NOIP2010]关押罪犯

    关押罪犯 题目链接 思路: 二分图或并查集 这里讲并查集算法: 1.将每对罪犯的冲突关系按影响从大到小排序 2.将集合与(i+n)合并表示编号为i的罪犯不能在该集合内 3.依次从大到小处理冲突关系: ...

  10. iOS面试题总结(持续更新)

    过段时间打算跳槽,找了一些面试题来做,在这里做个总结方便review,希望能对要面试的童鞋有帮助. 以下为面试题: 运行以下代码会有什么结果 NSString *str1 = @"str1& ...