Php 以编程方式导航linux shell应用程序
我试图弄清楚是否有可能在基于文本的linux shell应用程序中进行程序化导航 具体来说,我希望通过使用PHP和实现这一点,但如果您知道更好/更简单的方法,请参与 我知道如何使用PHP+phpSecLib通过SSH登录到linux服务器,并运行shell命令 因此,我们在后端服务器上有这个第三方应用程序,在那里我们没有访问实时数据的选项。 应用程序有一个我们可以生成的报告,它将为我们提供各种KPI的“实时”图片,但是此报告屏幕不会自动刷新,因此必须从报告中返回并再次生成报告以更新KPI 当应用程序启动时,我看到一个“启动屏幕”,上面写着“欢迎使用Ye Olde application ver.3.14159”(名称是虚构的),在“屏幕/输出”更新发生后不久,“主菜单”出现,每个菜单点都可以通过按键(1-9a-z)访问 主菜单Php 以编程方式导航linux shell应用程序,php,shell,ssh,screen-scraping,phpseclib,Php,Shell,Ssh,Screen Scraping,Phpseclib,我试图弄清楚是否有可能在基于文本的linux shell应用程序中进行程序化导航 具体来说,我希望通过使用PHP和实现这一点,但如果您知道更好/更简单的方法,请参与 我知道如何使用PHP+phpSecLib通过SSH登录到linux服务器,并运行shell命令 因此,我们在后端服务器上有这个第三方应用程序,在那里我们没有访问实时数据的选项。 应用程序有一个我们可以生成的报告,它将为我们提供各种KPI的“实时”图片,但是此报告屏幕不会自动刷新,因此必须从报告中返回并再次生成报告以更新KPI 当应用
┌────────────────────────────────────────────────┐
│ │
│ 1 Foo bar │
│ 2 Same procedure │
│ 3 Rudolph Reindeer │
│ 4 Report generator │
│ 5 Log-off system │
│ │
└────────────────────────────────────────────────┘
所以在本例中,我想进入“4报告生成器”[按4]。之后,“屏幕/输出”会更新为一个新的子菜单,如上图所示,并带有其他选项。在这里,我将进入“1创建新报告”[按1],再次进行“屏幕/输出”更新。现在使用新菜单,进入“2超级报告”[按2]
之后,我想将文本从报告屏幕保存到一个文档,以便进一步解析。但这不是最初的问题
另一个想法可能是..
…在shell脚本(Bash)中以某种方式使用宏或类似程序来完成 我自己解决了;-)如果有人碰到同样的问题,就把它留在这里
require_once('Net/SSH2.php');
$ip = '127.0.0.1'; // The IP of the SSH server
$username = 'username';
$password = 'password';
$ssh = new Net_SSH2($ip);
if (!$ssh->login($username, $password)) {
exit('Login Failed');
}
// Set a reasonable timeout (secs)
$ssh->setTimeout(5);
// Prepare ANSI "screen reader"
$ansi = new File_ANSI();
$ansi->setDimensions(200, 30); // set number of collumns and rows of each screen
// Should probably do some stuff here to make sure we're ready for next step
$ssh->write("/usr/bin/3rdpartybackendapp\n"); // Start the backend application
// Read until the "Please select" text appears
$ssh->read('Please select');
$ssh->write("4"); // Select "4: Report generator"
$ansi->appendString($ssh->read('Please select'));
$ssh->write("1"); // Select "1: Create reports"
$ansi->appendString($ssh->read('Please select'));
$ssh->write("h"); // Select "H: Dashboard report
$ansi->appendString($ssh->read('Q Quit'));
$output = strip_tags($ansi->getScreen()) . PHP_EOL . PHP_EOL; // Collect the screen
$fulloutput .= $output;
// The report has multiple pages, so continue to read pages
// until there are no more pages to read.
// Application does not show "N Next" on last page.
while(false !== strpos($output, 'N Next')) {
$ssh->write("n"); // Select "N: Next page
$ansi->appendString($ssh->read('Q Quit'));
$output = strip_tags($ansi->getScreen()) . PHP_EOL . PHP_EOL; // Collect the screen
$fulloutput .= $output;
}
echo strip_tags($fulloutput); // outputs HTML
// Terminate the SSH session
$ssh->disconnect();
更新:
在上面的示例中,从扩展的
My_File\u ANSI
更改为File\u ANSI
,请参见注释。菜单可能是使用ANSI转义码创建的。你可以破译这些:至于这是否真的回答了你的问题。。。idk。我不完全确定您的问题是什么?我注意到您使用的是My\u File\u ANSI
而不是File\u ANSI
。您是否扩展了ANSI文件?如果是,您是否添加了任何更改?如果是这样,那么发布您的更改可能会很有用!您好,唯一的改变是跳过文件中未知字符的警告:-)未知字符是用于在屏幕上显示边框线的字符。以下代码被注释掉echo“{$this->ansi}不受支持\r\n”代码>