详解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的Django框架中的Context使用
Jul 15 Python
Python中字符串的常见操作技巧总结
Jul 28 Python
请不要重复犯我在学习Python和Linux系统上的错误
Dec 12 Python
django 常用orm操作详解
Sep 13 Python
分析python动态规划的递归、非递归实现
Mar 04 Python
python文本数据相似度的度量
Mar 12 Python
Python 使用类写装饰器的小技巧
Sep 30 Python
Python中浅拷贝copy与深拷贝deepcopy的简单理解
Oct 26 Python
Django中的用户身份验证示例详解
Aug 07 Python
python 实现多维数组(array)排序
Feb 28 Python
深入理解Pytorch微调torchvision模型
Nov 11 Python
基于Python实现射击小游戏的制作
Apr 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
destoon二次开发常用数据库操作
2014/06/21 PHP
PHP中使用hidef扩展代替define提高性能
2015/04/09 PHP
Yii框架实现对数据库的CURD操作示例
2019/09/03 PHP
HTML页面如何象ASP一样接受参数
2007/02/07 Javascript
jQuery的实现原理的模拟代码 -1 核心部分
2010/08/01 Javascript
通过action传过来的值在option获取进行验证的方法
2013/11/14 Javascript
window.print打印指定div实例代码
2013/12/13 Javascript
Javascript中的call()方法介绍
2015/03/15 Javascript
javascript闭包的理解
2015/04/01 Javascript
JavaScript html5 canvas绘制时钟效果(二)
2016/03/27 Javascript
详解Vue-cli代理解决跨域问题
2017/09/27 Javascript
Vue 2.0学习笔记之Vue中的computed属性
2017/10/16 Javascript
关于Mac下安装nodejs、npm和cnpm的教程
2018/04/11 NodeJs
JavaScript对象拷贝与Object.assign用法实例分析
2018/06/20 Javascript
JS原生带缩略图的图片切换效果
2018/10/10 Javascript
微信小程序上传图片到php服务器的方法
2019/05/23 Javascript
Layui表格行工具事件与数据回填方法
2019/09/13 Javascript
在react中使用vue的状态管理的方法示例
2020/05/02 Javascript
使用vant的地域控件追加全部选项
2020/11/03 Javascript
如何利用vue实现波谱拟合详解
2020/11/05 Javascript
Python冒泡排序注意要点实例详解
2016/09/09 Python
python中单例常用的几种实现方法总结
2018/10/13 Python
python 实现提取某个索引中某个时间段的数据方法
2019/02/01 Python
Python中的类与类型示例详解
2019/07/10 Python
基于Django统计博客文章阅读量
2019/10/29 Python
Python通过2种方法输出带颜色字体
2020/03/02 Python
Pycharm中import torch报错的快速解决方法
2020/03/05 Python
CSS3动画之利用requestAnimationFrame触发重新播放功能
2019/09/11 HTML / CSS
超越自我演讲稿
2014/05/21 职场文书
公司离职证明标准样本
2014/10/05 职场文书
个人剖析材料及整改措施
2014/10/07 职场文书
党员评议表自我评价范文
2014/10/20 职场文书
财务经理岗位职责范本
2015/04/08 职场文书
浅析InnoDB索引结构
2021/04/05 MySQL
一文搞懂PHP中的抽象类和接口
2022/05/25 PHP
js前端设计模式优化50%表单校验代码示例
2022/06/21 Javascript