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

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

一、需求

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

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

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

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

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

输出:

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

……(命令返回的数据)

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

……

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

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

流程图

三、目录结构及源代码

目录结构:

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文件,上传后就有了!

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

(0)

相关推荐

  • 关于批量导入域名到管理平台的说明

    表名:FreeHost_Product_Domain 数据结构: id int primary key identity(1,1)自动递增,因此无需导入这个字段 username varchar(14) 用户名,如test Domain varchar(100) 域名,如abc.com ServerlistID int 如果是自己解析,这儿代表解析服务器的序号,可以在管理区后台设置中看到.一般是1 Domaintype varchar(100) 域名的类型,目前并没有使用,设为空就行 statu

  • Serv-U 批量帐号管理及申请(Access+Asp) 图文方法

    1.首先下载Asp程序,在下载中包含Serv-U所需要的数据库,名为Serv#U.mdb.2.建立系统数据源:ftp,通过ODBC进行数据库连接,连接到Serv#U.mdb.步骤如图 3.成功建立ODBC后,打开Serv-U软件,建立FTP域.在步骤4时注意选择Store in ODBC database 4.打开Serv-U安装目录下的ServUDaemon.ini文件,做以下操作:(1)用下面的代码覆盖原来的ODBCSource.ODBCTables.ODBCColumns---------

  • 相片管理必备:文件批量改名工具 自动以日期时间命名

    这种方法有两个好处: 1,不论到什么时候都可以知道相片是什么照的.文件的日期和时间,有时复制到另外一个地方,会改变,我真的发现过这样的情况.用日期和时间命名,这样就不会丢了文件的时间了! 2,不会重复,也方便排序什么的 但一个个改起来也太麻烦了,在网上找了几个软件也不太方便,于是用批处理自己做一个,感觉很不错. 调试再调试,不完美不罢休--虽然是个小功能,但要完美一点--太浪费时间了! 终于完成了,自认为功能很强大,而且很完美了~~想到的功能都加上了,想到的错误也都排除了-- 虽然是为了修改相片

  • Python的批量远程管理和部署工具Fabric用法实例

    本文实例讲述了Python的批量远程管理和部署工具Fabric用法.分享给大家供大家参考.具体如下: Fabric是Python中一个非常强大的批量远程管理和部署工具,常用于在多个远程PC上批量执行SSH任务. 常见的使用方法大概总结如下: 1. 首先,要将批量执行的任务写入到一个fabfile.py中, 复制代码 代码如下: # -*- coding:utf-8 -*-    from fabric.api import run, local, roles, env, cd  env.host

  • Hibernate管理Session和批量操作分析

    本文详细分析了Hibernate管理Session和批量操作的用法.分享给大家供大家参考.具体分析如下: Hibernate管理Session Hibernate自身提供了三种管理Session对象的方法 ① Session对象的生命周期与本地线程绑定 ② Session对象的生命周期与JTA事务绑定 ③ Hibernate委托程序管理Session对象的生命周期 在Hibernate的配置文件中,hibernate.current_session_context_class属性用于指定Sess

  • Linux在批量服务器管理中实用的PS1命令提示符格式实现方法

    这时,我们肯定会经常遇到这样一个困扰:操作服务器时因某事中断,回头继续操作的时候肯定会ifconfg确认下是否是我要操作的服务器,因为无法从表象识别. 所以,我们很有必要将这个PS1命令行提示符优化一下.每个运维攻城狮肯定都有自己的习惯,不过我还是推荐一个服务器批量管理中比较使用的PS1格式吧! PS1是神马?PS1是linux里头的一个默认的环境变量,至于当前系统的PS1是如何设置的,你可以使用命令"env|grep PS1"来查看 . 其实PS1就是用来设置命令提示符格式的环境变量

  • 用expect实现ssh自动登录服务器并进行批量管理的实现方法

    shell代码: 复制代码 代码如下: #!/usr/local/bin/expectset PASSWD [lindex $argv 1]set IP     [lindex $argv 0]set CMD [lindex $argv 2]spawn ssh $IP $CMDexpect "(yes/no)?" {send "yesr"expect "password:"send "$PASSWDr"} "pass

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

    今天做了一个很简单的小项目,感受到了paramiko模块的强大,也深感自己Linux的功力不行~~ 一.需求 二.简单需求分析及流程图 需求很少,我就简单地说下: 1. 主机分组可以配置文件实现(我用字典存数据的). 2. 登陆功能不做.选择分组后可查看组内对应主机的主机名和IP地址. 3. >>>cmd: df(输入命令则起多个线程(视组内有多少个主机而定)同时执行) 输出: -------------h1------------ --(命令返回的数据) -------------h2

  • 详解python定时简单爬取网页新闻存入数据库并发送邮件

    本人小白一枚,简单记录下学校作业项目,代码十分简单,主要是对各个库的理解,希望能给别的初学者一点启发. 一.项目要求 1.程序可以从北京工业大学首页上爬取新闻内容:http://www.bjut.edu.cn 2.程序可以将爬取下来的数据写入本地MySQL数据库中. 3.程序可以将爬取下来的数据发送到邮箱. 4.程序可以定时执行. 二.项目分析 1.爬虫部分利用requests库爬取html文本,再利用bs4中的BeaultifulSoup库来解析html文本,提取需要的内容. 2.使用pymy

  • 详解python实现简单区块链结构

    区块链 比特币从诞生到现在已经10年了,最近接触到了区块链相关的技术,为了揭开其背后的神秘面纱,我就从头开始构建一个简单的区块链. 从技术上来看:区块是一种记录交易的数据结构,反映了一笔交易的资金流向.系统中已经达成的交易的区块连接在一起形成了一条主链,所有参与计算的节点都记录了主链或主链的一部分. 一.比特币内部结构 比特币内部结构有四部分: previous hash: 上一个区块的hash data:交易数据 time stamp:区块生成的时间戳 nonce:挖矿计算次数 二.实现的比特

  • 详解python with 上下文管理器

    作为一个 Java 为母语的程序员来讲,学习起其他新的语言就难免任何事都与 Java 进行横向对比.Java 7 引入了能省去许多重复代码的 try-with-resources 特性,不用每回 try/finally 来释放资源(不便之处有局部变量必须声明在 try 之前,finally 里还要嵌套 try/catch 来处理异常).比如下面的 Java 代码 try(InputStream inputStream = new FileInputStream("abc.txt"))

  • 详解Python如何实现批量为PDF添加水印

    目录 准备环境 获得经销商名字对应的列表 生成水印PDF 合并水印与目标PDF 总结 我们有时候需要把一些机密文件发给多个客户,为了避免客户泄露文件,会在机密文件中添加水印.每个客户收到的文件内容相同,但是水印都不相同.这样一来,如果资料泄露了,通过水印就知道是从谁手上泄露的. 今天,一个做市场的朋友找我咨询PDF加水印的问题,如下图所示: 他有一个Excel文件,文件里面有10000个经销商的名字,他要把价目表PDF发给这些经销商,每个经销商收到的PDF文件上面的水印都是这个经销商自己的名字.

  • 详解Python如何批量采集京东商品数据流程

    目录 准备工作 驱动安装 模块使用与介绍 流程解析 完整代码 效果展示 准备工作 驱动安装 实现案例之前,我们要先安装一个谷歌驱动,因为我们是使用selenium 操控谷歌驱动,然后操控浏览器实现自动操作的,模拟人的行为去操作浏览器. 以谷歌浏览器为例,打开浏览器看下我们自己的版本,然后下载跟自己浏览器版本一样或者最相近的版本,下载后解压一下,把解压好的插件放到我们的python环境里面,或者和代码放到一起也可以. 模块使用与介绍 selenium pip install selenium ,直

  • 详解Python如何批量检查图像是否可用

    数据集中的图像,一般不可用在以下3个方面: 1.图像过小 2.无法打开 3.“Premature end of JPEG file” 这些图像可能会导致模型的学习异常,因此,使用多进程检查数据集中的每张图像,是很有必要的. 具体逻辑如下: 遍历文件夹,多进程处理每一张图像 判断图像是否可读,是否支持resize尺寸,边长是否满足 判断JPG图像是否Premature end 删除错误图像 脚本如下: #!/usr/bin/env python # -- coding: utf-8 -- "&qu

  • 详解Python中位运算的简单实现

    目录 简介 应用场景 案例源码 简介 程序中的数在计算机内存中都是以二进制的形式存在的,位运算就是直接对整数在内存中对应的二进制位进行操作,一般是将数字化为二进制数后进行操作. 应用场景 在常规操作和位运算的操作中使用位运算,可以提升性能.但是会造成代码难以理解,建议合理利用. 1.统计奇数 2.统计偶数 3.统计不相同数等 4.求相反数 位运算分有6种: 1.按位与:两个位都为1时,结果才为1(统计奇数)即全1为1. 2.按位或:两个位都为0时,结果才为0(统计偶数)即全0为0. 3.按位异或

  • 详解Python自建logging模块

    简单使用 最开始,我们用最短的代码体验一下logging的基本功能. import logging logger = logging.getLogger() logging.basicConfig() logger.setLevel('DEBUG') logger.debug('logsomething') #输出 out>>DEBG:root:logsomething 第一步,通过logging.getLogger函数,获取一个loger对象,但这个对象暂时是无法使用的. 第二步,loggi

  • 详解python metaclass(元类)

    元编程,一个听起来特别酷的词,强大的Lisp在这方面是好手,对于Python,尽管没有完善的元编程范式,一些天才的开发者还是创作了很多元编程的魔法.Django的ORM就是元编程的一个很好的例子. 本篇的概念和例子皆在Python3.6环境下 一切都是对象 Python里一切都是对象(object),基本数据类型,如数字,字串,函数都是对象.对象可以由类(class)进行创建.既然一切都是对象,那么类是对象吗? 是的,类也是对象,那么又是谁创造了类呢?答案也很简单,也是类,一个能创作类的类,就像

随机推荐