上次有幸观看梁胜大牛的技术分享,其中一个演示是浏览器中显示了一个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
上一篇:八大排序算法的Python实现