【学习】django 接入gateone(webssh)

一、背景
最近在做一个django 主机管理项目,想在django web上实现执行主机指令,查了一下可以通过gateone实现,和大家分享一下。
二、步骤
1.安装gateone
sudo yum -y install epel-release
sudo yum -y install python-pip

wget https://github.com/liftoff/GateOne/archive/master.zip
#也可访问github git clone

#解压
unzip master.zip -d /opt

pip3 install --upgrade pip
pip3 install tornado
#此处python3 tornado最好下载4.5.3版本

pip3 install --upgrade setuptools

pip3 install html5lib

cd /opt/GateOne-master
python3 setip.py install

#默认配置文件会在/etc/gateone
2.修改访问配置
"disable_ssl": true,	#改成http方式
"origins": ["localhost:8000", "127.0.0.1:8000", "xxxxx:8000", "django的外网IP:django端口"],	#添加django的地址和端口

在这里插入图片描述

3.http://ip:port 访问gateone是否正常
4.配置gateone api
gateone --new_api_key #生成api

#此时,通过http://ip:port 访问会出现unauthenticated

在这里插入图片描述

5.gateone集成到django
#此处不多说直接上代码,可直接复制粘贴,修改一些参数为自己的参数

import time,hmac,hashlib,json

#web交互界面gateone
def gateone(request):
    id = 1	#这里暂时写死只要id为1的服务器
    svr = server.objects.get(id = id)
    ip = svr.outIP
    port = svr.port
    username = svr.username   #写死端口和用户名
    return render(request,'aggateone.html',locals())	#返回aggateone.html页面

#gateone认证
def create_signature(secret,*parts):
    hash = hmac.new(secret, digestmod=hashlib.sha1)
    for part in parts:
        hash.update(str(part).encode("utf-8"))
    return hash.hexdigest()

def get_auth_obj(request):
    # 安装gateone的服务器以及端口.
    gateone_server = 'http://121.41.37.251:8008'	#本地gateone的访问地址,注意http格式
    # 生成的api_key 和secret
    api_key = 'OGQxZGM5OGM1MGNlNDZkNmEwMTNmM2IyY2NlMGZlNjA3Z'  #这里是30api_keys.conf文件里的key
    secret = b'MDIzOWQyN2Y2MmU0NDdhMWIwN2Q3MjIzODU1MGFjYWVkY'	#这里是30api_keys.conf文件里的secret
    authobj = {
        'api_key':api_key,
        'upn':'gateone',
        'timestamp':str(int(time.time() * 1000)),
        'signature_method':'HMAC-SHA1',
        'api_version':'1.2'
        }
    authobj['signature'] = create_signature(secret,authobj['api_key'],authobj['upn'],authobj['timestamp'])
    auth_info_and_server = {'url':gateone_server,'auth':authobj}
    return JsonResponse(auth_info_and_server)
6.添加路由
path(r'gateone.html', views.gateone),
path(r'get_auth_obj.html',views.get_auth_obj,name="get_auth_obj"),
7.添加前端展示界面,gateone.html
{% extends 'agbase.html' %}
{% load staticfiles %}
{% block title %}Gateone远程连接{% endblock %}

{% block css %}
<script src = "/static/jquery-3.3.1.min.js"></script>
<script src = "/static/gateone/gateone.js"></script>	<!-- 这里需要手动复制一下gateone.js文件到django的静态文件夹里 -->
{% endblock %}

{% block content %}
<script>
$(function () {
        <!--添加参数-->
        var ip = '{{ ip }}';
        var user = '{{ username }}';
        var port = '{{ port }}';
        var ssh_url = 'ssh://'+user+'@'+ip+':'+port;
        //请求认证信息
        <!--发起认证请求-->
        $.ajax({
                        url:'{% url 'get_auth_obj' %}',
                        type:'GET',
                        dataType:'json',
                        success:function (data) {
                        var auth_message = data.auth;
                        var auth_url = data.url;
                        GateOne.init({
                                auth:auth_message,
                                url:auth_url,
                                theme:'solarized',
                                goDiv:'#gateone',
                                disableTermTransitions:'true',
                                autoConnectURL:ssh_url
                        });
                }
        });
        <!--状态记录-->
        GateOne.Base.superSandbox("GateOne.SomePlugin", ["GateOne", "GateOne.Net",  "GateOne.Terminal.Input", "GateOne.Terminal"], function(window, undefined) {
                var location =  ip;
                GateOne.prefs.autoConnectURL=ssh_url;
                GateOne.prefs.fontSize="100%";
                GateOne.prefs.scrollback = 10000;  // scrollback buffer up to 10,000 lines
                GateOne.Terminal.loadFont("Source Code Pro", "150%");
                GateOne.Net.setLocation(location);
                <!--记录登录状态-->
        });
})
</script>
<div id = "gateone_container" style = "position:relative; width: 110em; height: 55em;">
        <div id = "gateone">
        </div>
</div>
{% endblock %}
8.重启django,刷新浏览器

在这里插入图片描述

三、问题总结
1.hmac.new/base64.b64encode(‘value’) TypeError: key: expected bytes or bytearray, but got ‘str’
此处为value应为byte,因此改成secret = b’MDIzOWQyN2Y2MmU0NDdhMWIwN2Q3MjIzODU1MGFjYWVkY’
2.此处gateone接入时还得输入密码,之后看看怎么实现免密,再更新。
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值