本次实验将使用Django 3.0 配合 dwebsocket websocket组件,实现一个网页版的SSH命令行工具,其支持 vim , 支持 ping等交互命令,唯一的一个小缺点是略卡,不知道是我电脑问题还是这个socket框架不稳定呢。
解决方案了 https://github.com/huashengdun/webssh
基本用法
<html>
<head>
<link rel="stylesheet" href="https://www.blib.cn/cdn/xterm.css" />
<script src="https://www.blib.cn/cdn/xterm.js"></script>
<script src="https://www.blib.cn/cdn/jquery.js"></script>
</head>
<body>
<div id="terminal"></div>
<script type="text/javascript">
var window_width = $(window).width();
var window_height = $(window).height();
var term = new Terminal(
{
cols: Math.floor(window_width/9),
rows: Math.floor(window_height/20),
useStyle:true,
cursorBlink:true
}
);
term.open(document.getElementById('terminal'));
term.write('Hello lyshark \x1B[1;3;31mxterm.js\x1B[0m $ ')
</script>
</body>
</html>
命令执行
<html>
<head>
<link rel="stylesheet" href="https://www.blib.cn/cdn/xterm.css" />
<script src="https://www.blib.cn/cdn/xterm.js"></script>
<script src="https://www.blib.cn/cdn/jquery.js"></script>
</head>
<body>
<input type="button" value="执行命令" onclick="show()">
<div id="terminal"></div>
<script type="text/javascript">
var window_width = $(window).width();
var window_height = $(window).height();
var term = new Terminal(
{
cols: Math.floor(window_width/9),
rows: Math.floor(window_height/20),
useStyle:false,
cursorBlink:false
}
);
term.open(document.getElementById('terminal'));
function show(){
$.ajax({
url:"/term/",
type:"POST",
contentType:"application/json;",
data: "ok",
success:function (res) {
var data = JSON.parse(res);
console.log(data["cmd"]);
term.writeln(data["cmd"]);
}
});
}
</script>
</body>
</html>
from django.shortcuts import render,HttpResponse
import subprocess,json
def term(request):
if request.method == "POST":
data = request.body.decode("utf-8")
if data == "ok":
proc = subprocess.Popen("ipconfig",stdout=subprocess.PIPE,shell=True)
cc = str(proc.stdout.readlines())
return HttpResponse(json.dumps({"cmd":cc}))
return render(request, "index.html")
光标问题已经解决了,找了很久的,操蛋啊。
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<link rel="stylesheet" href="https://www.blib.cn/cdn/xterm.css" />
<script src="https://www.blib.cn/cdn/xterm.js"></script>
<script src="https://www.blib.cn/cdn/jquery.js"></script>
</head>
<body>
<input type="button" value="执行命令" onclick="show()">
<div id="terminal"></div>
<script type="text/javascript">
var window_width = $(window).width();
var window_height = $(window).height();
var term = new Terminal(
{
cols: Math.floor(window_width/9),
rows: Math.floor(window_height/20),
useStyle:false,
convertEol: true,
cursorBlink:false,
rendererType: "canvas",
theme:{
foreground: 'yellow',
background: 'rgba(6,1,1,0.55)',
}
}
);
term.open(document.getElementById('terminal'));
function show(){
$.ajax({
url:"/term/",
type:"POST",
contentType:"application/json;",
data: "ok",
success:function (res) {
term.writeln(res);
}
});
}
</script>
</body>
</html>
from django.shortcuts import render,HttpResponse
import paramiko
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
def ssh_cmd(user,passwd,port,cmd):
ssh.connect("192.168.1.20",port=port,username=user,password=passwd)
cmd=cmd
stdin, stdout, stderr = ssh.exec_command(cmd)
result = stdout.read()
if not result:
result=stderr.read()
ssh.close()
return result.decode()
def term(request):
if request.method == "POST":
data = request.body.decode("utf-8")
if data == "ok":
a = ssh_cmd("root","123","22","ifconfig")
return HttpResponse(a)
return render(request, "index.html")
来我们继续,加上边框,进行定制。
{% extends "admin/base_site.html" %}
{% load i18n static %}
{% block content %}
<link rel="stylesheet" href="https://www.blib.cn/cdn/xterm.css" />
<link rel="stylesheet" href="https://www.blib.cn/cdn/bootstrap3.css" />
<script src="https://www.blib.cn/cdn/xterm.js"></script>
<script src="https://www.blib.cn/cdn/jquery.js"></script>
<div class="panel panel-primary">
<div class="panel-heading">
<h3 class="panel-title">批量命令执行CMD工具</h3>
</div>
<div class="panel-body">
<div id="terminal"></div>
</div>
<div class="panel-footer">
<input type="button" value="执行命令" onclick="show()">
</div>
</div>
<script type="text/javascript">
var window_width = $(window).width()-200;
var window_height = $(window).height()-200;
var term = new Terminal(
{
cols: Math.floor(window_width/9),
rows: Math.floor(window_height/20),
useStyle:false,
convertEol: true,
cursorBlink:false,
rendererType: "canvas",
}
);
term.open(document.getElementById('terminal'));
function show(){
$.ajax({
url:"/term/",
type:"POST",
contentType:"application/json;",
data: "ok",
success:function (res) {
//term.clear();
term.writeln(res);
}
});
}
</script>
{% endblock %}
from django.shortcuts import render,HttpResponse
import paramiko
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
def ssh_shell(address,username,password,port,command):
ssh.connect(address,port=port,username=username,password=password)
stdin, stdout, stderr = ssh.exec_command(command)
result = stdout.read()
if not result:
result=stderr.read()
ssh.close()
return result.decode()
def term(request):
if request.method == "POST":
data = request.body.decode("utf-8")
if data == "ok":
a = ssh_shell("192.168.1.20","root","123","22","yum")
print(a)
return HttpResponse(a)
return render(request, "index.html")
继续改造啊,先玩着,后期上websocket.
views.py
from django.shortcuts import render,HttpResponse
import paramiko,json,time
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
def ssh_shell(address,username,password,port,command):
try:
ssh.connect(address,port=port,username=username,password=password)
stdin, stdout, stderr = ssh.exec_command(command)
result = stdout.read()
if not result:
result=stderr.read()
ssh.close()
return result.decode()
except Exception:
ssh.close()
def term(request):
if request.method == "POST":
data = request.body.decode("utf-8")
json_data = json.loads(data)
address = json_data.get("address")
command = json_data.get("command")
if len(address) >=2 and len(command) >=2:
ret = ssh_shell(address,"root","123","22",command)
if ret !=None:
times = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
times = "---> \x1B[1;3;32m 执行时间: [ {} ] \x1B[0m".format(times)
address = "\x1B[1;3;33m 主机地址: [ {} ] \x1B[0m".format(address)
command = "\x1B[1;3;35m 执行命令: [ {} ] \x1B[0m".format(command)
retn = times + address + command + "\x1B[1;3;25m 回执: [ok] \x1B[0m"
return HttpResponse(retn)
else:
times = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
times = "---> \x1B[1;3;32m 执行时间: [ {} ] \x1B[0m".format(times)
address = "\x1B[1;3;33m 主机地址: [ {} ] \x1B[0m".format(address)
command = "\x1B[1;3;35m 执行命令: [ {} ] \x1B[0m".format(command)
retn = times + address + command + "\x1B[1;3;20m 回执: [Error] \x1B[0m"
return HttpResponse(retn)
else:
return HttpResponse("主机地址或命令行不能为空...")
return render(request, "index.html")
{% extends "admin/base_site.html" %}
{% load i18n static %}
{% block content %}
<link rel="stylesheet" href="https://www.blib.cn/cdn/xterm.css" />
<link rel="stylesheet" href="https://www.blib.cn/cdn/bootstrap3.css" />
<script src="https://www.blib.cn/cdn/xterm.js"></script>
<script src="https://www.blib.cn/cdn/jquery.js"></script>
<div class="panel panel-primary">
<div class="panel-heading">
<h3 class="panel-title">批量命令执行CMD工具</h3>
</div>
<div class="panel-body">
<div id="terminal"></div>
</div>
<div class="panel-footer">
<input type="text" id="address" placeholder="主机范围" style="width:200px;height:40px"/>
<input type="text" id="command" placeholder="执行命令" style="width:400px;height:40px"/>
<input type="button" value="执行命令" onclick="show()">
</div>
</div>
<script type="text/javascript">
var window_width = $(window).width()-200;
var window_height = $(window).height()-300;
var term = new Terminal(
{
cols: Math.floor(window_width/9),
rows: Math.floor(window_height/20),
useStyle:false,
convertEol: true,
cursorBlink:true,
cursorStyle:null,
rendererType: "canvas",
}
);
term.open(document.getElementById('terminal'));
function show(){
var address = $("#address").val();
var command = $("#command").val();
console.log(command);
$.ajax({
url:"/term/",
type:"POST",
contentType:"application/json;",
data: JSON.stringify({"address":address,"command":command}),
success:function (res) {
term.writeln(res);
}
});
}
</script>
{% endblock %}
from MyWeb import views
urlpatterns = [
path('admin/', admin.site.urls),
path('term/',views.term)
]
Dwebsocket
网上找到一个老版本的,改造了一下 可以支持 django 3.0 。
index.html
<html>
<head>
<title>django-websocket</title>
<script src="https://www.blib.cn/cdn/jquery.js"></script>
<script type="text/javascript">
$(function () {
$('#connect_websocket').click(function () {
if(window.s){
// 如果已经连接了,就关闭,重新连接
window.s.close()
}
var s = new WebSocket("ws://" + window.location.host + "/echo/");
s.onopen = function () {
console.log('WebSocket open');
};
s.onmessage = function (e) {
console.log('message: ' + e.data);
};
s.onclose = function (e) {
console.log('WebSocket close');
};
// 把s挂到全局
window.s = s;
});
$('#send_message').click(function () {
if(!window.s){
alert("Please connect server.");
}else{
window.s.send($('#message').val());
}
});
$('#close_websocket').click(function () {
if(window.s){
window.s.close();
}
});
});
</script>
</head>
<body>
<input type="text" id="message" value="Hello, World!" />
<button type="button" id="connect_websocket">Connect websocket</button>
<button type="button" id="send_message">Send message</button>
<button type="button" id="close_websocket">Close websocket</button>
<h1>Received Messages</h1>
<div id="messagecontainer"></div>
</body>
</html>
views.py
from django.shortcuts import render,HttpResponse
from dwebsocket.decorators import accept_websocket,require_websocket
def index(request):
return render(request,"index.html")
@accept_websocket
def echo(request):
if not request.is_websocket():#判断是不是websocket连接
try:#如果是普通的http方法
message = request.GET['message']
return HttpResponse(message)
except:
return render(request,'index.html')
else:
for message in request.websocket:
request.websocket.send(message)#发送消息到客户端
from MyWeb import views
urlpatterns = [
path('', views.index),
path('echo/', views.echo),
]
页面加载后自动连接
<html>
<head>
<script src="https://www.blib.cn/cdn/jquery.js"></script>
<script type="text/javascript">
$(function () {
if(window.s){
window.s.close()
}else{
var s = new WebSocket("ws://" + window.location.host + "/echo/");
}
s.onmessage = function (e) {
console.log('message: ' + e.data);
};
// 把s挂到全局
window.s = s;
$('#send_message').click(function () {
window.s.send("hello lyshark");
});
});
</script>
</head>
<body>
<button type="button" id="send_message">Send message</button>
</body>
</html>
<html>
<head>
<link rel="stylesheet" href="https://www.blib.cn/cdn/xterm.css" />
<link rel="stylesheet" href="https://www.blib.cn/cdn/bootstrap3.css" />
<script src="https://www.blib.cn/cdn/xterm.js"></script>
<script src="https://www.blib.cn/cdn/jquery.js"></script>
<div id="terminal"></div>
<script>
var window_width = $(window).width();
var window_height = $(window).height();
var term = new Terminal(
{
cols: Math.floor(window_width/9),
rows: Math.floor(window_height/20),
useStyle:false,
convertEol: true,
cursorBlink:false,
cursorStyle:null,
rendererType: "canvas",
}
);
</script>
<script type="text/javascript">
$(function () {
var sock = new WebSocket("ws://" + window.location.host + "/echo/");
// 打开 websocket 打开 web 终端
sock.addEventListener("open",function () {
term.open(document.getElementById('terminal'));
term.writeln("socket init ok...");
});
// 读取服务器发来的数据
sock.addEventListener("message",function (recv) {
term.write(recv.data);
});
var message = {"status":null,"data":null};
term.on("data",function(data){
message['status'] = 0;
message['data'] = data;
var send_data = JSON.stringify(message);
window.sock.send(send_data);
console.log(send_data);
});
window.sock = sock;
});
</script>
</head>
<body>
<button type="button" id="send_message">Send message</button>
</body>
</html>
from django.shortcuts import render,HttpResponse
from dwebsocket.decorators import accept_websocket
import paramiko
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
def ssh_cmd(user,passwd,port,cmd):
ssh.connect("192.168.1.20",port=port,username=user,password=passwd)
cmd=cmd
stdin, stdout, stderr = ssh.exec_command(cmd)
result = stdout.read()
if not result:
result=stderr.read()
ssh.close()
return result.decode()
def index(request):
return render(request,"index.html")
@accept_websocket
def echo(request):
if not request.is_websocket():#判断是不是websocket连接
try:
message = request.GET['message']
a = ssh_cmd("root","123","22","ls -lh")
print(a)
return HttpResponse(a)
except:
return render(request,'index.html')
else:
for message in request.websocket:
request.websocket.send(message)#发送消息到客户端
继续尝试,ssh隧道怎末开?
<html>
<head>
<link rel="stylesheet" href="https://www.blib.cn/cdn/xterm.css" />
<link rel="stylesheet" href="https://www.blib.cn/cdn/bootstrap3.css" />
<script src="https://www.blib.cn/cdn/xterm.js"></script>
<script src="https://www.blib.cn/cdn/jquery.js"></script>
<div id="terminal"></div>
<script>
var window_width = $(window).width();
var window_height = $(window).height();
var term = new Terminal(
{
cols: Math.floor(window_width/9),
rows: Math.floor(window_height/20),
useStyle:false,
convertEol: true,
cursorBlink:false,
cursorStyle:null,
rendererType: "canvas",
}
);
</script>
<script type="text/javascript">
$(function () {
var sock = new WebSocket("ws://" + window.location.host + "/echo/");
// 打开 websocket 打开 web 终端
sock.addEventListener("open",function () {
term.open(document.getElementById('terminal'));
term.writeln("socket init ok...");
});
// 读取服务器发来的数据
sock.addEventListener("message",function (recv) {
term.write(recv.data);
});
var message ="";
term.on("data",function(data){
console.log(message);
if(data == "\r")
{
term.writeln(message);
window.sock.send(message);
message = "";
}else
{
message = message +data;
term.write(data);
}
});
window.sock = sock;
});
</script>
</head>
</html>
from django.shortcuts import render,HttpResponse
from dwebsocket.decorators import accept_websocket
import paramiko
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
def ssh_cmd():
client = paramiko.SSHClient()
client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
client.connect("192.168.1.20", username="root", password="123")
ssh_session = client.get_transport().open_session()
return ssh_session
@accept_websocket
def echo(request):
sessions = ssh_cmd()
if not request.is_websocket():
return render(request,'index.html')
else:
for message in request.websocket:
sessions.exec_command(message)
ret = sessions.recv(2048)
request.websocket.send(ret)
简单的隧道。
import paramiko
tran = paramiko.Transport(('192.168.1.20', 22,))
tran.start_client()
tran.auth_password('root', '123')
chan = tran.open_session()
chan.get_pty()
chan.invoke_shell()
while True:
a = chan.recv(1024)
print(a)
chan.send('ls -lh\r')
<html>
<head>
<link rel="stylesheet" href="https://www.blib.cn/cdn/xterm.css" />
<link rel="stylesheet" href="https://www.blib.cn/cdn/bootstrap3.css" />
<script src="https://www.blib.cn/cdn/xterm.js"></script>
<script src="https://www.blib.cn/cdn/jquery.js"></script>
<div id="terminal"></div>
<script>
var window_width = $(window).width();
var window_height = $(window).height();
var term = new Terminal(
{
cols: Math.floor(window_width/9),
rows: Math.floor(window_height/20),
useStyle:false,
convertEol: true,
cursorBlink:false,
cursorStyle:null,
rendererType: "canvas",
}
);
</script>
<script type="text/javascript">
$(function () {
var sock = new WebSocket("ws://" + window.location.host + "/echo/");
// 打开 websocket 打开 web 终端
sock.addEventListener("open",function () {
term.open(document.getElementById('terminal'));
term.writeln("socket init ok...");
});
// 读取服务器发来的数据
sock.addEventListener("message",function (recv) {
term.write(recv.data);
});
term.on("data",function(data){
term.write(data);
window.sock.send(data);
});
window.sock = sock;
});
</script>
</head>
</html>
from django.shortcuts import render,HttpResponse
from dwebsocket.decorators import accept_websocket
import paramiko
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
def ssh_cmd():
tran = paramiko.Transport(('192.168.1.20', 22,))
tran.start_client()
tran.auth_password('root', '123')
chan = tran.open_session()
chan.get_pty()
chan.invoke_shell()
return chan
@accept_websocket
def echo(request):
sessions = ssh_cmd()
if not request.is_websocket():
return render(request,'index.html')
else:
for message in request.websocket:
while True:
ret = sessions.recv(2048)
request.websocket.send(ret)
完成了 webssh 代码还不太稳定,完善后放出来。
代码,其实比想象中的简单得多,我尝试了很久。
<html>
<head>
<link rel="stylesheet" href="https://www.blib.cn/cdn/xterm.css" />
<link rel="stylesheet" href="https://www.blib.cn/cdn/bootstrap3.css" />
<script src="https://www.blib.cn/cdn/xterm.js"></script>
<script src="https://www.blib.cn/cdn/jquery.js"></script>
<div id="terminal"></div>
<script>
var window_width = $(window).width();
var window_height = $(window).height();
var term = new Terminal(
{
cols: Math.floor(window_width/9),
rows: Math.floor(window_height/20),
useStyle:false,
convertEol: true,
cursorBlink:true,
cursorStyle:null,
});
console.log("高度" + window_height + "宽度" + window_width);
var sock = new WebSocket("ws://" + window.location.host + "/echo/");
sock.addEventListener("open",function () {
term.open(document.getElementById('terminal'));
});
sock.addEventListener("message",function (recv) {
term.write(recv.data);
});
term.on("data",function(data){
sock.send(data);
});
window.sock = sock;
</script>
</head>
</html>
from django.shortcuts import render,HttpResponse
from dwebsocket.decorators import accept_websocket
import paramiko
def ssh_cmd():
tran = paramiko.Transport(('192.168.1.20', 22,))
tran.start_client()
tran.auth_password('root', '123')
chan = tran.open_session()
chan.get_pty(height=492,width=1312)
chan.invoke_shell()
return chan
sessions = ssh_cmd()
@accept_websocket
def echo(request):
if not request.is_websocket():
return render(request,'index.html')
else:
try:
for message in request.websocket:
ret = sessions.recv(10240)
request.websocket.send(ret)
sessions.send(message)
except Exception:
print("error")
最后加一个在线编辑器代码。
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
<link rel="stylesheet" href="https://www.blib.cn/cdn/codemirror/codemirror.css"/>
<script src="https://www.blib.cn/cdn/codemirror/codemirror.js"></script>
</head>
<body>
<textarea class="form-control" id="code" name="code"></textarea>
<script type="text/javascript" charset="utf-8">
var editor = CodeMirror.fromTextArea(document.getElementById("code"), {
mode: "groovy", // 设置高亮类型
theme: "neat", // 设置主题
lineNumbers: true, // 显示行号
foldGutter: true,
gutters: ["CodeMirror-linenumbers", "CodeMirror-foldgutter"],
});
editor.setSize('500px', '400px'); // 设置框架大小
editor.setValue("hello lyshark"); // 给代码框赋值
editor.getValue(); // 获取代码框的值
</script>
</body>
</html>
dwebsocket 最终代码: 通过使用dwebsocket插件实现一个简单的WebSSH命令行工具.
<!--name: index.html-->
<html>
<head>
<link rel="stylesheet" href="https://www.blib.cn/cdn/xterm.css" />
<link rel="stylesheet" href="https://www.blib.cn/cdn/bootstrap3.css" />
<script src="https://www.blib.cn/cdn/xterm.js"></script>
<script src="https://www.blib.cn/cdn/jquery.js"></script>
<div id="terminal"></div>
<script>
var window_width = $(window).width();
var window_height = $(window).height();
var term = new Terminal(
{
cols: Math.floor(window_width/9),
rows: Math.floor(window_height/20),
useStyle:false,
convertEol: true,
cursorBlink:true,
cursorStyle:null,
});
console.log("高度" + window_height + "宽度" + window_width);
var sock = new WebSocket("ws://" + window.location.host + "/echo/");
sock.addEventListener("open",function () {
term.open(document.getElementById('terminal'));
});
sock.addEventListener("message",function (recv) {
term.write(recv.data);
});
term.on("data",function(data){
sock.send(data);
});
window.sock = sock;
</script>
</head>
</html>
# name: views.py
from django.shortcuts import render,HttpResponse
from dwebsocket.decorators import accept_websocket
import paramiko
def ssh_cmd():
tran = paramiko.Transport(('192.168.1.20', 22,))
tran.start_client()
tran.auth_password('root', '123')
chan = tran.open_session()
chan.get_pty(height=492,width=1312)
chan.invoke_shell()
return chan
sessions = ssh_cmd()
@accept_websocket
def echo(request):
if not request.is_websocket():
return render(request,'index.html')
else:
try:
for message in request.websocket:
ret = sessions.recv(4096)
request.websocket.send(ret)
sessions.send(message)
except Exception:
print("error")
from MyWeb import views
urlpatterns = [
path('admin/', admin.site.urls),
path('echo/',views.echo)
]
批量CMD执行工具: 利用DjangoAdmin与Socket通信实现的主机批量执行并回显.
<!--name:index.html-->
{% extends "admin/base_site.html" %}
{% load i18n static %}
{% block content %}
<link rel="stylesheet" href="https://www.blib.cn/cdn/xterm.css" />
<link rel="stylesheet" href="https://www.blib.cn/cdn/bootstrap3.css" />
<script src="https://www.blib.cn/cdn/xterm.js"></script>
<script src="https://www.blib.cn/cdn/jquery.js"></script>
<div class="panel panel-primary">
<div class="panel-heading">
<h3 class="panel-title">批量命令执行CMD工具</h3>
</div>
<div class="panel-body">
<div id="terminal"></div>
</div>
<div class="panel-footer">
<input type="text" id="address" placeholder="主机范围 127.0.0.1-100" style="width:200px;height:40px"/>
<input type="text" id="command" placeholder="执行命令 ls -lh " style="width:400px;height:40px"/>
<input type="button" id="send_message" value="批量执行">
</div>
</div>
<script type="text/javascript">
$(function(){
var window_width = $(window).width()-200;
var window_height = $(window).height()-300;
var term = new Terminal(
{
cols: Math.floor(window_width/9),
rows: Math.floor(window_height/20),
convertEol: true,
cursorBlink:false,
});
var sock = new WebSocket("ws://" + window.location.host + "/echo/");
sock.onopen = function () {
term.open(document.getElementById('terminal'));
console.log('WebSocket Open');
};
sock.onmessage = function (recv) {
if(recv.data.substring(0,7) == "[Suces]"){
term.writeln("\x1B[1;3;32m " + recv.data + "\x1B[0m");
}else{
term.writeln("\x1B[1;3;31m " + recv.data + "\x1B[0m");
}
};
$('#send_message').click(function () {
var message ={"address":null,"command":null};
message['address'] = $("#address").val();
message['command'] = $("#command").val();
var send_data = JSON.stringify(message);
window.sock.send(send_data);
});
window.sock = sock;
});
</script>
{% endblock %}
# name:views.py
from django.shortcuts import render
from dwebsocket.decorators import accept_websocket
import paramiko,time
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
def ssh_shell(address,username,password,port,command):
try:
ssh.connect(address,port=port,username=username,password=password,timeout=1)
stdin, stdout, stderr = ssh.exec_command(command)
result = stdout.read()
if not result:
result=stderr.read()
ssh.close()
return result.decode()
except Exception:
return 0
def CalculationIP(Addr_Count):
ret = []
try:
IP_Start = str(Addr_Count.split("-")[0]).split(".")
IP_Heads = str(IP_Start[0] + "." + IP_Start[1] + "." + IP_Start[2] +".")
IP_Start_Range = int(Addr_Count.split(".")[3].split("-")[0])
IP_End_Range = int(Addr_Count.split("-")[1])
for item in range(IP_Start_Range,IP_End_Range+1):
ret.append(IP_Heads+str(item))
return ret
except Exception:
return 0
@accept_websocket
def echo(request):
if not request.is_websocket():
return render(request, "index.html")
else:
for message in request.websocket:
data = eval(message)
Addr_list = CalculationIP(data['address'])
command = data['command']
for ip in Addr_list:
ret = ssh_shell(ip,"root","123","22",command)
if ret != 0:
times = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
retn = "[Suces] ---> " + str(times) + " " + command + " " + ip
request.websocket.send(retn)
else:
times = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
retn = "[Error] ---> " + str(times) + " " + command + " " + ip
request.websocket.send(retn)
# name:urls.py
from MyWeb import views
urlpatterns = [
path('admin/', admin.site.urls),
path("echo/",views.echo)
]