我已对此进行更新,以澄清我的问题...
最初,我要求一种在持久会话中运行命令的好方法,这样我就可以发送命令,获得响应以及冲洗并重复执行。对于愿意给我建议的人们来说,澄清我的最终目标似乎更有用,因为解决方案可能不符合我最初的方向。所以,这是低点:)
我的巨大感谢您迄今为止所提供的每一个人以及那些停止提供帮助的人。
我正在研究一个脚本,该脚本可以安全地允许我使用内部托管的网页(受密码保护和加密的网页)在命令行上运行命令并检索输出。
我知道像shellinabox和ajaxTerm这样的东西允许基于浏览器的SSH,这是我的最终目标...有点...有个陷阱...
我需要有一台托管终端仿真器的服务器。它应该允许一个人登录到终端仿真器并像使用本地仿真器一样使用它,但是任何和所有命令都应代理到远程客户端,该客户端通过查询命令,运行命令并返回结果和终端来检索命令输出到主服务器。父脚本接收命令,将它们放入数据库,然后等待显示的结果,然后再允许其他命令。该脚本将在睡眠和自动油门之间循环,因此所创建的句柄将保持打开状态,直到远程会话空闲了一定时间或发送断开连接为止。
最初,根据我的研究和头脑风暴,似乎最好使用OPEN来获取外壳的句柄。为此,我做了很多的谷歌搜索,尽管这看起来很简单,但我还是以一种希望的方式空缺了代理shell会话的好方法。
有人可以提出可能有用的建议吗?我很乐意使用一个已经可用的开源终端,并弄清楚如何使它“开始”一个会话而不实际开始一个会话,以便远程端可以连接,检索和运行结果,然后传回数据。
基本步骤
1)用户打开托管在服务器A上的基于Web的终端。
2)会话立即显示为“打开”。
3)用户输入命令。
4)终端接受命令并等待
5)互联网另一端的客户端计算机检入,发现有一条命令正在等待它,因此它抓住了它
6)客户端计算机启动会话并运行该命令
7)客户端计算机返回结果并开始循环查找更多命令
8)服务器A获取结果并将其返回到基于Web的终端
9)用户看到结果,终端现在准备接受另一个命令
10)持续进行直到一段时间没有发出命令为止,此时会话退出,并且远程端返回到仅偶尔检查命令
我编写了所有安全的东西,并且工作得很好。我已经检查了命令,来回传递,在空闲时自动节流,数据库日志记录等工作...我只是不想重新发明轮式虚拟终端和明智的命令摘要...但是我有不知道如何最好地做到这一点。为此,我试图提出自己的基本命令管理代码。问题是正在重新发明轮子,它比我所关心的要复杂得多。
在我看来,最好的选择是以某种方式“拆分”基于Web的开放源虚拟终端模拟器之一,以便我拦截命令,将其缓存在db中,然后从db中返回这样它就可以在仿真器中看起来像是本地的,只是速度很慢,而实际上却是远程的...
我认识到这可能有点令人困惑,所以请让我知道这一切是否有意义或者是否可以澄清。
编辑
到目前为止,这里是我进行命令消化的工作之类……这只是交互式示例。实际命令将远程发送和接收。我之所以说是因为ping之类的某些东西打破了它。 vi也可以打破它,但这是可以预期的...尽管我很乐意为您提供解决方法。
这是快速且丑陋的方法,但适用于基本内容。我确信就创建僵尸进程而言这有点危险,但稍后我将重点介绍。
#!/usr/bin/perl -w
use strict;
use warnings;
use IPC::Open3;
use IO::Select;
#connect to our session using sudo
my $pid = open3(\*WRITE, \*READ,\*ERROR,"sudo su");
my $checkRead = new IO::Select();
my $checkError = new IO::Select();
$checkRead->add(\*READ);
$checkError->add(\*ERROR);
#hold it
my $query = '';
#want to do it at least once...
do{
my $error = '';
my $answer = '';
#give us a prompt
print "\n[REM PROMPT]# ";
$query = <STDIN>;
chomp($query);
#make sure we aren't exiting
if($query !~/^EXIT\s*$/){
#send what we entered
print WRITE "$query\n";
#We need to give this a chance to run
select(undef,undef,undef,.02);
#get any error from bc
sysread(ERROR,$error,8192) if $checkError->can_read(0);
if($error){print "\e[1;31m ERROR: $error \e[0m \n"}
#get the answer from bc
sysread(READ,$answer,8192) if $checkRead->can_read(0);
if($answer){ print "$answer\n"; }
}
#give us a way to get out
}while($query !~/^EXIT\s*$/);
#make sure it all exits
waitpid($pid, 1);
上述问题是,尽管我可以向其传递基本命令1)它阻塞了子过程中的任何东西2)我将需要重新发明基于Web的终端3)可能没有对僵尸进程很好...
任何有益的想法或想法将不胜感激!