详解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实现的简单万年历例子分享
Apr 25 Python
Python contextlib模块使用示例
Feb 18 Python
举例讲解Python设计模式编程中的访问者与观察者模式
Jan 26 Python
最大K个数问题的Python版解法总结
Jun 16 Python
使用Python读取大文件的方法
Feb 11 Python
Python的argparse库使用详解
Oct 09 Python
python实现对输入的密文加密
Mar 20 Python
Python 给屏幕打印信息加上颜色的实现方法
Apr 24 Python
对Pytorch中nn.ModuleList 和 nn.Sequential详解
Aug 18 Python
Python Subprocess模块原理及实例
Aug 26 Python
利用python计算时间差(返回天数)
Sep 07 Python
使用 Python ssh 远程登陆服务器的最佳方案
Mar 06 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校验表单检测字段是否为空的方法
2015/03/20 PHP
PHP多维数组遍历方法(2种实现方法)
2015/12/10 PHP
YII Framework框架教程之缓存用法详解
2016/03/14 PHP
php分页原理 分页代码 分页类制作教程
2016/09/23 PHP
PHP递归实现快速排序的方法示例
2017/12/18 PHP
javascript 进阶篇1 正则表达式,cookie管理,userData
2012/03/14 Javascript
jQuery中实现prop()函数控制多选框(全选,反选)
2016/08/19 Javascript
扩展jquery easyui tree的搜索树节点方法(推荐)
2016/10/28 Javascript
JavaScript之class继承_动力节点Java学院整理
2017/07/03 Javascript
vue下跨域设置的相关介绍
2017/08/26 Javascript
JSON 数据格式详解
2017/09/13 Javascript
JavaScript实现单击网页任意位置打开新窗口与关闭窗口的方法
2017/09/21 Javascript
vue2.0 datepicker使用方法
2018/02/04 Javascript
微信小程序实现简单表格
2019/02/14 Javascript
C#程序员入门学习微信小程序的笔记
2019/03/05 Javascript
python使用Plotly绘图工具绘制柱状图
2019/04/01 Python
对pyqt5中QTabWidget的相关操作详解
2019/06/21 Python
python+numpy按行求一个二维数组的最大值方法
2019/07/09 Python
Python面向对象程序设计之类和对象、实例变量、类变量用法分析
2020/03/23 Python
从python读取sql的实例方法
2020/07/21 Python
HTML5 Canvas入门学习教程
2016/03/17 HTML / CSS
Molton Brown美国官网:奢华美容、香水、沐浴和身体护理
2020/09/02 全球购物
临床医师专业个人自我评价范文
2013/11/07 职场文书
汽车技术服务英文求职信范文
2014/01/02 职场文书
新护士岗前培训制度
2014/02/02 职场文书
公务员转正鉴定材料
2014/02/11 职场文书
会计助理岗位职责
2014/02/17 职场文书
教堂婚礼主持词
2014/03/14 职场文书
监察建议书格式
2014/05/19 职场文书
王金山在党的群众路线教育实践活动总结大会上的讲话稿
2014/10/25 职场文书
物业工程部岗位职责
2015/02/11 职场文书
护士个人总结范文
2015/02/13 职场文书
银行工作心得体会范文
2016/01/23 职场文书
百善孝为先:关于孝道的经典语录
2019/10/18 职场文书
python APScheduler执行定时任务介绍
2022/04/19 Python
Tomcat弱口令复现及利用
2022/05/06 Servers