用Python为基于网页的Ubuntu终端编写伪终端
我想写一个基于网页的终端,可以执行和自动补全Ubuntu终端里的命令。
我试过使用Anyterm http://www.anyterm.org,它在后台使用了ROTE:一个简单的C语言库,用于模拟VT102终端,前端则是用JavaScript和HTML来做终端界面。问题是我无法在同一个窗口里打开两个终端。
经过一些研究,我决定用Python写一个终端服务器/伪终端(不管哪个说法更准确),它可以:
- 在Ubuntu终端中执行命令(比如ls、grep等...)
- 自动补全命令(比如输入$gedi后按下Tab键,变成$gedit)
- 同时打开多个终端实例(在一个终端输入ls,另一个终端不会把ls当作最后的命令,因为它是另一个终端会话)
我发现使用pty这个Python模块可以写一个伪终端,但我对Python还不太熟悉,连那个页面上的例子都没能运行起来。
我打算让这个Python脚本作为一个HTTP服务器,配合我写的JavaScript/HTML终端界面(这也是我选择Python的主要原因)。然后我想让网页界面和后台的终端“服务器”进行沟通,把结果返回给网页界面。
如果你能给我一些指引,比如告诉我应该用哪个模块——如果不是pty的话——并给我一些关于如何写Python伪终端服务器的想法,我会非常感激。
我会JavaScript和PHP,也熟悉bash脚本——现在我可以选择基于C语言或Python的后台服务器,Python适合这个项目吗?
注意:我打算写一个使用ajax的post或get方法来从后台服务器获取终端输出的界面。
2 个回答
我有个朋友做过类似的事情,不过他是在谷歌聊天上完成的。我不知道这对你有多大帮助,但你可以看看xmpp(一个Python模块),也许能帮到你。这里还有他源代码的链接:chatIO。我没有和他一起工作过,但他觉得用起来非常简单。祝你好运!
你需要先了解一些基本的术语。Shell 是一个程序,它负责理解你输入的命令,比如 grep "foo" abc.txt。终端模拟器 是一个模拟 终端 的程序。终端是一个显示器和键盘的设备,早在1970年代,人们用它来访问UNIX主机。伪终端,也叫 pty,是支持终端模拟器的设备节点,和“真实终端设备”(比如 tty1)相对。
现在,你可以选择自己做一个 shell,让它在终端中运行,而不是使用 bash 或 dash;或者你可以做一个可以通过互联网使用的 终端模拟器,在里面运行任何现有的 shell。这两者都是各自很有挑战性的任务。
Python 的文档帮助不大,我建议你先去谷歌搜索更多关于这些概念的内容——不仅仅是 Python 的参考资料,还有 C、C++ 的相关信息。
最后,如果你想在你的 shell 中运行 Emacs、nano 或其他一些高级程序,你需要使用 pty 模块。