热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

paramiko类Fabric主机管理

环境:Linuxpython3.5要求:类Fabric主机管理程序开发:1.运行程序列出主机组或者主机列表2.选择指定主机或主机组3.选择让主机或者主机组执行命令或者向其传输文件(上传下
环境: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

 




推荐阅读
  • 本文介绍了如何使用Python的Paramiko库批量更新多台服务器的登录密码。通过示例代码展示了具体实现方法,确保了操作的高效性和安全性。Paramiko库提供了强大的SSH2协议支持,使得远程服务器管理变得更加便捷。此外,文章还详细说明了代码的各个部分,帮助读者更好地理解和应用这一技术。 ... [详细]
  • 本文详细解析了客户端与服务器之间的交互过程,重点介绍了Socket通信机制。IP地址由32位的4个8位二进制数组成,分为网络地址和主机地址两部分。通过使用 `ipconfig /all` 命令,用户可以查看详细的IP配置信息。此外,文章还介绍了如何使用 `ping` 命令测试网络连通性,例如 `ping 127.0.0.1` 可以检测本机网络是否正常。这些技术细节对于理解网络通信的基本原理具有重要意义。 ... [详细]
  • 本文深入探讨了MDK链接脚本的应用与优化技巧。首先,文章介绍了链接脚本的基本概念及其在嵌入式系统开发中的重要性。接着,通过具体实例详细分析了链接脚本的结构和功能,特别是在程序在FLASH中运行时,如何优化链接脚本以提高系统性能。此外,文章还讨论了无需将程序加载到SRAM中的技术细节,为开发者提供了实用的参考和指导。 ... [详细]
  • 本文详细介绍了在CentOS 6.5 64位系统上使用阿里云ECS服务器搭建LAMP环境的具体步骤。首先,通过PuTTY工具实现远程连接至服务器。接着,检查当前系统的磁盘空间使用情况,确保有足够的空间进行后续操作,可使用 `df` 命令进行查看。此外,文章还涵盖了安装和配置Apache、MySQL和PHP的相关步骤,以及常见问题的解决方法,帮助用户顺利完成LAMP环境的搭建。 ... [详细]
  • 体积小巧的vsftpd与pureftpd Docker镜像在Unraid系统中的详细配置指南:支持TLS加密及IPv6协议
    本文详细介绍了如何在Unraid系统中配置体积小巧的vsftpd和Pure-FTPd Docker镜像,以支持TLS加密和IPv6协议。通过这些配置,用户可以实现安全、高效的文件传输服务,适用于各种网络环境。配置过程包括镜像的选择、环境变量的设置以及必要的安全措施,确保了系统的稳定性和数据的安全性。 ... [详细]
  • Python全局解释器锁(GIL)机制详解
    在Python中,线程是操作系统级别的原生线程。为了确保多线程环境下的内存安全,Python虚拟机引入了全局解释器锁(Global Interpreter Lock,简称GIL)。GIL是一种互斥锁,用于保护对解释器状态的访问,防止多个线程同时执行字节码。尽管GIL有助于简化内存管理,但它也限制了多核处理器上多线程程序的并行性能。本文将深入探讨GIL的工作原理及其对Python多线程编程的影响。 ... [详细]
  • 本文介绍了如何在iOS平台上使用GLSL着色器将YV12格式的视频帧数据转换为RGB格式,并展示了转换后的图像效果。通过详细的技术实现步骤和代码示例,读者可以轻松掌握这一过程,适用于需要进行视频处理的应用开发。 ... [详细]
  • 在Python多进程编程中,`multiprocessing`模块是不可或缺的工具。本文详细探讨了该模块在多进程管理中的核心原理,并通过实际代码示例进行了深入分析。文章不仅总结了常见的多进程编程技巧,还提供了解决常见问题的实用方法,帮助读者更好地理解和应用多进程编程技术。 ... [详细]
  • Python多线程编程技巧与实战应用详解 ... [详细]
  • 为了在Hadoop 2.7.2中实现对Snappy压缩和解压功能的原生支持,本文详细介绍了如何重新编译Hadoop源代码,并优化其Native编译过程。通过这一优化,可以显著提升数据处理的效率和性能。此外,还探讨了编译过程中可能遇到的问题及其解决方案,为用户提供了一套完整的操作指南。 ... [详细]
  • Python 程序转换为 EXE 文件:详细解析 .py 脚本打包成独立可执行文件的方法与技巧
    在开发了几个简单的爬虫 Python 程序后,我决定将其封装成独立的可执行文件以便于分发和使用。为了实现这一目标,首先需要解决的是如何将 Python 脚本转换为 EXE 文件。在这个过程中,我选择了 Qt 作为 GUI 框架,因为之前对此并不熟悉,希望通过这个项目进一步学习和掌握 Qt 的基本用法。本文将详细介绍从 .py 脚本到 EXE 文件的整个过程,包括所需工具、具体步骤以及常见问题的解决方案。 ... [详细]
  • UC浏览器无法加载网页的解决方案:详细指南与专业建议
    许多用户在使用UC浏览器时遇到无法加载网页的问题。本文将提供详细的解决方案和专业建议,帮助您快速排除故障。首先,需要确认UC浏览器的版本是否为最新,同时检查网络连接是否正常。如果问题依旧存在,可以尝试清除缓存、重置浏览器设置或重新安装UC浏览器。此外,禁用可能干扰浏览器的第三方安全软件也是一个有效的解决办法。希望这些方法能有效解决您的问题。 ... [详细]
  • 深入解析 OpenSSL 生成 SM2 证书:非对称加密技术与数字证书、数字签名的关联分析
    本文深入探讨了 OpenSSL 在生成 SM2 证书过程中的技术细节,重点分析了非对称加密技术在数字证书和数字签名中的应用。非对称加密通过使用公钥和私钥对数据进行加解密,确保了信息传输的安全性。公钥可以公开分发,用于加密数据或验证签名,而私钥则需严格保密,用于解密数据或生成签名。文章详细介绍了 OpenSSL 如何利用这些原理生成 SM2 证书,并讨论了其在实际应用中的安全性和有效性。 ... [详细]
  • 在JavaWeb项目架构中,NFS(网络文件系统)的实现与优化是关键环节。NFS允许不同主机系统通过局域网共享文件和目录,提高资源利用率和数据访问效率。本文详细探讨了NFS在JavaWeb项目中的应用,包括配置、性能优化及常见问题的解决方案,旨在为开发者提供实用的技术参考。 ... [详细]
  • 通过使用七牛云存储服务,本文详细介绍了如何将本地图片高效上传至云端,并实现了内容的便捷管理。借助七牛云的 Python SDK,文章提供了从认证到文件上传的具体代码示例,包括导入必要的库、生成上传凭证以及处理文件路径等关键步骤。此外,还探讨了如何利用七牛云的 URL 安全编码功能,确保数据传输的安全性和可靠性。 ... [详细]
author-avatar
江韦亭君733
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有