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 ...
随机推荐
- 学习zabbix(六)
实验环境 实验用2到2台机器,实验所用机器系统环境如下,可以看到2台机器的主机名和IP地址 ? 1 2 3 4 5 6 7 8 9 10 [root@linux-node1 ~]# cat /etc/ ...
- Effective Java —— 优先考虑依赖注入来引用资源
本文参考 本篇文章参考自<Effective Java>第三版第五条"Prefer dependency injection to hardwiring resources&qu ...
- Leetcode刷题之链表增加头结点的前缀节点
链表之增加头结点的前缀节点 在许多链表题中往往需要在题目给的头结点之前增加一个前缀节点 通常在删除链表和头结点需要交换时需要用到这一操作 因为增加这个节点就避免了对删除头结点这种特殊情况的特殊处理 而 ...
- javaweb图书管理系统之账号密码验证登录
验证账号与密码是否正确功能 一.注册功能 首先,在验证账号与密码是否正确的前提下的,需要先注册一个账号,如果没有账号,就会进不去,也无法验证. 其实,注册功能就是一个添加的功能,仿照我的第一篇文章,往 ...
- idea 配置mapper.xml代码提示
从代码跳转mapper文件的插件: 在mapper文件中添加dtd约束: 1.下载dtd约束文件 http://mybatis.org/dtd/mybatis-3-config.dtd http: ...
- 中小学数学卷子自动生成程序--对G同学的代码分析
前几天,在课程要求下完成了个人项目的项目工程编写,即一个中小学数学卷子自动生成程序. 程序主要功能是用户预设账户登录后可以选择等级进行对应的小中高的数学卷子对应出题生成txt文本. 本文针对partn ...
- 学生管理系统 C++课设
#include<stdio.h> #include<stdlib.h> #include<string.h> #include<iostream> u ...
- 使用pyinstaller库打包文件
1.pyinstaller的安装 先win+r打开cmd,安装具体命令如下: pip3 install pyinstaller 2.使用pyinstaller库打包文件 假设Python源文件LPR ...
- [转]Fabric2.3中使用test-network搭建测试网络
这个测试网络一方面可以用来学习Fabric,另一方面也可以让一些更有经验的开发者来测试他们的智能合约和应用,但是不建议用于生产环境,在2.0版本后,这个测试网络也取代了原来的"first-n ...
- LC-454
题目 给你四个整数数组 nums1.nums2.nums3 和 nums4 ,数组长度都是 n ,请你计算有多少个元组 (i, j, k, l) 能满足: 0 <= i, j, k, l < ...