详解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网络编程之读取网站根目录实例
Sep 30 Python
Python中的异常处理简明介绍
Apr 13 Python
Python简单的制作图片验证码实例
May 31 Python
Python中defaultdict与lambda表达式用法实例小结
Apr 09 Python
Python使用selenium实现网页用户名 密码 验证码自动登录功能
May 16 Python
在Python 不同级目录之间模块的调用方法
Jan 19 Python
Python基础教程之if判断,while循环,循环嵌套
Apr 25 Python
java中的控制结构(if,循环)详解
Jun 26 Python
python提取照片坐标信息的实例代码
Aug 14 Python
Python-jenkins 获取job构建信息方式
May 12 Python
Python使用内置函数setattr设置对象的属性值
Oct 16 Python
Python中常见的导入方式总结
May 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
颠覆常识!无色透明的咖啡诞生了(中日双语)
2021/03/03 咖啡文化
关于二级目录拖拽排序的实现(源码示例下载)
2013/04/26 PHP
PHP的PDO事务与自动提交
2019/01/24 PHP
jQuery 事件队列调整方法
2009/09/18 Javascript
js动态修改整个页面样式达到换肤效果
2014/05/23 Javascript
60行js代码实现俄罗斯方块
2015/03/31 Javascript
Javascript非构造函数的继承
2015/04/27 Javascript
jquery表单验证需要做些什么
2015/11/17 Javascript
javascript 动态样式添加的简单实现
2016/10/11 Javascript
js实现目录链接,内容跟着目录滚动显示的简单实例
2016/10/15 Javascript
详解React开发中使用require.ensure()按需加载ES6组件
2017/05/12 Javascript
Angular弹出模态框的两种方式
2017/10/19 Javascript
ReactNative之FlatList的具体使用方法
2017/11/29 Javascript
详解三种方式解决vue中v-html元素中标签样式
2018/11/22 Javascript
详解jQuery中的getAll()和cleanData()
2019/04/15 jQuery
教你搭建按需加载的Vue组件库(小结)
2019/07/29 Javascript
在layui下对元素进行事件绑定的实例
2019/09/06 Javascript
JavaScript实现猜数字游戏
2020/05/20 Javascript
vue tab切换,解决echartst图表宽度只有100px的问题
2020/07/19 Javascript
[02:19]DOTA2女子战队FOX视频专访:希望更多美眉一起加入
2013/10/15 DOTA
跟老齐学Python之坑爹的字符编码
2014/09/28 Python
Python中Class类用法实例分析
2015/11/12 Python
你所不知道的Python奇技淫巧13招【实用】
2016/12/14 Python
用python实现百度翻译的示例代码
2018/03/09 Python
基于pytorch的lstm参数使用详解
2020/01/14 Python
Pandas之read_csv()读取文件跳过报错行的解决
2020/04/21 Python
python 使用多线程创建一个Buffer缓存器的实现思路
2020/07/02 Python
python import 上级目录的导入
2020/11/03 Python
美国内衣第一品牌:Hanes(恒适)
2016/07/29 全球购物
2014年护理工作总结范文
2014/11/14 职场文书
萤火虫之墓观后感
2015/06/05 职场文书
科技馆观后感
2015/06/08 职场文书
安全教育观后感
2015/06/17 职场文书
pytorch 如何使用batch训练lstm网络
2021/05/28 Python
PHP获取学生成绩的方法
2021/11/17 PHP
win10电脑右下角输入法图标不见了?Win10右下角不显示输入法的解决方法
2022/07/23 数码科技