以编程方式导航 linux shell 应用程序
Programmatically navigate linux shell application
我正在尝试弄清楚是否有可能以编程方式导航 linux shell 应用程序 - 基于文本。
具体来说,我想通过使用 PHP 和 phpSecLib 来实现这一点,但如果您知道 better/easier 解决方法,请参与。
我知道如何使用 PHP+phpSecLib 通过 SSH 登录到 linux 服务器,以及 运行 shell 命令。
所以我们在后端服务器上有这个第 3 方应用程序,我们无法在其中访问实时数据。
该应用程序有一个我们可以生成的报告,它将为我们提供各种 KPI 的 "live" 图片,但是此报告屏幕不会自动刷新,因此必须退出报告并再次生成它以进行更新关键绩效指标
当应用程序启动时,我看到 "splash screen" 说“欢迎使用 Ye Olde 应用程序版本 3.14159”(名称是虚构的),紧接着"screen/output" 发生更新并显示 "Main menu",其中每个菜单点都可以通过击键 (1-9a-z) 访问。
主菜单
┌────────────────────────────────────────────────┐
│ │
│ 1 Foo bar │
│ 2 Same procedure │
│ 3 Rudolph Reindeer │
│ 4 Report generator │
│ 5 Log-off system │
│ │
└────────────────────────────────────────────────┘
所以在这种情况下,我想进入“4 报告生成器”[按 4]。之后 "screen/output" 更新为一个新的子菜单,如上,带有其他选项。在这里,我将进入“1 创建新报告”[按 1],再次 "screen/output" 更新。现在有了新菜单,进入“2 Superhandy Super-report”[按 2]。
之后我想将文本从报告屏幕保存到文档以供进一步解析。但这不是最初的问题。
另一个想法可能是..
..以某种方式在 shell-script (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_ANSI
更改为 File_ANSI
,请参阅注释。
我正在尝试弄清楚是否有可能以编程方式导航 linux shell 应用程序 - 基于文本。
具体来说,我想通过使用 PHP 和 phpSecLib 来实现这一点,但如果您知道 better/easier 解决方法,请参与。
我知道如何使用 PHP+phpSecLib 通过 SSH 登录到 linux 服务器,以及 运行 shell 命令。
所以我们在后端服务器上有这个第 3 方应用程序,我们无法在其中访问实时数据。 该应用程序有一个我们可以生成的报告,它将为我们提供各种 KPI 的 "live" 图片,但是此报告屏幕不会自动刷新,因此必须退出报告并再次生成它以进行更新关键绩效指标
当应用程序启动时,我看到 "splash screen" 说“欢迎使用 Ye Olde 应用程序版本 3.14159”(名称是虚构的),紧接着"screen/output" 发生更新并显示 "Main menu",其中每个菜单点都可以通过击键 (1-9a-z) 访问。
主菜单
┌────────────────────────────────────────────────┐
│ │
│ 1 Foo bar │
│ 2 Same procedure │
│ 3 Rudolph Reindeer │
│ 4 Report generator │
│ 5 Log-off system │
│ │
└────────────────────────────────────────────────┘
所以在这种情况下,我想进入“4 报告生成器”[按 4]。之后 "screen/output" 更新为一个新的子菜单,如上,带有其他选项。在这里,我将进入“1 创建新报告”[按 1],再次 "screen/output" 更新。现在有了新菜单,进入“2 Superhandy Super-report”[按 2]。
之后我想将文本从报告屏幕保存到文档以供进一步解析。但这不是最初的问题。
另一个想法可能是..
..以某种方式在 shell-script (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_ANSI
更改为 File_ANSI
,请参阅注释。