使用到的组件:
1 开源框架:xterm.js
参考实例。只需要在页面引用css和js文件,再加上一个<div id="terminal-container"></div>即可。
xterm.js demo xterm.js: xterm, in the browser
2 Python框架tornado。
在tornado中定义URL的映射:
(r'/ssh',views.WebTerminalHandler) 这表示了websocket的映射。
这里的挂件就是类WebTerminalHandler,它继承了tornado.websocket.WebSocketHandler。主要有三个方法:
def onopen(self) 表示打开了websocket。
def on_message(self,message) 表示接到浏览器通过websocket传输的字符,这里一次一个字符。
def on_close(self) 表示websocket关闭。
主要实现这三个方法即可。
每个WebTerminalHandler代表了一个客户端请求(一般是一个页面请求)。
3 paramiko库。下面第一部分初始化、连接,生成一个shell请求。第二部分读取shell中的内容,第三部分向shell中输入内容。
sshclient=paramiko.SSHClient()sshclient.load_system_host_keys()sshclient.set_missing_host_key_policy(paramiko.AutoAddPolicy())sshclient.connect(hostname,port,username,password)chan=sshclient.invoke_shell(term='xterm')#################################################################while True: data=chan.recv(512) if not data: break #print(data)#################################################################chan.send(message)
这里注意,可以用一个sshclient的connection产生多个shell连接。
其他一些注意事项:
tornado.websocket.WebSocketHandler中def on_message(self,message)的message每次都是一个字符,但是unicode类型。处理方式要使用unicode的方式。
Python中字符和数字的转换
>>> ord('a')97>>> chr(97)'a'>>> ord('\r')13>>> chr(13)'\r'>>> ord('he')Traceback (most recent call last): File "", line 1, in TypeError: ord() expected a character, but string of length 2 found>>>