paramiko类Fabric主机管理

环境: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



原文地址:https://www.cnblogs.com/zh-20170913/p/8178534.html

时间: 2024-10-12 04:49:50

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

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

类 Fabric 主机管理程序开发:1. 运行程序列出主机组或者主机列表2. 选择指定主机或主机组3. 选择让主机或者主机组执行命令或者向其传输文件(上传/下载)4. 充分使用多线程或多进程5. 不同主机的用户名密码.端口可以不同 README 类 Fabric 主机管理程序 执行命令(SSH) 向其传输文件(上传/下载) Fabric/#程序目录 |- - -__init__.py |- - -bin/#启动目录 | |- - -__init__.py | |- - -Fabric_start

类 Fabric 主机管理程序开发

类 Fabric 主机管理程序开发:1. 运行程序列出主机组或者主机列表2. 选择指定主机或主机组3. 选择让主机或者主机组执行命令或者向其传输文件(上传/下载4. 充分使用多线程或多进程5. 不同主机的用户名密码.端口可以不同 代码如下: #-*-coding:utf-8-*- import threadingimport queue,time,os,paramiko #服务器连接信息获取验证def auth_action(): BASE_DIR = os.path.dirname(os.pa

python之路——作业:类Farbic主机管理程序(仅供参考)

一.作业需求 1. 运行程序列出主机组或者主机列表2. 选择指定主机或主机组3. 选择让主机或者主机组执行命令或者向其传输文件(上传/下载)4. 充分使用多线程或多进程5. 不同主机的用户名密码.端口可以不同 二.实现功能 1.创建主机2.运行程序列出主机列表3.选择指定主机或主机组4.选择让主机或主机组执行命令或传输文件5.充分使用多线程注意:新用户使用本程序1.创建主机------->需根据自己现已开启的主机创建主机,将主机信息以文件的形式保存下来: 2.连接主机------->根据用户创

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

本章节主要讲解运维工程师比较感兴趣的知识,那就是运维批量管理,在Python下有paramiko.fabric和pexpect这三个模块可帮助运维实现自动化部署.批量执行命令.文件传输等常规任务,接下来一起看看它们的使用方法吧! 18.1 paramiko paramiko模块是基于Python实现的SSH远程安全连接,用于SSH远程执行命令.文件传输等功能. 默认Python没有,需要手动安装:pip install paramiko 如安装失败,可以尝试yum安装:yum install p

python linux交互模块(paramiko、fabric与pexpect)

转载自: http://blog.csdn.net/alibert/article/details/54375276 paramiko paramiko模块是基于Python实现的SSH远程安全连接,用于SSH远程执行命令.文件传输等功能. 默认python没有,需要手动安装:pip install paramiko 如安装失败,可以尝试yum安装:yum install python-paramiko 18.1.1 SSH密码认证远程执行命令 1 2 3 4 5 6 7 8 9 10 11 1

Python学习笔记——进阶篇【第八周】———FTP断点续传作业&批量主机管理工具

主机管理之paramiko模块学习 http://www.cnblogs.com/wupeiqi/articles/5095821.html 作业1:用socketserver继续完善FTP作业 作业2:开发一个批量主机管理工具 需求: 可以对机器进行分组 可以对指定的一组或多组机器执行批量命令,分发文件(发送\接收) 纪录操作日志 作业参考链接http://www.cnblogs.com/alex3714/articles/5227251.html

saltstack主机管理项目【day39】:主机管理项目开发

项目目标 salt state.apply -h "ubuntu,centos" -g "ubuntu,centos" -f "ubuntu,centos" 文件目录规划 配置文件详解 步骤一:创建一个salt salt配置文件 #!/usr/bin/env python # -*- coding:utf-8 -*- # Author:Alex Li import os,sys if __name__ == "__main__"

LNMP服务器虚拟主机管理lnmp

安装 系统需求: 需要2 GB硬盘剩余空间 安装步骤: 1.使用putty或类似的SSH工具登陆:登陆后运行:screen -S lnmp如果提示screen命令不存在可以执行:yum install screen 或 apt-get install screen安装,详细的screen教程点击这里. 2.下载LNMP一键安装包: 您可以选择使用下载版(推荐国外或者美国VPS使用)或者完整版(推荐国内VPS使用)如需下载版执行命令:wget -c http://soft.vpser.net/ln

saltstack主机管理项目【day23】:主机管理项目需求分析-设计

本节内容 一. 主机管理项目需求分析 二 .主机管理项目架构设计 三.主机管理项目初始构建 四. 主机管理项目编写插件基类 五 .主机管理项目命令分发器 一. 主机管理项目需求分析 配置管理: 1.装上nginx,mysql 2.nginx用我指定的配置文件 3.mysql用户 4.设置一个默认的数据库访问权限 5.启动mysql and nginx 问题: 1.脚本执行出错 2.客户端环境,不相同 3.重复脚本内容 4.无法实现状态管理和检测 解决: 1.标准化 2.客户端最好有个守护进程 二