详解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 】
相关推荐:
Swift中循环语句中的转移语句 break 和 continue
图册素材网站设计制作软件,图册的导出方式有几种?
网站图片在线制作软件,怎么在图片上做链接?
手机软键盘弹出时影响布局的解决方法
PythonWeb开发入门教程_Flask快速构建Web应用
Laravel怎么实现验证码功能_Laravel集成验证码库防止机器人注册
Laravel项目结构怎么组织_大型Laravel应用的最佳目录结构实践
教学论文网站制作软件有哪些,写论文用什么软件
?
大型企业网站制作流程,做网站需要注册公司吗?
如何在 Pandas 中基于一列条件计算另一列的分组均值
使用spring连接及操作mongodb3.0实例
Laravel用户密码怎么加密_Laravel Hash门面使用教程
Windows Hello人脸识别突然无法使用
Laravel怎么自定义错误页面_Laravel修改404和500页面模板
如何为不同团队 ID 动态生成多个“认领值班”按钮
图片制作网站免费软件,有没有免费的网站或软件可以将图片批量转为A4大小的pdf?
如何确认建站备案号应放置的具体位置?
网站制作价目表怎么做,珍爱网婚介费用多少?
专业商城网站制作公司有哪些,pi商城官网是哪个?
深圳网站制作平台,深圳市做网站好的公司有哪些?
打开php文件提示内存不足_怎么调整php内存限制【解决方案】
iOS正则表达式验证手机号、邮箱、身份证号等
高防服务器租用如何选择配置与防御等级?
laravel服务容器和依赖注入怎么理解_laravel服务容器与依赖注入解析
如何在阿里云香港服务器快速搭建网站?
详解MySQL数据库的安装与密码配置
七夕网站制作视频,七夕大促活动怎么报名?
如何在七牛云存储上搭建网站并设置自定义域名?
php json中文编码为null的解决办法
MySQL查询结果复制到新表的方法(更新、插入)
音乐网站服务器如何优化API响应速度?
活动邀请函制作网站有哪些,活动邀请函文案?
JS弹性运动实现方法分析
深圳网站制作培训,深圳哪些招聘网站比较好?
Laravel怎么使用Blade模板引擎_Laravel模板继承与Component组件复用【手册】
宙斯浏览器视频悬浮窗怎么开启 边看视频边操作其他应用教程
Laravel怎么实现模型属性转换Casting_Laravel自动将JSON字段转为数组【技巧】
详解Nginx + Tomcat 反向代理 如何在高效的在一台服务器部署多个站点
Laravel怎么调用外部API_Laravel Http Client客户端使用
如何在建站宝盒中设置产品搜索功能?
js实现点击每个li节点,都弹出其文本值及修改
Laravel如何实现事件和监听器?(Event & Listener实战)
Laravel如何保护应用免受CSRF攻击?(原理和示例)
如何实现建站之星域名转发设置?
Zeus浏览器网页版官网入口 宙斯浏览器官网在线通道
Laravel中Service Container是做什么的_Laravel服务容器与依赖注入核心概念解析
JS中对数组元素进行增删改移的方法总结
Laravel如何配置.env文件管理环境变量_Laravel环境变量使用与安全管理
Laravel事件和监听器如何实现_Laravel Events & Listeners解耦应用的实战教程
android nfc常用标签读取总结

