我正在使用 JQuery 终端来模拟网页上的 CLI 终端。我可以轻松地在前端和后端(我正在运行 Perl CGI 脚本)之间来回传输命令。但是,我想知道一旦这些命令到达我的 Perl 代码,如何将这些命令传递到实际的 shell 提示符中?每次 Perl 脚本运行命令时,我不会“关闭”终端吗?如果是这样 - 我假设我每次都会失去会话。
2 回答
首先,终端仿真通常逐个字符发生。您可以逐行进行,但您将无法使用诸如 emacs 或 vi 之类的交互式编辑器,或者诸如命令完成之类的花哨的 shell 东西。您的系统可能希望通过 CGI 接口使用 https,然后通过 stdin/stdout/stderr 管道与后端的命令行进程进行交互。这些管道需要在会话期间保持打开状态,并对超时等进行优雅处理。
CGI 脚本将启动,然后为每个页面请求完成执行(这可能意味着每个字符),因此脚本将无法自行保持终端打开(因为它将退出)。理论上,您可以使用守护进程并让 CGI 脚本与之对话(可能使用 screen 或上面建议的其他东西)。虽然这不是很有效。
可能最好的方法是运行某种进程内 Web 服务器,它不会为每次击键重新生成语言解释器。Mod_perl 可能是一种有效的方法,但我不知道您是否可以使用它跨请求保存对象。您遇到的另一个问题是,当后端的 shell 产生一个字符时会发生什么......您将需要一个“彗星”设置来检索异步写入远程端控制台的字符。这通常是通过在任何时候都有一个开放的 http 请求来完成的,服务器可以等待然后按需响应;客户端在检索到前一个字符后立即重新请求以准备下一个字符。
已经有一些解决方案(包括一些开源解决方案)可以做类似的事情;我认为这将是您想要合并而不是从头开始构建的功能。为了让它正常工作,有很多细节需要做好,而且潜在的安全隐患也可能是相当大的。
首先,请注意您正在做的事情可能是一个非常糟糕的主意(阅读:有安全问题)。允许 Web 客户端在您的机器上执行任意命令是危险的。我希望所有这些都通过 SSL 运行并且需要登录……在这种情况下,您基本上重新发明了 SSH。
您可以为 shell 编写一个基本的 REPL,例如
while read line; do
eval $line;
done
它从 STDIN 读取命令,并打印到 STDOUT 和 STDERR。当您将它与 挂钩时IPC::Open3
,您可以从 Perl 编写在同一个 shell 会话中解释的命令。