Django运维系统之---批量执行shell脚本,并记录操作用于审计

4 篇文章 0 订阅
3 篇文章 0 订阅

背景

为了进一步完善自己写的小运维系统,今天就继续来补充一个批量执行shell脚本,并记录操作用于审计!

一、思路

实现批量执行shell脚本刚开始的思路是,获取本地脚本的路径,用Paramiko上传脚本,给权限,执行,反馈结果。但是没过一会就醒悟,呀,这不符合一个系统的思路阿!这不是脚本呀!所以需要将本地的脚本上传到系统地址,再上传到服务器进行执行才对!
那么思路就明确啦
1.当建立websocket与ssh连接后,上传脚本到系统
2.由系统上传脚本导服务器
3.给脚本权限并执行脚本
4.反馈脚本信息

二、实现

1.当建立websocket与ssh连接后,上传脚本到系统
一开始是想既然建立了websocket连接了,直接用websocket上传文件就好啦,无奈测试了几遍都没达到效果,估计是我这才刚开始用websocket吧。下面是上传文件的实现的核心:
html:

        <!--选择文件-->
    <label class="form-inline">执行的shell脚本:
        <input id="myfile" type="file"  accept=".sh" style="display: none" multiple>
        <!--显示上传的文件名字-->
        <input type="text" id="showfilename" class="form-control" value="点击选择脚本" readonly="true" onclick="$('input[id=myfile]').click();">
        <button class="btn btn-primary " type="button" id="shangchuan" >上传</button>
        <button class="btn btn-success " type="button"  id="sendbashscrip">执行</button><br>
        (先上传脚本,再执行脚本;<br>上传后将脚本上传到/usr/目录,脚本命名为:名字+上传时间;<br>
        自动给予脚本755权限;)
</label>

js:

    $('input[id=myfile]').change(function () {
        var myfiles = document.getElementById("myfile").files;
        var filename = "";
        filename = myfiles.name;
        $('#showfilename').val(filename);
    })

    function Upload(){
    	var myfiles = document.getElementById("myfile").files;
    	var data = new FormData();
    	data.append('file', myfiles);
        $.ajax({
            type: "POST",
            url: "{% url 'Upload' %}",
            data: data,
            processData: false, 
            contentType: false, 
            dataType:"json",
            success: function(result){
            
                }
        });
}

上传逻辑函数:

@csrf_exempt
def Upload(req):
    global file_name
    file = req.FILES.get('file') 
    nowtime = time.strftime("%Y%m%d%H%M%S")
    uploadshellpath = settings.BASE_DIR + '/static/batchshellscript/'
    if not os.path.exists(uploadshellpath):
        os.makedirs(uploadshellpath)
    if file:  
        file_name = nowtime+file.name
        shellwrite= open(uploadshellpath+file_name, 'wb+')
        for chunk in file.chunks():
            shellwrite.write(chunk)
        shellwrite.close()
        file_path = uploadshellpath + file_name
        json_data = {}
        response_data['filename'] = file_name
        response_data['path'] = file_path
        json_data = json.dumps(response_data) 
        return HttpResponse(json_data)

批量处理脚本逻辑函数:
在昨天batch函数的基础上修改这部分逻辑:

        for shell in request.websocket:
            if shell.decode('utf-8') == 'sendbatchscript':
                addactionshell = models.batchaction()
                addactionshell.hostaddress = hostip
                addactionshell.username = request.session['username']
                addactionshell.actionshell = 'acction:' + globals()['file_name']
                addactionshell.starttime = time.strftime("%Y%m%d%H%M%S")
                addactionshell.save()
                for i in range(hostnum):
                    try :
                        e[i].put(settings.BASE_DIR + r'/static/batchshellscript/'+globals()['file_name'],r'/usr/'+globals()['file_name'])
                        cmd = 'cd /usr;chmod 755 '+ globals()['file_name']+';' + './' + globals()['file_name']
                        b[i], c[i], d[i] = a[i].exec_command(cmd)  # num个对象执行e命令
                        output = '-' * 97 + f'{hostip[i]}执行结果' + '-' * 90 + c[i].read().decode('utf-8') + d[i].read().decode('utf-8')
                        request.websocket.send(output.encode('utf-8'))
                    except:
                        print('脚本执行失败')
                        shellscrpmess = '-' * 97 + f'{hostip[i]}执行结果' + '-' * 94 +'执行失败!'
                        request.websocket.send(shellscrpmess.encode('utf-8'))

            else:
                addactionshell = models.batchaction()
                addactionshell.hostaddress = hostip
                addactionshell.username = request.session['username']
                addactionshell.actionshell = shell.decode('utf-8')
                addactionshell.starttime = time.strftime("%Y%m%d%H%M%S")
                addactionshell.save()
                for i in range(hostnum):
                    b[i], c[i], d[i] = a[i].exec_command(shell)  # num个对象执行e命令
                    # print(f'----------------------{hostip[i]}执行结果----------------------')
                    # print(c[i].read().decode('utf-8'))  # 打印正确输出
                    # print(d[i].read().decode('utf-8'))  # 打印错误输出
                    output = '-'*97 + f'{hostip[i]}执行结果' + '-'*90 + c[i].read().decode('utf-8')  + d[i].read().decode('utf-8')
                    request.websocket.send(output.encode('utf-8'))

效果:
执行一个helloword脚本:
在这里插入图片描述
审计:
在这里插入图片描述
目前实现批量执行shell脚本的思路与实现就是这个样子啦~要实现成什么样子就看大家怎么去做了。
(个人感觉这一个页面按钮太多了。。。但是更高级的技术或者实现技巧目前还不太会,只能慢慢改善吧,有大佬指点指点就更好拉~)

三、结束

好了,今天又实现一个小功能,只能说只是实现了哈,人性化或者隐藏bug多得很!!

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
对于您的问题,我可以为您提供一些指导。如果您想自定义批量导入界面,您可以使用 Django-import-export 库提供的一些功能。 首先,您需要在您的 Django 项目中安装 Django-import-export 库。您可以使用以下命令安装: ``` pip install django-import-export ``` 之后,您可以在您的 Django 应用程序中导入 `django-import-export` 模块并使用提供的类。在您的模型中,您可以使用 `ImportExportModelAdmin` 类来管理导入和导出操作。您可以使用此类的以下属性和方法来自定义批量导入界面: - `import_template_name`:指定导入模板的名称。 - `import_formats`:指定可用于导入的格式。 - `before_import`:指定在导入操作之前执行的方法。 - `after_import`:指定在导入操作之后执行的方法。 例如,在您的模型中,您可以定义一个新的 `ImportExportModelAdmin` 类,并使用以下代码来自定义批量导入界面: ``` from import_export.admin import ImportExportModelAdmin, ImportMixin from import_export import resources class MyModelResource(resources.ModelResource): class Meta: model = MyModel class MyModelAdmin(ImportExportModelAdmin): resource_class = MyModelResource import_template_name = 'myapp/import.html' import_formats = [ 'csv', 'xls' ] def before_import(self, dataset, using_transactions, dry_run, **kwargs): # Do some processing before the import pass def after_import(self, dataset, result, using_transactions, dry_run, **kwargs): # Do some processing after the import pass admin.site.register(MyModel, MyModelAdmin) ``` 在上面的示例中,我们首先创建了一个自定义 `resources.ModelResource`,并将其定义为 `MyModelResource`。接下来,我们创建了一个自定义 `ImportExportModelAdmin` 类,并将其定义为 `MyModelAdmin`。 在 `MyModelAdmin` 类中,我们指定了 `resource_class` 为我们刚刚定义的 `MyModelResource`。我们还对导入模板名称和可用格式进行了自定义,并指定了 `before_import` 和 `after_import` 方法来执行导入操作之前和之后的处理。最后,我们使用 `admin.site.register` 函数将我们的模型注册到管理站点中。 希望这可以帮助您自定义批量导入界面。如果您需要更多帮助,请随时问我。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值