引言
上次有幸观看梁胜大牛的技术分享,其中一个演示是浏览器中显示了一个linux终端并登录管理server,于是决定自己实现一个
github中有一个项目gateone实现了此功能,本来想学习一下,但是考虑到代码实在过多就放弃了,下面说下自己的实现。
项目地址:[webssh]: https://github.com/xsank/webssh
欢迎大家拍砖
介绍
终端展示
使用了github开源项目 term.js,这是个很赞的项目,因为在刚开始写的时候你会发现linux返回的很多内容带有特殊字符,需要穷举处理,而这里正好有一个框架帮你做了这些复杂的操作
例如,linux 本身返回的字符是这样子的:
所以你需要对于特殊字符格式化处理,才能正确显示成linux终端的文本行-
长连接
这里使用了websocket,因为类似top这样的监控命令需要服务器定时推送
在这里,为了提高server端性能及效率,使用了epoll的ET模式,主要代码如下:def run(self): while True: epoll_list = self.select.poll() for fd, events in epoll_list: if select.EPOLLIN & events: while True: try: data = self.bridges[fd].shell.recv(1024) except socket.error, e: if e.errno == errno.EAGAIN: self.select.modify(fd, select.EPOLLET) elif isinstance(e, socket.timeout): break else: self.close(fd) try: self.futures[fd].send(data) except StopIteration: break elif select.EPOLLHUP & events: self.close(fd) else: continue
由epoll来管理所有websocket连接即事件处理
ssh登录
使用第三方paramiko库来支持server的加密登录
总结来说,webssh相当于一个ssh代理服务器,只要她可以访问的服务器,你都可以通过浏览器连接登录而不用任何客户端
演示
下面是几张演示图稿:
最后
如果使用上有任何问题,欢迎提给我:
Email:xsank#foxmail.com