使用到的组件:
1 开源框架:xterm.js https://github.com/sourcelair/xterm.js
参考实例。只需要在页面引用css和js文件,再加上一个<div id="terminal-container"></div>即可。
<!doctype html>
<html>
<head>
<title>xterm.js demo</title>
<link rel="stylesheet" href="/css/xterm.css" />
<link rel="stylesheet" href="/css/fullscreen.css" />
<link rel="stylesheet" href="/css/style.css" />
<script src="/js/xterm.js" ></script>
<script src="/js/attach.js" ></script>
<script src="/js/fit.js" ></script>
<script src="/js/fullscreen.js" ></script>
<script src="/js/main.js" defer ></script>
</head>
<body>
<h1>
xterm.js: xterm, in the browser
</h1>
<div id="terminal-container"></div>
</body>
</html>
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 "<stdin>", line 1, in <module>
TypeError: ord() expected a character, but string of length 2 found
>>>