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 ...
随机推荐
- JS传参技巧总结
1.隐式创建 html 标签 <input type="hidden" name="tc_id" value="{{tc_id}}"& ...
- 人机交互大作业--flash嵌入web(纯界面)
界面: 源代码:最近较忙,后续会上传至github
- SecureCRT显示连接失败的原因
问题描述:连接后像192.168.111.140那样的红色图标 原因:没有开启对应的虚拟机 解决办法:打开对应的虚拟机
- 前后端分离mockjs以及webpack-dev-server代理
一: 在webpack中使用mockjs mockjs 也就是模拟数据(mock.js模拟的数据可以不跨域) 安装mock新建mock.js var Mock = require('mockjs') ...
- 微服务架构学习与思考(09):分布式链路追踪系统-dapper论文学习
一.技术产生的背景 1.1 背景 先来了解一下分布式链路追踪技术产生的背景. 在现在这个发达的互联网世界,互联网的规模越来越大,比如 google 的搜索,Netflix 的视频流直播,淘宝的购物等. ...
- ansble通过脚本定时清理k8s日志
环境:环境k8s1.17,ansble通过脚本定时清理k8s日志 [root@tidb-21 delete-k8s-logs]# lsansib-delete.sh delete-logs.sh [r ...
- Java-GUI编程之菜单组件
前面讲解了如果构建GUI界面,其实就是把一些GUI的组件,按照一定的布局放入到容器中展示就可以了.在实际开发中,除了主界面,还有一类比较重要的内容就是菜单相关组件,可以通过菜单相关组件很方便的使用特定 ...
- js模块系统 - amd|cmd|commonjs|esm|umd
写过前端代码大概率听说过amd cmd umd commonjs esm这些名词, 想当初我第一次看到这些的时候, 人都麻了, 都是些啥啊. 后来我知道了, 这些都是js的模块规范. amd - 浏览 ...
- netty系列之:java中的base64编码器
简介 什么是Base64编码呢?在回答这个问题之前,我们需要了解一下计算机中文件的分类,对于计算机来说文件可以分为两类,一类是文本文件,一类是二进制文件. 对于二进制文件来说,其内容是用二进制来表示的 ...
- Typora基本使用语法(超好用的代码编辑工具)
Typora代码编辑软件,一款适合新手小白的做笔记工具,操作简单,大家可以去试试......