前言:
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(将#换成@)