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

发布时间 - 2026-01-10 22:48:30    点击率:

今天做了一个很简单的小项目,感受到了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文件,上传后就有了!

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


# 简单主机批量管理工具  # python  # 主机批量管理工具  # Linux在批量服务器管理中实用的PS1命令提示符格式实现方法  # Python的批量远程管理和部署工具Fabric用法实例  # Hibernate管理Session和批量操作分析  # 用expect实现ssh自动登录服务器并进行批量管理的实现方法  # 相片管理必备:文件批量改名工具 自动以日期时间命名  # Serv-U 批量帐号管理及申请(Access+Asp) 图文方法  # 关于批量导入域名到管理平台的说明  # 配置文件  # 上传  # 多个  # 我就  # 地说  # 一台  # 我用  # 很简单  # 不做  # 内有  # 而定  # 写在  # 源代码  # 大家多多  # 多少个  # 上传文件  # 目录下  # username  # password  # host 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: googleplay官方入口在哪里_Google Play官方商店快速入口指南  Laravel如何实现登录错误次数限制_Laravel自带LoginThrottles限流配置【方法】  iOS发送验证码倒计时应用  百度浏览器如何管理插件 百度浏览器插件管理方法  北京专业网站制作设计师招聘,北京白云观官方网站?  Laravel如何使用Blade组件和插槽?(Component代码示例)  Laravel如何保护应用免受CSRF攻击?(原理和示例)  如何用PHP工具快速搭建高效网站?  谷歌浏览器下载文件时中断怎么办 Google Chrome下载管理修复  Laravel如何生成PDF或Excel文件_Laravel文档导出工具与使用教程  ChatGPT怎么生成Excel公式_ChatGPT公式生成方法【指南】  node.js报错:Cannot find module 'ejs'的解决办法  学生网站制作软件,一个12岁的学生写小说,应该去什么样的网站?  Windows10如何更改计算机工作组_Win10系统属性修改Workgroup  品牌网站制作公司有哪些,买正品品牌一般去哪个网站买?  b2c电商网站制作流程,b2c水平综合的电商平台?  网站图片在线制作软件,怎么在图片上做链接?  非常酷的网站设计制作软件,酷培ai教育官方网站?  网易LOFTER官网链接 老福特网页版登录地址  网站视频制作书签怎么做,ie浏览器怎么将网站固定在书签工具栏?  Laravel如何使用Spatie Media Library_Laravel图片上传管理与缩略图生成【步骤】  香港服务器部署网站为何提示未备案?  新三国志曹操传主线渭水交兵攻略  HTML透明颜色代码在Angular里怎么设置_Angular透明颜色使用指南【详解】  jQuery validate插件功能与用法详解  Laravel如何配置中间件Middleware_Laravel自定义中间件拦截请求与权限校验【步骤】  Laravel怎么生成URL_Laravel路由命名与URL生成函数详解  js实现获取鼠标当前的位置  Laravel怎么为数据库表字段添加索引以优化查询  详解阿里云nginx服务器多站点的配置  如何快速辨别茅台真假?关键步骤解析  Laravel如何使用Livewire构建动态组件?(入门代码)  黑客如何利用漏洞与弱口令入侵网站服务器?  Win11怎么开启自动HDR画质_Windows11显示设置HDR选项  如何在阿里云服务器自主搭建网站?  详解MySQL数据库的安装与密码配置  Laravel如何使用.env文件管理环境变量?(最佳实践)  浅谈javascript alert和confirm的美化  详解jQuery停止动画——stop()方法的使用  Android Socket接口实现即时通讯实例代码  如何使用 Go 正则表达式精准提取括号内首个纯字母标识符(忽略数字与嵌套)  Win11怎么关闭资讯和兴趣_Windows11任务栏设置隐藏小组件  JavaScript中的标签模板是什么_它如何扩展字符串功能  深圳防火门网站制作公司,深圳中天明防火门怎么编码?  Laravel控制器是什么_Laravel MVC架构中Controller的作用与实践  laravel怎么为API路由添加签名中间件保护_laravel API路由签名中间件保护方法  如何解决hover在ie6中的兼容性问题  企业网站制作这些问题要关注  Laravel如何设置定时任务(Cron Job)_Laravel调度器与任务计划配置  如何在宝塔面板创建新站点?