详解python之简单主机批量管理工具


Posted in Python onJanuary 27, 2017

今天做了一个很简单的小项目,感受到了paramiko模块的强大,也深感自己Linux的功力不行~~

一、需求

详解python之简单主机批量管理工具

二、简单需求分析及流程图

需求很少,我就简单地说下:

1. 主机分组可以配置文件实现(我用字典存数据的).

2. 登陆功能不做。选择分组后可查看组内对应主机的主机名和IP地址.

3. >>>cmd: df(输入命令则起多个线程(视组内有多少个主机而定)同时执行)

输出:

-------------h1------------

……(命令返回的数据)

-------------h2------------

……

>>>put  test.yy(本地文件)   filename (把本地的test.yy文件传到远程主机的/root目录下)

4.可写在配置文件中。包括远程主机的: 主机名 IP 用户名 密码 端口

流程图

详解python之简单主机批量管理工具

三、目录结构及源代码

目录结构:

详解python之简单主机批量管理工具

from_windows.py(待上传的文件)

main.py(批量主机管理接口)

"""批量主机管理接口"""
 
 import core
 
 if __name__ == "__main__":
   core.run()

core.py(核心代码,被接口调用)

"""核心代码"""
import settings
import paramiko
import threading
import os


class REMOTE_HOST(object):
  #远程操作主机
  def __init__(self, host, port ,username, password, cmd):
    self.host = host
    self.port = port
    self.username = username
    self.password = password
    self.cmd = cmd

  def run(self):
    """起线程连接远程主机后调用"""
    cmd_str = self.cmd.split()[0]
    if hasattr(self, cmd_str):   #反射 eg:调用put方法
      getattr(self, cmd_str)()
    else:
      #setattr(x,'y',v)is equivalent to  ``x.y=v''
      setattr(self, cmd_str, self.command)
      getattr(self, cmd_str)() #调用command方法,执行批量命令处理

  def command(self):
    """批量命令处理"""
    ssh = paramiko.SSHClient() #创建ssh对象
    #允许连接不在know_hosts文件中的主机
    ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
    ssh.connect(hostname=self.host,port=self.port,username=self.username,password=self.password)
    stdin,stdout,stderr = ssh.exec_command(self.cmd)
    result = stdout.read()
    print("%s".center(50, "-") % self.host)
    print(result.decode())
    ssh.close()

  def put(self):
    """上传文件"""
    filename = self.cmd.split()[1] #要上传的文件
    transport = paramiko.Transport((self.host, self.port))
    transport.connect(username=self.username, password=self.password)
    sftp = paramiko.SFTPClient.from_transport(transport)
    sftp.put(filename, filename)
    print("put sucesss")

    transport.close()


def show_host_list():
  """通过选择分组显示主机名与IP"""
  for index, key in enumerate(settings.msg_dic):
    print(index + 1, key, len(settings.msg_dic[key]))
  while True:
    choose_host_list = input(">>>(eg:group1)").strip()
    host_dic = settings.msg_dic.get(choose_host_list)
    if host_dic:
      #print(host_dic)
      for key in host_dic:
        print(key, host_dic[key]["IP"])
      return host_dic
    else:
      print("NO exit this group!")


def interactive(choose_host_list):
  """根据选择的分组主机起多个线程进行批量交互"""
  thread_list = []
  while True:
    cmd = input(">>>").strip()
    if cmd:
      for key in choose_host_list:
        host, port, username, password = choose_host_list[key]["IP"], choose_host_list[key]["port"], \
                         choose_host_list[key]["username"], choose_host_list[key]["password"]
        func = REMOTE_HOST(host, port, username, password, cmd) # 实例化类
        t = threading.Thread(target=func.run) # 起线程
        t.start()
        thread_list.append(t)
      for t in thread_list:
        t.join() # 主线程等待子线程执行完毕
    else:
      continue


def run():
  choose_host_list = show_host_list()
  interactive(choose_host_list)

settings.py(配置文件)

"""配置文件"""

msg_dic = {
  "group1":{  #分组1
    "h1":{"IP":"192.168.1.1", "username":"11", "password":"aa", "port":22},
    "h2":{"IP":"192.168.1.2", "username":"22", "password":"bb", "port":22},
    "h3":{"IP":"192.168.1.3", "username":"33", "password":"cc", "port":22},
    "h4":{"IP":"192.168.1.4", "username":"44", "password":"dd", "port":22},
    "h5":{"IP":"192.168.1.5", "username":"55", "password":"ee", "port":22},
    "h6":{"IP":"192.168.1.6", "username":"66", "password":"ff", "port":22},
  },

  "group2":{  #分组2
    "h1":{"IP":"192.168.2.1", "username":"111", "password":"aaa", "port":22},
    "h2":{"IP":"192.168.2.2", "username":"222", "password":"bbb", "port":22},
    "h3":{"IP":"192.168.2.3", "username":"333", "password":"ccc", "port":22},
    "h4":{"IP":"192.168.2.4", "username":"444", "password":"ddd", "port":22},
    "h5":{"IP":"192.168.2.5", "username":"555", "password":"eee", "port":22},
    "h6":{"IP":"192.168.2.6", "username":"666", "password":"fff", "port":22},
    "h7":{"IP":"192.168.2.7", "username":"777", "password":"ggg", "port":22},
    "h8":{"IP":"192.168.2.8", "username":"888", "password":"hhh", "port":22},
  },

  "group3":{
    "h1":{"IP":"192.168.179.133", "username":"root", "password":"zcl", "port":22},
  }
}

测试:

硬件限制,我只用连接一台虚拟机测试~

C:\Python34\python3.exe C:/Users/Administrator/PycharmProjects/laonanhai/host_manage/main.py
1 group1 6
2 group3 1
3 group2 8
>>>(eg:group1)group3
h1 192.168.179.133
>>>put from_windows.py
put sucesss
>>>
>>>ls
------------------------192.168.179.133------------------------
anaconda-ks.cfg
database_test
from_windows.py
install.log
install.log.syslog
m
oot
\root
tmp\from_windows.py

>>>

上传前没有from_windows.py文件,上传后就有了!

详解python之简单主机批量管理工具

 以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python使用在线API查询IP对应的地理位置信息实例
Jun 01 Python
python解决汉字编码问题:Unicode Decode Error
Jan 19 Python
Python实现基于多线程、多用户的FTP服务器与客户端功能完整实例
Aug 18 Python
Python协程的用法和例子详解
Sep 09 Python
python按时间排序目录下的文件实现方法
Oct 17 Python
python使用matplotlib绘制热图
Nov 07 Python
Python使用os.listdir()和os.walk()获取文件路径与文件下所有目录的方法
Apr 01 Python
Python 实现向word(docx)中输出
Feb 13 Python
在keras下实现多个模型的融合方式
May 23 Python
Python学习之路安装pycharm的教程详解
Jun 17 Python
python3排序的实例方法
Oct 20 Python
Python制作春联的示例代码
Jan 22 Python
Python下的Softmax回归函数的实现方法(推荐)
Jan 26 #Python
在Django同1个页面中的多表单处理详解
Jan 25 #Python
Python heapq使用详解及实例代码
Jan 25 #Python
python3+PyQt5实现使用剪贴板做复制与粘帖示例
Jan 24 #Python
Python调用C++程序的方法详解
Jan 24 #Python
python中import学习备忘笔记
Jan 24 #Python
用python实现简单EXCEL数据统计的实例
Jan 24 #Python
You might like
解析PHP多种序列化与反序列化的方法
2013/06/06 PHP
php通过function_exists检测函数是否存在的方法
2015/03/18 PHP
php使用MySQL保存session会话的方法
2015/06/26 PHP
利用Fix Rss Feeds插件修复WordPress的Feed显示错误
2015/12/19 PHP
php 二维数组时间排序实现代码
2016/11/19 PHP
jQuery 动画基础教程
2008/12/25 Javascript
javascript开发技术大全-第1章javascript概述
2011/07/03 Javascript
jquery简单的弹出层浮动层代码
2015/04/27 Javascript
js由下向上不断上升冒气泡效果实例
2015/05/07 Javascript
jquery实现两个图片渐变切换效果的方法
2015/06/25 Javascript
ajax级联菜单实现方法实例分析
2016/11/28 Javascript
Bootstrap 下拉多选框插件Bootstrap Multiselect
2017/01/22 Javascript
详解A标签中href=""的几种用法
2017/08/20 Javascript
微信小程序wepy框架笔记小结
2018/08/08 Javascript
当vue路由变化时,改变导航栏的样式方法
2018/08/22 Javascript
详解Element-UI中上传的文件前端处理
2019/08/07 Javascript
Jquery高级应用Deferred对象原理及使用实例
2020/05/28 jQuery
js实现贪吃蛇游戏 canvas绘制地图
2020/09/09 Javascript
Python subprocess模块学习总结
2014/03/13 Python
Python中的tuple元组详细介绍
2015/02/02 Python
使用C语言来扩展Python程序和Zope服务器的教程
2015/04/14 Python
Python3 中文文件读写方法
2018/01/23 Python
python学习入门细节知识点
2018/03/29 Python
Python高级用法总结
2018/05/26 Python
jupyter notebook oepncv 显示一张图像的实现
2020/04/24 Python
在django中实现choices字段获取对应字段值
2020/07/12 Python
仿CSDN Blog返回页面顶部功能实现原理及代码
2013/06/30 HTML / CSS
大学在校生求职信范文
2013/11/21 职场文书
国培教师自我鉴定
2014/02/12 职场文书
战略合作协议书范本
2014/04/18 职场文书
关于美容院的活动方案
2014/08/14 职场文书
财务部岗位职责
2015/02/03 职场文书
综合实践活动报告
2015/02/05 职场文书
结婚老公保证书
2015/02/26 职场文书
试用期辞职信范文
2015/03/02 职场文书
Android使用EventBus发送消息,Fragment中接收消息的方法会执行多次
2022/04/24 Java/Android