详解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开发之字符串string操作方法实例详解
Nov 12 Python
python利用MethodType绑定方法到类示例代码
Aug 27 Python
python实现用户答题功能
Jan 17 Python
numpy 进行数组拼接,分别在行和列上合并的实例
May 08 Python
Django中的文件的上传的几种方式
Jul 23 Python
python实现日志按天分割
Jul 22 Python
浅析PEP570新语法: 只接受位置参数
Oct 15 Python
python判断两个序列的成员是否一样的实例代码
Mar 01 Python
解决django的template中如果无法引用MEDIA_URL问题
Apr 07 Python
JAVA SWT事件四种写法实例解析
Jun 05 Python
Windows下PyCharm配置Anaconda环境(超详细教程)
Jul 31 Python
AI:如何训练机器学习的模型
Apr 16 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 中文字符入库或显示乱码问题的解决方法
2010/04/12 PHP
PHP Hash算法:Times33算法代码实例
2015/05/13 PHP
PHP实现限制IP访问的方法
2017/04/20 PHP
jquery下利用jsonp跨域访问实现方法
2010/07/29 Javascript
Javascript控制input输入时间格式的方法
2015/01/28 Javascript
jQuery使用animate创建动画用法实例
2015/08/07 Javascript
jQuery 如何给Carousel插件添加新的功能
2016/04/18 Javascript
AngularJS基础 ng-open 指令简单实例
2016/08/02 Javascript
浅谈 Vue v-model指令的实现原理
2017/06/08 Javascript
基于js 各种排序方法和sort方法的区别(详解)
2018/01/03 Javascript
Bootstrap导航菜单点击后无法自动添加active的处理方法
2018/08/10 Javascript
layui的布局和表格的渲染以及动态生成表格的方法
2019/09/18 Javascript
jenkins自动构建发布vue项目的方法步骤
2021/01/04 Vue.js
Python判断变量是否已经定义的方法
2014/08/18 Python
详解duck typing鸭子类型程序设计与Python的实现示例
2016/06/03 Python
python实现kNN算法
2017/12/20 Python
Python整数与Numpy数据溢出问题解决
2019/09/11 Python
python科学计算之scipy——optimize用法
2019/11/25 Python
TensorFlow tensor的拼接实例
2020/01/19 Python
Windows 下python3.8环境安装教程图文详解
2020/03/11 Python
解决pycharm debug时界面下方不出现step等按钮及变量值的问题
2020/06/09 Python
Python批量获取并保存手机号归属地和运营商的示例
2020/10/09 Python
解决PyCharm无法使用lxml库的问题(图解)
2020/12/22 Python
python中doctest库实例用法
2020/12/31 Python
HTML5 Plus 实现手机APP拍照或相册选择图片上传功能
2016/07/13 HTML / CSS
详解HTML5 Canvas绘制时指定颜色与透明度的方法
2016/03/25 HTML / CSS
Hawes & Curtis官网:英国经典品牌
2019/07/27 全球购物
弘扬雷锋精神演讲稿
2014/05/10 职场文书
化学专业毕业生求职信
2014/07/28 职场文书
环境科学专业求职信
2014/08/04 职场文书
致百米运动员广播稿5篇
2014/10/13 职场文书
对党的十八届四中全会的期盼
2014/10/17 职场文书
幼儿园小班家长评语
2014/12/30 职场文书
社会治安综合治理责任书
2015/01/29 职场文书
2019财务管理制度最新范本!
2019/07/09 职场文书
nginx实现多geoserver服务的负载均衡
2022/05/15 Servers