2

引言

上次有幸观看梁胜大牛的技术分享,其中一个演示是浏览器中显示了一个linux终端并登录管理server,于是决定自己实现一个
github中有一个项目gateone实现了此功能,本来想学习一下,但是考虑到代码实在过多就放弃了,下面说下自己的实现。

项目地址:[webssh]: https://github.com/xsank/webssh
欢迎大家拍砖

介绍

  1. 终端展示
    使用了github开源项目 term.js,这是个很赞的项目,因为在刚开始写的时候你会发现linux返回的很多内容带有特殊字符,需要穷举处理,而这里正好有一个框架帮你做了这些复杂的操作
    例如,linux 本身返回的字符是这样子的:
    clipboard.png
    所以你需要对于特殊字符格式化处理,才能正确显示成linux终端的文本行

  2. 长连接
    这里使用了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连接即事件处理

  3. ssh登录
    使用第三方paramiko库来支持server的加密登录
    总结来说,webssh相当于一个ssh代理服务器,只要她可以访问的服务器,你都可以通过浏览器连接登录而不用任何客户端

演示

下面是几张演示图稿:
webssh

cmd

top

vim

最后

如果使用上有任何问题,欢迎提给我:
Email:xsank#foxmail.com


xsank
29 声望2 粉丝

我一直在路上。。。


« 上一篇

引用和评论

0 条评论
评论支持部分 Markdown 语法:**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用。你还可以使用 @ 来通知其他用户。

AltStyle によって変換されたページ (->オリジナル) /