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