引言

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

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

介绍

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

    所以你需要对于特殊字符格式化处理,才能正确显示成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代理服务器,只要她可以访问的服务器,你都可以通过浏览器连接登录而不用任何客户端

演示

下面是几张演示图稿:

最后

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