使用web ssh 登陆设备---gateone开发之旅

前言:


gateone是一个非常强大的web 开源终端(Gate One is an HTML5 web-based terminal emulator and SSH client.)。 


目前这个项目在github有3614个stars, 439个fork, 26个贡献者, 可见其受欢迎程度。


项目的github地址: https://github.com/liftoff/GateOne 


gateone文档: http://liftoff.github.io/GateOne/ 


我们的项目基于gateone做了一些应用和开发,写这个文章的目的是想和大家一起分享和交流下经验。


需求:


开发一个界面, 可以通过这个界面来登陆设备,即web ssh。


关闭页面后(但是没有logout),下次打开还能回到上次登陆的状态。


环境:

ubuntu 12.04

python 2.7.6

django 1.7.3

Gateone 1.2




实现:


HTML 代码

<div id="gateone_container" style="position: relative; width: 100%; height: 50em;margin: 0 auto">

    <div id="gateone"></div>

</div>

<script type="text/javascript" src="/static/js/gateone/gateone.js"></script>

JS代码


    <script type="text/javascript">

        $(document).ready(function(){         

            var ip = “xxxxxxx”;   // 想办法拿到要登陆的设备的ip地址, 有多种方法, 比如把ip地址放置一个隐藏的input标签内, 或者通过url的参数行获取

            var ssh_url = 'ssh://' + ip + ':' + 22;           

            var request = $.ajax({

                url:'/get_auth_obj',   // api认证方式, 参考gateone文档

                type:"GET",

                dataType:"json",

            });

            request.done(function(auth_info){

                GateOne.init({

                    auth:auth_info.auth,

                    url: auth_info.url,

                    theme:'black',

                    goDiv:'#gateone',
                    disableTermTransitions:'true',

                    autoConnectURL:ssh_url,

                });

            });

 

            GateOne.Base.superSandbox("GateOne.SomePlugin", ["GateOne", "GateOne.Net",  "GateOne.Terminal.Input", "GateOne.Terminal"], function(window, undefined) {

                // this will ensure that modules in superSandbox will load completely first, then execute your code

                // Put your code here

                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.locations; // Holds the state of all current known/open locations

                GateOne.Net.setLocation(location); // Change locations in the current tab on-the-fly!这里设置的作用在于记录和保持ssh登陆的状态,只要不logout或者断开session,关闭页面后打开还会回到上次的状态

            });

 

        }); // end of document ready

 

 

    </script>


Python代码


#  django urls.py

("/get_auto_obj, views.generate_gate_one_auth_obj")

#  python 代码  ,api认证方式, django views

def generate_gate_one_auth_obj(request):

    import time, hmac, hashlib, json

    user = request.user.username

    gateone_server = GATEONE_SERVER  // 替换成对应的部署gateone的server的ip地址

    secret = GATEONE_API_SECRET  // 替换成对应的api secret ,该信息 存放在gateone的配置文件30api.conf中

    api_key = GATEONE_API_KEY  // 替换成对应的api key ,该信息 存放在gateone的配置文件30api.conf中

    authobj = {

        'api_key': api_key,

        'upn': user,

        'timestamp': str(int(time.time() * 1000)),

        'signature_method': 'HMAC-SHA1',

        'api_version': '1.0'

    }

    my_hash = hmac.new(secret, digestmod=hashlib.sha1)

    my_hash.update(authobj['api_key'] + authobj['upn'] + authobj['timestamp'])

    authobj['signature'] = my_hash.hexdigest()

    auth_info_and_server = {"url": gateone_server, "auth": authobj}

    valid_json_auth_info = json.dumps(auth_info_and_server)

    return HttpResponse(valid_json_auth_info)


其实使用gateone还有许多新的玩法, 比如结合sso登陆,pam验证登陆, google验证登陆, 还有 登陆自动执行脚本, log 喷到es等等,以后再慢慢讲。 gateone还提供了很详细的文档,包括使用文档和开发文档。gateone支持插件开发, 它提供了丰富的api, 只要你的开发能力够强, 你能基于gateone开发出非常强大的工具。


hackstoic 2015-12-26 整理




如果有任何问题,欢迎交流~~~~博客下留言或者email给我 hackstoic#163.com(将#换成@)







你可能感兴趣的:(js,Web,开发,python,ssh,gateone)