【问题标题】:Programmatically navigate linux shell application以编程方式导航 linux shell 应用程序
【发布时间】:2015-01-14 09:50:15
【问题描述】:

我正在尝试确定是否可以以编程方式导航 linux shell 应用程序 - 基于文本。

具体来说,我想通过使用 PHP 和 phpSecLib 来实现这一点,但如果您知道更好/更简单的方法,请加入。

我知道如何使用PHP+phpSecLib通过SSH登录linux服务器,并运行shell命令。

因此,我们在后端服务器上有这个第 3 方应用程序,我们无法选择访问实时数据。 该应用程序有一个我们可以生成的报告,它将为我们提供各种 KPI 的“实时”图片,但是此报告屏幕不会自动刷新,因此必须从报告中退出并再次生成它以更新 KPI

当应用程序启动时,在“屏幕/输出”更新后不久,我会看到“启动画面”,上面写着“欢迎使用 Ye Olde 应用程序版本 3.14159”(名称是虚构的)发生并显示“主菜单”,其中每个菜单点都可以通过按键 (1-9a-z) 访问。

主菜单

                ┌────────────────────────────────────────────────┐
                │                                                │
                │   1    Foo                    bar              │
                │   2    Same                   procedure        │
                │   3    Rudolph                Reindeer         │
                │   4    Report                 generator        │
                │   5    Log-off                system           │
                │                                                │
                └────────────────────────────────────────────────┘

所以在这种情况下,我想进入“4 报告生成器”[按 4]。之后,“屏幕/输出”会更新为像上面这样的新子菜单,以及其他选项。在这里,我将继续“1 创建新报告”[按 1],再次进行“屏幕/输出”更新。现在有了新菜单,进入“2 Superhandy Super-report”[Press 2]。

之后,我想将文本从报告屏幕保存到文档中以供进一步解析。但这不是最初的问题。

另一个想法可能是..

..以某种方式使用宏或类似方法在 shell-script (Bash) 中执行此操作。

【问题讨论】:

标签: php shell ssh screen-scraping phpseclib


【解决方案1】:

我自己想出来的 ;-) 如果其他人遇到同样的问题,请留在这里。

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,参见 cmets。

【讨论】:

  • 我注意到您使用的是My_File_ANSI 而不是File_ANSI。你扩展File_ANSI了吗?如果是这样,您是否添加了任何更改?如果是这样,那么发布您的更改可能会很有用!
  • 嗨,唯一的改变是跳过File_ANSI 中未知字符的警告 :-) 未知字符是用于说明屏幕上边界线的字符。以下代码被注释掉了echo "{$this->ansi} unsupported\r\n";
猜你喜欢
  • 2021-05-03
  • 2017-10-27
  • 2023-02-20
  • 2018-03-25
  • 2017-10-29
  • 2017-09-27
  • 2013-03-19
相关资源
最近更新 更多