【问题标题】:Web terminal emulator - how to program the backend?Web 终端模拟器 - 如何对后端进行编程?
【发布时间】:2013-08-29 14:06:54
【问题描述】:

我正在使用 JQuery 终端来模拟网页上的 CLI 终端。我可以轻松地在前端和后端(我正在运行 Perl CGI 脚本的地方)之间来回传输命令。但是,我想知道一旦这些命令到达我的 Perl 代码,如何将这些命令通过管道传输到实际的 shell 提示符中?每次 Perl 脚本运行命令时,我不会“关闭”终端吗?如果是这样 - 我假设我每次都会失去会话。

【问题讨论】:

  • 在子进程中启动一个shell,并将输入的命令发送到它的STDIN,同时将STDOUT和STDERR复制回终端。 perldoc.perl.org/IPC/Open3.html 会很有帮助。
  • 您可以使用tmux 或 screen 在后台运行会话

标签: jquery perl shell terminal jquery-terminal


【解决方案1】:

首先,终端仿真通常逐个字符进行。您可以逐行执行,但您将无法使用诸如 emacs 或 vi 之类的交互式编辑器,或者诸如命令完成之类的花哨的 shell 东西。您的系统可能希望通过 CGI 接口使用 https,然后通过 stdin/stdout/stderr 管道与后端的命令行进程进行交互。这些管道需要在会话期间保持打开状态,并对超时等进行优雅处理。

CGI 脚本将启动,然后为每个页面请求完成执行(这可能意味着每个字符),因此脚本将无法自行保持终端打开(因为它会退出)。理论上,您可以使用守护进程并让 CGI 脚本与之对话(可能使用 screen 或上面建议的其他东西)。但这不是很有效。

可能最好的方法是运行某种进程内 Web 服务器,它不会为每次击键重新生成语言解释器。 Mod_perl 可能是一种有效的方法,但我不知道您是否可以使用它跨请求保存对象。您遇到的另一个问题是,当后端的 shell 产生一个字符时会发生什么......您将需要一个“彗星”设置来检索异步写入远程端控制台的字符。这通常是通过始终打开 http 请求来完成的,服务器可以等待然后按需响应;客户端在检索到前一个字符后立即重新请求以准备下一个字符。

已经有一些解决方案(包括一些开源解决方案)可以做类似的事情;我认为这将是您想要合并而不是从头开始构建的功能。为了让它正常工作,有很多细节需要做好,潜在的安全隐患也可能是相当大的。

【讨论】:

  • 好点!此外,关键字 websocket 可能有助于实现。
【解决方案2】:

首先,请注意您所做的可能是一个非常糟糕的主意(阅读:有安全问题)。允许 Web 客户端在您的机器上执行任意命令是危险的。我希望所有这些都通过 SSL 运行并且需要登录……在这种情况下,您基本上重新发明了 SSH。

你可以为 shell 编写一个基本的 REPL,比如

while read line; do
  eval $line;
done

从 STDIN 读取命令,并打印到 STDOUT 和 STDERR。当您将其与IPC::Open3 挂钩时,您可以从 Perl 编写在同一个 shell 会话中解释的命令。

【讨论】:

  • 它用于存储设备,因此它位于防火墙后面,但是是的,它将通过用户身份验证。它将作为 http 请求访问 Perl 脚本,而不是 STDIN 或 STDOUT - 它必须是参数和打印。
  • @kidalex 使用 IPC::Open3,您可以为 shell 命令提供新的 I/O 文件句柄 - 它不使用 your STD{IN,OUT,ERR} .因此,如何调用您的脚本完全无关紧要。只需浏览我链接的文档即可了解该模块的作用。
  • 还有哪些其他安全问题?此外,它还会验证某个特定的第一个关键字,该关键字将是唯一允许的关键字
  • 另外,任何可以访问 Web UI 的用户都可以访问 shell
  • @kidalex 我不知道从哪里开始解决问题......这个解决方案使用eval。仅此一项就是一个巨大的洞。我不知道转义、引用等如何与之交互。一次只读取一行,因此 heredocs 或续行等会中断。检查允许的第一个关键字?可能还不够——在这种情况下,可能不需要在同一个 shell 中运行所有命令。将命令的中间表示(例如 JSON)传输到服务器会更安全,然后服务器会拒绝请求或组装 shell 代码。
猜你喜欢
  • 2014-04-29
  • 1970-01-01
  • 1970-01-01
  • 2011-08-02
  • 1970-01-01
  • 2016-11-23
  • 1970-01-01
  • 1970-01-01
  • 2014-09-17
相关资源
最近更新 更多