交换机ssh版本信息可被获取_【网络自动化平台开发】—— 功能1:SSH自动配置...

f1decb4eff9e6bede8f87427109c90d4.png

ssh是网络工程师进行网络设备管理的常用协议之一,相对于telnet而言ssh具有更高的安全性,几乎所有企业级的网络设备均支持通过ssh协议来进行管理,相对于web控制台,ssh控制效率更高,倘若我们需要将若干台交换机设备的ntp服务器进行统一设置,如果通过web方式进行管理设置,打开控制台登录,点到相应的页面,进入相应的设置,确定保存退出,下一台,无疑这个工作量是巨大的,使用命令行就会方便多了,通过ssh登录到设备,输入配置需要敲入的命令,完成断开,继续下一台。那么问题来了,是不是我们可以将ssh登录到设备这个操作也自动化完成呢,这样岂不是效率更高?

答案是当然可以,用python其实几句代码就可以实现,如下:

import os,time
import paramiko

def SshPut(Ipaddr,UserName,Password,Command):
    ssh = paramiko.SSHClient()
    ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
    ssh.connect(Ipaddr,22,UserName,Password,timeout=2)
    sshd = ssh.invoke_shell()
    sshd.send(Command+'nn')
    time.sleep(0.5)
    RecvMsg = sshd.recv(4096).decode()
    ssh.close()
    return RecvMsg

#通过下列一行执行 可以从交换机10.192.1.34上获取show ip int br结果
print(SshPut('10.192.1.34','admin','admin','show ip int br'))

那么,本节内容,我们虽用到paramiko但却不是用来批量修改交换机的,而是用来完成其它任务:

  1. 用户通过页面提交用户信息、终端IP等信息到服务器;
  2. 服务器根据接受到的信息对代理服务器进行配置;
  3. 执行服务重启动作,使新加入用户可通过代理服务器上网。

代理服务器使用squid软件,已完成部署。

新建functionsconfig_squid_acl.py

import os,time
import paramiko

def SshPut(Ipaddr,UserName,Password,Command):
    ssh = paramiko.SSHClient()
    ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
    ssh.connect(Ipaddr,22,UserName,Password,timeout=2)
    sshd = ssh.invoke_shell()
    sshd.send(Command+'nn')
    time.sleep(0.5)
    RecvMsg = sshd.recv(4096).decode()
    #print(RecvMsg)
    ssh.close()
    return RecvMsg

def SquidAclAdd(ipaddr,remark,path='/etc/squid/squid.conf'):
    try:
        Resource = SshPut('172.20.1.60','root','password',"sed -i '16i#%s nacl yst src %s/32' %s"%(remark,ipaddr,path))
        #print("sed -i '2i#%s nacl yst src %s/32' %s"%(remark,ipaddr,path))
        time.sleep(1)
        return 1
    except:
        return 0

def SquidServiceRST():
    try:
        SshPut('172.20.1.60','root','password'," service squid restartn")
    except:
        return 0

此功能py中定义了3个函数,一个是通过ssh发送命令,第二个是添加squid的访问控制列表,即,存在列表中的用户IP可以通过代理服务器进行代理,第三个函数,直接重启squid服务器,使配置文件生效。如果添加某个用户,实际上squid服务器上收到的命令为:

sed -i '16i#阿拉宗 nacl yst src 10.194.86.246/32' /etc/squid/squid.conf
service squid restart

实际写入到配置文件中后是这样的:

#阿拉宗
acl yst src 10.194.86.246/32

下面,将功能加入到平台。

到views.py中定义个services函数:

@login_auth 
def services(request):
    return render(request,'services.html')

修改urls.py

from NetApp.views import index,login,login_auth,infosearch,services

# from django.contrib import admin
from django.urls import path

urlpatterns = [
    # path('admin/', admin.site.urls),
    path('',index),
    path('login/',login),
    path('infosearch/',infosearch),
    path('services/',services),
]

此时可以尝试访问http://127.0.0.1/services,如果无报错,这说明路径设置OK。

我们修改 NetApptemplatesservices.html 文件,使其页面上包含用户输入并需要提交的表单。

{% extends 'base.html' %}
<!-- 继承base.html -->

{% block title %}
<title>业务申请</title>
{% endblock %}
<!-- 加入title -->


{% block user %}
{{ fullname }}
{% endblock %}
<!-- 插入user -->

{% block right-menu %}
    {% if type == 'proxy' %}

        <form action="" method="post">
            <label for="fullname" >使用者姓名:</label>
            <ul><input type="text" id="fullname" name="fullname" style="width: 300px;"></ul>
            <label for="fullname" >使用者部门:</label>
            <ul><input type="text" id="department" name="department" style="width: 300px;"></ul>
            <label for="fullname" >终端IP地址:</label>
            <ul><input type="text" id="ipaddr" name="ipaddr" style="width: 300px;"></ul>
            <br/>
            <ul><button type="submit">点此提交</button></ul>
        </form>
    {% endif %}


    {% if userfullname and userdepartment and useripaddr%}
        <h2>申请成功!请将代理设置为172.20.1.60:3128进行网页访问,若需帮助请联系IT服务台。</h2>
        <p>姓名:</p> {{ userfullname }}
        <p>部门</p>{{ userdepartment }}
        <p>ip地址</p>{{ useripaddr }}
    {% else %}

    <p>{{msg}} </p>
    
    {% endif %}

{% endblock %}
<!-- 右侧显示区域内容 -->





{% block left-select %}
    <ul style="line-height: 50px;font-size: 18px;list-style: none;" >
        <li><a href="/services/proxy">海外站点代理</a></li>

    </ul>

{% endblock %}
<!-- 左侧选项菜单,点击海外站点代理会跳转路径/services/proxy  -->

这时,我们重新预览,点击 /service 下的 海外站点代理选单,出现了报错,这很正常,因为在urls.py中,我们并未定义,需要加上去:

from NetApp.views import index,login,login_auth,infosearch,services

# from django.contrib import admin
from django.urls import path

urlpatterns = [
    # path('admin/', admin.site.urls),
    path('',index),
    path('login/',login),
    path('infosearch/',infosearch),
    path('services/',services),
    path('services/<sub_menu>/',services),
]

views.py也需要修改,将函数services中加入sub_menu参数,同时,加入功能:

@login_auth
def services(request,sub_menu=''):
    if request.method == 'GET':
        if sub_menu == 'proxy':
            context = request.COOKIES
            context['type'] = 'proxy'
            return render(request,'services.html',context=context)
        else:
            return render(request, 'services.html', context=request.COOKIES)
        # 处理get信息,若用户直接访问/services/proxy,将context['type'] = 'proxy'和登录cookie返回给前端
    else:#处理post上来的表单
        if sub_menu == 'proxy':
            context = request.COOKIES
            context['userfullname'] = request.POST.get('fullname')
            #获取用户的全名
            context['userdepartment'] = request.POST.get('department')
            #获取用户部门
            context['useripaddr'] = request.POST.get('ipaddr')
            #获取用户填入的终端的IP地址

            try:
                if context['useripaddr'] != '':
                    userip = context['useripaddr'].split('.')
                    for i in userip:
                        if int(i) > 255 or int(i) < 0:
                            return render(request,'services.html',context={'msg':'输入IP地址格式有误'})
                    if len(userip) != 4 or userip[0] != '10':
                        return render(request,'services.html',context={'msg':'输入IP地址格式有误'})
                    for i in userip:
                        i = int(i)
                        if i >= 255 or i <=0:
                            return render(request,'services.html',context={'msg':'输入IP地址非法'})
                else:
                    return render(request,'services.html',context={'msg':'IP地址必填'})
            except:
                return render(request,'services.html',context={'msg':'输入信息有误'})
             #判断用户输入IP地址是否合法,如果不合法则返回错误信息
            
            proxy_add_result = config_squid_acl.SquidAclAdd(context['useripaddr'],context['userfullname'])
            #继续执行代理服务器添加动作

            if proxy_add_result == 1:
                public_log.logging_save('proxy_add','/var/log/NetworkApps/proxy.log','%s添加成功'%request.COOKIES['fullname'])
                config_squid_acl.SquidServiceRST()
                #如果添加成功,则写入到proxy.log日志
            else:
                public_log.logging_save('proxy_add', '/var/log/NetworkApps/proxy.log', '%s添加失败'%request.COOKIES['fullname'])
                newcontext={'proxy-result':'输入信息错误!请重试!'}
                return render(request,'services.html',context=newcontext)
                #如果不成功,则返回错误信息
            
            return render(request,'services.html',context=context)            

    return render(request,'services.html')

下面进行验证,由于会写入日志,所以我们需要自行新建日志文件,并在public_log.py增加相应记录类型。

sudo mkdir /var/log/NetworkApps
sudo touch /var/log/NetworkApps/proxy.log
sudo chmod -R 777 /var/log/NetworkApps/proxy.log

#public_log.py中修改
 
if log_type in ['login','proxy_add']:
        return log_info()

启动服务器,顺利登录进区后,我们进行功能测试,填入申请信息点击提交后,提示

c49741e6d04be2da885408a6399d827e.png

查看服务器日志 cat /var/log/NetworkApps/proxy.log

2020-11-17 02:54:14,191 - proxy_add - INFO - 哎呀呀添加成功

登录并查看squid服务器代理acl:

#哎呀呀 
acl yst src 10.123.4.213/32

写完代理后,访问http://ip138.com,已顺利挂上代理。

cf494d59f5a52b9ddd5637a8608484f0.png

设置完成,这个小功能就顺利完成啦。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值