django小项目,使用paramiko自动备份网络设备配置
原来公司开发团队人员众多,有专门对接运维需求的开发人员,现在想要实现些功能可(只)以(能)自己写了-_- | 周末在家无事,用django搞个简单的功能练练手
django安装,配置
sudo pip3 install dgango
django-admin startproject mysite
django-admin startapp ssh
#models配置 class user(models.Model):
user = models.CharField(max_length=64)
passwd = models.CharField(max_length=64) #setting配置 INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'ssh'
] import os
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [os.path.join(BASE_DIR,'templates')],
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
'django.template.context_processors.debug',
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
],
},
},
] STATIC_URL = '/static/' STATICFILES_DIRS = (
os.path.join(BASE_DIR,"statics"),
)
前端页面
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>backup</title>
<style>
*{margin: 0;}
.top{background-color: whitesmoke; height: 52px;}
.top-left{width: 402px;height: 53px;float: left;}
.top-right{background-color: rgb(83, 83, 236);height: 53px;position:absolute;left:402px ;right: 0;}
.left{background-color: whitesmoke;height: 800px;position:absolute;top: 53px; left: 1px;width: 400px;border: 1px solid;border-color: teal;}
.right{background-color: whitesmoke;position:absolute;left: 403px;right: 0; top: 53px;white-space: pre;height: 800px;overflow: auto;}
.devices{margin-top: 7px;}
.devices:hover{cursor: pointer;}
.back:hover{background-color: teal; cursor: pointer;}
.pop{margin-left: 50px;margin-top: 10px;}
.pop:hover{cursor: pointer;}
.hidden{display: none;}
.site{margin-left: 10px;}
.img{ display: block;height:50px; width:50px; float: right;margin-right: 8px;color: white;border-radius: 30px;text-align: center;line-height: 53px;}
</style>
<script src="/static/jquery-3.6.0.js"></script> </head>
<body>
<div class="top">
<div class="top-left">
<h3 style="text-align: center; line-height: 52px;">配置备份</h3>
</div>
<div class="top-right">
<p class='img'>dark</p>
<img class='img' src="/static/dark.jpg">
</div>
</div>
<div class="left"> <div class="zz pop" >
<p class="button">郑州pop</p>
<form class="hidden site" action="/backup/" method="POST">
<p><input type="checkbox" value="1-10.0.3.101" name="host">juniper </p>
<p><input type="checkbox" value="2-10.0.3.102" name="host1">cisco</p>
<input class="back" type='submit' value="submit">
{%csrf_token%}
</form>
</div>
<div class="FS pop" >
<p class="button">广州pop</p>
<form class="hidden site" action="/backup/" method="POST">
<p><input type="checkbox" value="10.0.3.101" name="host">juniper </p>
<p><input type="checkbox" value="10.0.3.102" name="host">cisco</p>
<input class="back" type='submit' value="submit">
{%csrf_token%}
</form>
</div>
<div class="FS pop" >
<p class="button">北京pop</p>
<form class="hidden site" action="/backup/" method="POST">
<p><input type="checkbox" value="10.0.3.101" name="host">juniper </p>
<p><input type="checkbox" value="10.0.3.102" name="host">cisco</p>
<input class="back" type='submit' value="submit">
{%csrf_token%}
</form>
</div>
<div class="FS pop" >
<p class="button">上海pop</p>
<form class="hidden site" action="/backup/" method="POST">
<p><input type="checkbox" value="10.0.3.101" name="host">juniper </p>
<p><input type="checkbox" value="10.0.3.102" name="host">cisco</p>
<input class="back" type='submit' value="submit">
{%csrf_token%}
</form>
</div>
<div class="FS pop" >
<p class="button">深圳pop</p>
<form class="hidden site" action="/backup/" method="POST">
<p><input type="checkbox" value="10.0.3.101" name="host">juniper </p>
<p><input type="checkbox" value="10.0.3.102" name="host">cisco</p>
<input class="back" type='submit' value="submit">
{%csrf_token%}
</form>
</div>
<div class="FS pop" >
<p class="button">青岛pop</p>
<form class="hidden site" action="/backup/" method="POST">
<p><input type="checkbox" value="10.0.3.101" name="host">juniper </p>
<p><input type="checkbox" value="10.0.3.102" name="host">cisco</p>
<input class="back" type='submit' value="submit">
{%csrf_token%}
</form>
</div>
<div class="FS pop" >
<p class="button">海外pop</p>
<form class="hidden site" action="/backup/" method="POST">
<p><input type="checkbox" value="10.0.3.101" name="host">juniper </p>
<p><input type="checkbox" value="10.0.3.102" name="host">cisco</p>
<input class="back" type='submit' value="submit">
{%csrf_token%}
</form>
</div>
</div>
</div>
<div class="right">
{{show}}
</div> <script>
$('.pop .button').click(function(){
$(this).siblings().slideToggle()
}) </script> </body>
</html>
url路由
urlpatterns = [
path('admin/', admin.site.urls),
path('menu/', menu.menu),
path('backup/', menu.backup),
path('login/', menu.login),
]
后端代码
import paramiko,time,datetime
from ssh import models #SSH功能
def Testsshcon(ip,port,username,key):
try:
sshcon=paramiko.SSHClient()
sshcon.set_missing_host_key_policy(paramiko.AutoAddPolicy())
#判断不同设备型号,执行不同命令
if ip[0]=="1":
cmds=['show conf | dis set | no-more\n','\n']
ip = ip[2:]
if ip[0]=="2":
cmds=['terminal length 0\n','show run\n']
ip = ip[2:]
sshcon.connect(ip,port,username,key,compress=True)
conn=sshcon.invoke_shell()
res = ''
for cmd in cmds:
time.sleep(1)
conn.send(cmd)
time.sleep(1.3)
out=conn.recv(100000)
res += out.decode('utf-8')
return(res)
sshcon.close()
except Exception as e:
return ("connet error",e)#接收前端POST内容,调用ssh函数,返回处理后页面
def backup(request):
html_show = '配置文件'
if request.method == 'POST':
private_key = paramiko.RSAKey.from_private_key_file('/home/dark/.ssh/id_rsa')
host = request.POST.dict()
del host['csrfmiddlewaretoken']
html_show = ''
#多选备份功能
for x in host:
res = Testsshcon(host[x],22,'dark2',private_key)
#写入备份文件
file = '/home/dark/backup/'+ datetime.datetime.now().strftime("%Y-%m-%d")+'-'+host[x]
with open(file,'w') as a:
a.write(res)
html_show +=res
return render(request,'backup.html',{'show':html_show}) #登录验证使用
def login(request):
tip = '用户名或密码错误'
if request.method == 'POST':
user = request.POST.get('username',None)
user_passwd = request.POST.get('passwd',None)
print(user,user_passwd)
userinfo=models.user.objects.get(user=user)
passwd = userinfo.passwd
if user_passwd == passwd:
return redirect('/backup')
else:
return render(request,'login.html',{'passwd':tip})
return render(request,'login.html')
最终页面效果

django小项目,使用paramiko自动备份网络设备配置的更多相关文章
- Django小项目练习
Django学生管理系统 urlpatterns = [ url(r'^admin/', admin.site.urls), url(r'^class_list/', views.class_list ...
- Python之路【第十八篇】Django小项目webQQ实现
WEBQQ的实现的几种方式 1.HTTP协议特点 首先这里要知道HTTP协议的特点:短链接.无状态! 在不考虑本地缓存的情况举例来说:咱们在连接博客园的时候,当tcp连接后,我会把我自己的http头发 ...
- Python之路【第十八篇】Django小项目简单BBS论坛部分内容知识点
开发一个简单的BBS论坛 项目需求: 整体参考“抽屉新热榜” + “虎嗅网” 实现不同论坛版块 帖子列表展示 帖子评论数.点赞数展示 在线用户展示 允许登录用户发贴.评论.点赞 允许上传文件 帖子可被 ...
- Django小项目web聊天
WEBQQ的实现的几种方式 1.HTTP协议特点 首先这里要知道HTTP协议的特点:短链接.无状态! 在不考虑本地缓存的情况举例来说:咱们在连接博客园的时候,当tcp连接后,我会把我自己的http头发 ...
- Django小项目简单BBS论坛
开发一个简单的BBS论坛 项目需求: 1 整体参考"抽屉新热榜" + "虎嗅网" 2 实现不同论坛版块 3 帖子列表展示 4 帖子评论数.点赞数展示 5 在线用 ...
- 使用SecureCRT脚本备份网络设备配置的一点感悟
https://blog.csdn.net/qq_25294171/article/details/85158458
- Django 小实例S1 简易学生选课管理系统 0 初步介绍与演示
Django 小实例S1 简易学生选课管理系统 第0章--初步介绍与演示 点击查看教程总目录 作者自我介绍:b站小UP主,时常直播编程+红警三,python1对1辅导老师. 1 初步介绍 先介绍下这个 ...
- Django 小实例S1 简易学生选课管理系统 2 新建项目(project)并进行设置
Django 小实例S1 简易学生选课管理系统 第2节--新建项目(project)并进行设置 点击查看教程总目录 作者自我介绍:b站小UP主,时常直播编程+红警三,python1对1辅导老师. 0 ...
- Django集成celery实战小项目
上一篇已经介绍了celery的基本知识,本篇以一个小项目为例,详细说明django框架如何集成celery进行开发. 本系列文章的开发环境: window 7 + python2.7 + pychar ...
随机推荐
- 为什么HTTP/3要基于UDP?可靠吗?
目录 前言 为什么转用UDP? HTTP/3解决了那些问题? 队头阻塞问题 QPACK编码 Header 参考 推荐阅读: 计算机网络汇总 HTTP/3竟然是基于UDP的!开始我也很疑惑,UDP传输不 ...
- MCU选型
含义: MCU(Micro Controller Unit)中文名称为微控制单元,又称单片微型计算机(Single Chip Microcomputer),是指随着大规模集成电路的出现及其发展,将计算 ...
- Quartz高可用定时任务快速上手
定时任务使用指南 如果你想做定时任务,有高可用方面的需求,或者仅仅想入门快,上手简单,那么选用它准没错. 定时任务模块是对Quartz框架进一步封装,使用更加简洁. 1.引入依赖 <depend ...
- 检查浏览器支持Webp
什么是Webp? Webp 是一种支持有损压缩和无损压缩的图片文件格式,派生自图像编码格式 VP8.根据 Google 的测试,无损压缩后的 WebP 比 PNG 文件少了 45% 的文件大小,即使这 ...
- 如何监控微信小程序HTTP请求错误
摘要: Fundebug的微信小程序错误监控插件更新至0.5.0,支持监控HTTP请求错误. 接入插件 接入Fundebug的错误监控插件非常简单,只需要下载fundebug.0.5.0.min.js ...
- 正则系列——JavaScript正则表达式入门心得
我发现有个别字符被这个编辑器给刷掉了,但是灰色区域显示正常,以灰色区域代码为准 什么玩意? 在我刚开始学习编程的时候,就听过正则了,也听说正则很牛逼,懂正则的更牛逼.但是苦于没有人指点,也没有使用正则 ...
- 项目-MyBlog
项目 地址:https://gitee.com/zwtgit/my-blog 由Docker + SpringBoot2.0 + Mybatis + thymeleaf 等技术实现, 功能齐全.部署简 ...
- 我们可以定向调度某个pod在某个node上进行创建
集群环境:1.k8s用的是二进制方式安装 2.操作系统是linux (centos)3.操作系统版本为 7.2/7.4/7.94.k8s的应用管理.node管理.pod管理等用rancher.k8s令 ...
- Sql获取表所有列名字段——select * 替换写法,Sqlserver、Oracle、PostgreSQL、Mysql
实际开发中经常用到select * from table,往往需要知道具体的字段,这个时候再去数据库中翻或者查看数据字典比较麻烦.为了方便,自己特意写了一个小函数f_selectall,针对SqlSe ...
- 函数 装饰器 python
今日内容概要 1.闭包函数 2.闭包函数的实际应用 3.装饰器简介(重点加难点) 4.简易版本装饰器 5.进阶版本装饰器 6.完整版本装饰器 7.装饰器模板(拷贝使用即可) 8.装饰器语法糖 9.装饰 ...