Django-linux主机计划任务查看服务

这篇具有很好参考价值的文章主要介绍了Django-linux主机计划任务查看服务。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

需求

功能介绍

页面效果

代码编写

docker部署


需求

  线上主机一百台左右,经常会在某个服务器上放置一些自动化脚本,并配置计划任务,时间长可能忘记计划任务所在服务器,所以开发一个用于收集展示crontab任务的服务

语言框架

python3.9 / Django

模块:Django~=4.2.3、paramiko~=3.2.0

版本别差太多就行

功能介绍

  具有收集功能,并将收集到的信息写入到文件中,用于存储

  打开主页会获取文件中的任务信息,并渲染到页面

  首次打开主页并不会获取到任务信息,需要点击‘重新获取’按钮进行任务获取和存储

  当服务器增加或减少任务,可点击‘重新获取’来更新最新的任务

页面效果

Django-linux主机计划任务查看服务,python简单开发日记,linux,运维,python,django

代码编写

编译器 pycharm 创建django服务

服务目录结构:

Django-linux主机计划任务查看服务,python简单开发日记,linux,运维,python,django

crontab/urls.py

from django.contrib import admin
from django.urls import path
from host_cron import views as crontab


urlpatterns = [
    path('admin/', admin.site.urls),
    path('crontab_get/', crontab.crontab_get, name='crontab_get'),
    path('', crontab.crontab_select)
]

crontab/config.py

该文件用于保存主机列表、登陆用户名、登陆密钥、存储任务信息的文件路径

因这些配置可能会根据不同环境变化,所以该文件在用docker启动时采用外挂的方式

def Host_Add():
    '''
    用于crontab views中 crontab_get调用
    :return: 主机ip列表
    '''
    hostname_list = ['172.100.0.2',
                     '172.100.0.3']
    return hostname_list

def Host_User():
    '''
    用于crontab views中 crontab_get调用
    :return: 主机登陆用户名
    '''
    user = 'root'
    return user

def Host_Key_Path():
    '''
    用于crontab views中 crontab_get调用
    :return: 主机登陆密钥路径
    '''
    key_path = '/data/id_rsa'
    return key_path

def File_Path():
    '''
    用于crontab views中 crontab_get调用
    :return: 用于存放收集到的计划任务,避免每次访问都重新获取主机计划任务
    '''
    file_path = "/data/filename.txt"
    return file_path

host_cron/utils/select_crontab.py

import paramiko
import logging


def get_remote_crontab_tasks(hostname_list, username, private_key_path):
    '''
    用于获取主机上的crontab计划任务
    :param hostname_list: 主机列表['1.1.1.1', '2.2.2.2']
    :param username: 主机用户
    :param private_key_path: 远程密钥
    :return: 返回dict,{'hostname1': [crontab], 'hostname2': [crontab]}
    '''
    try:
        # 创建SSH客户端对象
        client = paramiko.SSHClient()
        # 自动添加和保存远程服务器的SSH密钥
        client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
        # 使用私钥文件进行身份验证
        private_key = paramiko.RSAKey.from_private_key_file(private_key_path)

        crontab_dict = {}
        for hostname in hostname_list:
            try:
                # 连接远程服务器
                client.connect(hostname, username=username, pkey=private_key, timeout=5)
                # 执行命令获取crontab任务
                stdin, stdout, stderr = client.exec_command('crontab -l')
                # 获取命令输出结果
                crontab_tasks = stdout.read().decode().splitlines()
                crontab_dict[hostname] = crontab_tasks
                # 关闭SSH连接
                client.close()
            except:
                crontab_dict[hostname] = ['err: 登陆失败']
        return crontab_dict

host_cron/views.py

from host_cron.utils.select_crotnab import get_remote_crontab_tasks
from crontab.config import Host_Add, Host_User, Host_Key_Path, File_Path
from django.shortcuts import render
import json
import os

def crontab_select(request):
    '''
    首页,用于直接从计划任务存储文件中读取计划任务,如果文件不存在则创建,并传入空字典,写入时需要转为json,读取时需要转为字典
    :param request: 读取文件
    :return: 计划任务字典到html
    '''
    file_path = File_Path()
    if os.path.exists(file_path):
        # 从文件中读取字符串内容
        with open(file_path, "r") as file:
            str_data = file.read()
        # 将字符串解析为字典类型
        crontab_tasks_dict = json.loads(str_data)

        return render(request, 'crontab.html', {'crontab_tasks_dict': crontab_tasks_dict})
    else:
        crontab_tasks_dict = {}
        # 打开写入文件
        file = open(File_Path(), "w")
        file.write(json.dumps(crontab_tasks_dict))
        file.close()

        return render(request, 'crontab.html', {'crontab_tasks_dict': crontab_tasks_dict})


def crontab_get(request):
    '''
    获取主机上的计划任务,并以json格式写入到文件中
    :param request:
    :return:
    '''
    # 远程服务器的连接参数
    hostname_list = Host_Add()  # 替换为实际的远程服务器主机名或IP地址
    username = Host_User()  # 替换为实际的远程服务器用户名
    private_key_path = Host_Key_Path()  # 替换为实际的私钥文件路径

    # 获取远程服务器上的crontab任务
    crontab_tasks_dict = get_remote_crontab_tasks(hostname_list, username, private_key_path)
    # 打开文件
    file = open(File_Path(), "w")
    # 写入内容
    file.write(json.dumps(crontab_tasks_dict))
    # 关闭文件
    file.close()

    return render(request, 'crontab.html',  {'crontab_tasks_dict': crontab_tasks_dict})

templates/crontab.html

html中使用js,点击按钮但不跳转链接,执行完成后自动请求刷新当前页面。

缺点:点击‘重新获取’按钮等待返回时没有获取中...的提示,懒了没搞。

<!DOCTYPE html>
<html>
<head>
    <title>Crontab Tasks</title>
    <style>
        table {
            width: 100%;
            border-collapse: collapse;
        }

        th, td {
            padding: 8px;
            text-align: left;
            border-bottom: 1px solid #ddd;
        }

        th {
            background-color: #f2f2f2;
        }

        ul {
            list-style-type: none;
            padding: 0;
            margin: 0;
        }

        ul li {
            margin-left: 20px;
        }

        .custom-button {
            background-color: blue;
            color: white;
            padding: 10px 20px;
            margin-top: 10px;
            margin-bottom: 10px;
            border: none;
            cursor: pointer;
        }
    </style>
    <script>
    function triggerURL() {
        fetch('/crontab_get/')
            .then(response => {
                if (response.ok) {
                    console.log('URL triggered successfully');
                    // 执行其他操作,根据需要进行处理
                    location.reload(); // 重新加载当前页面
                } else {
                    console.error('URL triggering failed');
                }
            })
            .catch(error => {
                console.error('Error:', error);
            });
    }
    </script>
</head>
<body>
    <button class="custom-button" onclick="triggerURL()">重新获取</button>
    <table>
        <thead>
            <tr>
                <th>IP Address</th>
                <th>Crontab Tasks</th>
            </tr>
        </thead>
        <tbody>
            {% for ip, tasks in crontab_tasks_dict.items %}
            <tr>
                <td>{{ ip }}</td>
                <td>
                    <ul>
                        {% for task in tasks %}
                        <li>{{ task }}</li>
                        {% endfor %}
                    </ul>
                </td>
            </tr>
            {% empty %}
            <tr>
                <td colspan="2">No data available</td>
            </tr>
            {% endfor %}
        </tbody>
    </table>
</body>
</html>

docker部署

将代码目录压缩成crontab.tar.gz

Dockerfile

FROM python:3.9.13

RUN mkdir /data
RUN pip3 install Django paramiko -i https://mirrors.aliyun.com/pypi/simple/
ADD crontab.tar.gz /data

CMD python3 /data/crontab/manage.py runserver 0.0.0.0:18888

将代码中的config.py提取出来,根据你的docker启动命令定义和修改

构建镜像

docker build -t crontab:v1 .

启动

docker run -d \
--name crontab \
--network=host \
-v /data/crontab_py/id_rsa:/data/id_rsa \
-v /data/crontab_py/config.py:/data/crontab/crontab/config.py \
crontab:v1

网络直接用host宿主机网络,使用容器网络ip因为是陌生ip,会触发云上服务器的异常登陆报警。

浏览器 ip:18888 访问即可

搞定!文章来源地址https://www.toymoban.com/news/detail-564305.html

到了这里,关于Django-linux主机计划任务查看服务的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Linux——进程和计划任务管理

    个人简介:云计算网络运维专业人员,了解运维知识,掌握TCP/IP协议,每天分享网络运维知识与技能。 座右铭:海不辞水,故能成其大;山不辞石,故能成其高。 个人主页:小李会科技的主页 目录 程序和进程的关系  命令总结 进程的启动方式 快捷键的讲解 程序和进程的关

    2024年02月05日
    浏览(51)
  • linux 管理进程和计划任务

    目录 一、进程原理 二、进程工作过程 三、进程类型 四、管理进程 五、前后台调度 六、定时任务 七、管理定时任务                 一、进程原理 进程:指正在运行的程序称之为进程 程序:指的是没有运行的代码 线程:真正的执行者,是复制了一部分进程的代码,可以

    2024年02月03日
    浏览(92)
  • Linux 进程和计划任务管理

    保存在硬盘、光盘等介质中的可执行代码和数据· 文件中静态保存的代码 在CPU及内存中运行的程序代码 动态执行的代码 父、子进程         每个程序可以创建一个或多个进程 load average: 0.00, 0.01, 0.05      系统平均负载  1分钟 5分钟 15分钟 查看 load average 的命令有:top  w

    2024年04月23日
    浏览(42)
  • Linux程序、进程和计划任务

    目录 一.程序和进程 1.程序的概念 2.进程的概念 3.线程的概念 4.单线程与多线程 5.进程的状态 二.查看进程信息相关命令: 1.ps:查看静态进程信息状态 2.top:查看动态进程排名信息 3.pgrep:查看指定进程  4.pstree:以树形结构列出进程信息  6.iostat:显示所有设备负载情况  三

    2024年01月19日
    浏览(49)
  • Linux的例行性工作(计划任务)

    目录 一、单一执行的例行性任务--at(一 次性) 1、安装 2、启动服务 3、at命令详解 1)格式 2)参数 3)时间格式 4、实例 二、循环执行的例行性任务-- crontab(周期性) 1、crontd服务 2、工作过程 3、crontab命令详解 编辑crontab 书写定时任务的注意事项 系统级别的计划任务 查看

    2024年01月25日
    浏览(59)
  • Linux计划任务(Cron):小白完全指南

    在Linux系统中,计划任务(Cron)是一种强大的工具,可以自动执行预定的任务。它非常适合定期运行脚本、备份数据、清理临时文件等一系列重复性任务。本文将向您介绍如何使用Cron来安排和管理计划任务,以帮助小白用户轻松上手。 一、了解基本概念 Cron表达式:Cron使用

    2024年02月07日
    浏览(49)
  • 2.Linux的例行性工 作(计划任务)

    目录 1. 场景: 2. 单一执行的例行性任务--at(一次性) 2.1. 安装 2.2. at命令详解 2.2.1. 格式 2.2.2. 参数 2.2.3. 时间格式 2.2.4. 实验1 2.2.5. 实验2 2.2.6. 注意 2.2.7. at命令执行过程分析 2.2.8. 实验3 3. 循环执行的例行性任务-- crontab(周期性) 3.1. crontd服务 3.2. crontab工作过程 3.3. crontab命

    2024年01月24日
    浏览(41)
  • Linux--crontab命令详解--循环执行的计划任务

    循环执行任务是由cron(crond)这个系统服务来控制的。用户想要建立循环的计划任务时,使用的是crontab这个命令,为了避免安全性的问题,和at一样,我们可以限制使用crontab的账号,可以使用的配置文件有: /etc/cron.allow 将可以使用crontab的账号写入,不在这个文件中的账户则不能使用cr

    2024年02月16日
    浏览(47)
  • 1.4 - 操作系统 - Linux计划任务,CronTab用法详解

    「作者简介」: CSDN top100、阿里云博客专家、华为云享专家、网络安全领域优质创作者 「订阅专栏」: 此文章已录入专栏《网络安全入门到精通》 Linux系统使用CronTab命令来操作计划任务。 crontab对应的服务是crond,服务关闭时,计划任务将不可用。 参数 -l (listÿ

    2024年02月07日
    浏览(47)
  • 持久化:Linux利用SUID、任务计划、vim进行权限维持

    目录 利用Linux SUID进行权限维持 利用Linux计划任务进行权限维持 利用Vim创建后门 利用CVE-2019-12735进行权限维持 使用Vim运行Python后门程序 在前面我们使用Linux的SUID权限进行了权限提升,然后SUID还可以用来进行持久化 利用SUID我们可以解除低权限用户获取高权限,但是这种手段

    2024年02月20日
    浏览(59)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包