一:本文目的
通过django展示服务器状态,比如cup和内存;就是说,尽可能减少运维或开发人员登录服务器,以免误操作引起故障。
二:结果展示
三:过程概述
1.用户点击web标签页,跳转到django定义好的url关联views视图。
2.通过views视图执行项目里的python脚本,并返回执行结果到前端。
3.前端通过jinjia语法展示脚本返回的内容。
四:过程细节
url:
#执行项目里的脚本,并把结果展示在页面上.
path('saemonitor/execute_script_for_ssh_server_do_top', saemonitor_views.execute_script_for_ssh_server_do_top),
views视图:
def execute_script_for_ssh_server_do_top(request):
import subprocess
result = subprocess.run(['python', 'saemonitor/templates/saemonitor/sshServerDoCommand_top.py'],
stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True)
try:
# 如果脚本成功执行,返回输出
if result.returncode == 0:
output = result.stdout
print(output)
message = f"执行脚本:{result.args}"
#return HttpResponse(output) # 这里output的内容是执行脚本输出的内容(比如脚本里echo的内容),此时通过HttpResponse返回给前端页面,这种方式前端页面收到的结果格式很乱,不用了。
return render(request, 'saemonitor/jieshou_mingling2.html', locals()) # 返回前端页面,locals()表示将当前作用域中的所有变量都传给前端页面。
# 如果脚本执行出错,返回错误信息
else:
# 脚本执行失败,处理错误信息
error = result.stderr
return HttpResponse('Error: ' + error)
except Exception as e:
# 如果有异常,返回异常信息
return HttpResponse(str(e))
python脚本(templates目录下):
#coding:utf-8
import paramiko # 用于执行远程命令的库 , 安装命令:pip3 install paramiko -i http://mirrors.aliyun.com/pypi/simple/ --trusted-host mirrors.aliyun.com
#使用paramiko的ssh协议远程到服务器执行命令,输出的结果和服务器上执行命令得到的结果,格式是一样的。
def execute_command_remote(hostname, username, password, command):
# 创建SSH客户端对象
client = paramiko.SSHClient()
# 允许连接到未知的服务器(不推荐在生产环境中使用)
client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
try:
# 连接到服务器
client.connect(hostname=hostname,port=port, username=username, password=password, timeout=10)
# 执行命令
stdin, stdout, stderr = client.exec_command(command)
# 获取命令输出和错误(如果有)
output = stdout.read().decode('utf-8')
errors = stderr.read().decode('utf-8')
if errors:
print(f"Errors: {errors}")
else:
print(f"Output: {output}")
except Exception as e:
print(f"An error occurred: {e}")
finally:
# 关闭连接
client.close()
# 使用示例
hostname = '192.168.1.1' # 测试服务器IP地址或主机名
username = 'root' # SSH用户名
password = '7W52Zal' # SSH密码(建议使用密钥对进行更安全的认证)
port = 22 # SSH端口,默认是22
# 要执行的命令,例如'ls -l'列出目录详情
# 服务器上直接执行的命令: top -n 1 |grep "load average" && echo "----top15--cpu-----" && ps aux|head -1;ps aux|grep -v PID|sort -rn -k +3|head -15 && echo "----top15-mem-----" && ps aux|head -1;ps aux|grep -v PID|sort -rn -k +4|head -15
command = 'echo > /tmp/1.txt && echo "----top15--cpu-----" >> /tmp/1.txt && ps aux|head -1 >> /tmp/1.txt && ps aux|grep -v PID|sort -rn -k +3|head -15 >> /tmp/1.txt && echo "----top15-mem-----" >> /tmp/1.txt && ps aux|head -1 >> /tmp/1.txt && ps aux|grep -v PID|sort -rn -k +4|head -15 >> /tmp/1.txt && cat /tmp/1.txt '
execute_command_remote(hostname, username, password, command)
模板返回的html页面
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>django project</title>
</head>
<body>
<h4>{{ message }}</h4> <!-- 这里是Jinja2语法,用于显示Python传递过来的值 -->
<!-- # 打印出后端传来的Ouput和Errors。-->
{% if errors %}
<p><strong>Errors:</strong></p>
<pre>{{ errors }}</pre>
{% else %}
<p><strong>执行结果:</strong></p>
<pre>{{ output }}</pre>
{% endif %}
</body>
</html>
汇报完毕,欢迎大家提问或指导,谢谢。 cupli 20240717