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 ...
随机推荐
- Emscripten教程之入门指导
翻译:云荒杯倾本文是Emscripten-WebAssembly专栏系列文章之一,更多文章请查看专栏.也可以去作者的博客阅读文章.欢迎加入Wasm和emscripten技术交流群,群聊号码:93920 ...
- 微信小程序调研
小程序入口 微信发现,小程序 公众号主体查看小程序 好友分享,群分享 公众号自定义菜单跳转 APP页面跳转 第三方服务 附近的小程序 扫普通链接二维码打开小程序 需要后台开启功能,开启后,用户在微信& ...
- 网络安全—xss
1.xss的攻击原理 需要了解 Http cookie ajax,Xss(cross-site scripting)攻击指的是攻击者往Web页面里插入恶意html标签或者javascript代码.比如 ...
- .NET程序设计实验一
实验一 语言基础 一.实验目的 1. 熟悉Visual Stido.NET 实验环境: 2. 掌握控制台程序的编写方法: 3. 掌握C#程序设计语言的语法基础: 4. 掌握控制语句和数组的使用. 二 ...
- 进入React的世界
一. React 是什么 1. 声明式写法 2. 组件化 3. 一次学习, 随处编写 二. 为什么要学习React 1. 大厂加持 - Facebook 2. 最流行, 使用人数最多, 最被开发者喜爱 ...
- 小程序picker的使用
效果图: 代码: <view class='infoItem'> <view class='infoItem-left'><text style='color:red'& ...
- Python 图_系列之基于<链接表>实现无向图最短路径搜索
图的常用存储方式有 2 种: 邻接炬阵 链接表 邻接炬阵的优点和缺点都很明显.优点是简单.易理解,对于大部分图结构而言,都是稀疏的,使用炬阵存储空间浪费就较大. 链接表的存储相比较邻接炬阵,使用起来更 ...
- 在uniapp的节流函数
为了解决同一个人连续多次的点击同一个事件会造成的问题,js解决的方法有防抖和节流,防抖和节流都是在一定的时间上控制次数 节流是在定义的时间内连续点击多次事件,只会执行一次 在uniapp的工具文件夹u ...
- webpack打包学习
从上图我们可以看出,webpack 可以将多种静态资源 js.css.sass文件等转换成一个静态文件,以此可以减少页面的请求,从而提高浏览器响应速度 1.安装开发依赖包 npm install we ...
- MassTransit 入门(一)
本文地址源码 MassTransit是一个面向.net的免费开源分布式应用程序框架. MassTransit使得创建应用程序和服务变得很容易,这些应用程序和服务利用基于消息的.松散耦合的异步通信来获得 ...