phpseclib ssh2 pty telnet cisco - 如何在 "show version" 中推进 --more--

phpseclib ssh2 pty telnet cisco - how to advance --more-- in "show version"

我在 cisco 路由器上使用这个 "show version" 命令时遇到问题,我需要在出现“--show more--”时按一个键前进到下一个屏幕。关注代码:

function showVersion($ssh, $ansi){
    $ssh->enablePTY();
    $ssh->write("show version\n");
    //$ssh->exec("show version");

    $prompt_saida = "";

    $ssh->setTimeout(3);
    $prompt_temp = $ssh->read('#--More--|\[>\]#', NET_SSH2_READ_REGEX);
    $prompt_saida = $prompt_temp;

    $ssh->setTimeout(3);
    while($prompt_temp = $ssh->read('#--More--|\[>\]#', NET_SSH2_READ_REGEX)){
        $ssh->setTimeout(3);
        $prompt_saida.= $ssh->read(NET_SSH2_READ_REGEX);
                if (!preg_match('#--More--$#', $prompt)) {                break;            }
        $ssh->write(' ');
        $ssh->setTimeout(3);
    }
    return $prompt_saida;
    //$ssh->write("terminal length 0\n");
    //$ssh->write("\n");

    $ssh->setTimeout(3);
    //$ssh->read();
    //$ssh->getLog();
    $ansi->appendString($ssh->read());

}

上次登录时间:2017 年 10 月 4 日星期三 15:41:46 来自 xx.xx.xxx.xxx

仅限授权用户访问。 [xxxxxxxxxx[xxx@[34;1mPRA-xxxxxxxx[xxxx> [xxx

认证成功!

"DO NOT FORGET SAVE ROUTER CONFIGURATION ON NVRAM, AFTER CONSOLIDATING THE ALTERATIONS !!"

xxxxx_xxxx_xx>显示版本 bash:显示:未找到命令 [xxxxxxxxxx[xxx@[34;1mPRA-xxxxxxxx[xxxx> [xxx

$ssh->exec("show version");

上次登录时间:2017 年 10 月 4 日星期三 15:41:46 来自 xx.xx.xxx.xxx

仅限授权用户访问。 [xxxxxxxxxx[xxx@[34;1mPRA-xxxxxxxx[xxxx> [xxx

认证成功!

"DO NOT FORGET SAVE ROUTER CONFIGURATION ON NVRAM, AFTER CONSOLIDATING THE ALTERATIONS !!"

xxxxx_xxxx_xx>/bin/bash:显示:未找到命令

你能帮我吗?我将不胜感激!

我还想知道在屏幕上显示路由器登录的最佳方式:

$ssh->read();
$ssh->read(NET_SSH2_READ_REGEX);
$ssh->getLog();
$ansi->getScreen();

谢谢

I need to advance to the next screen by pressing a key when "--show more--" appears.

代码正在寻找“--More--”——而不是“--show more--”。也许这就是你的意思?

此外,您正在做 $prompt_saida.= $ssh->read(NET_SSH2_READ_REGEX);。也许尝试做 $prompt_saida.= $ssh->read(); 代替。因为你基本上是在等待数字 2(因为 NET_SSH2_READ_REGEX 是由 define('NET_SSH2_READ_REGEX', 2); 定义的,而 2 不等于 --More-- 所以它可能会导致 break 被过早调用。

xxxxx_xxxx_xx>/bin/bash: show: command not found

你得到这个的事实让我想知道你是否真的能够 "show version" 即使使用像 PuTTY 或 OpenSSH 这样的 SSH 客户端。如果不是,则此问题与 phpseclib 无关,讨论它可能会分散您对可以帮助您的 Cisco IOS (?) 专家的注意力。 IE。他们可能在看到所有 PHP 代码后就停止阅读了。

I would also like to know the best way to show the router log on screen:

我想这取决于您如何定义最佳,但如前所述,$ssh->read(NET_SSH2_READ_REGEX) 并不像您认为的那样。 $ssh->read('#pattern#', NET_SSH2_READ_REGEX) 有但没有 $ssh->read(NET_SSH2_READ_REGEX).

$ssh->getLog() 仅在您启用了日志记录时才执行操作(例如 define('NET_SSH2_LOGGING', 2))。它还显示未加密的 SSH 数据包,从密钥交换到通道的打开等。这可能不是您想要的。

至于 $ansi->getScreen()... 如果您不喜欢输出中的 ANSI 代码,那也可以。你确实有一些。例如。 [xxxxxxxxxx[xxx@[34;1mPRA-xxxxxxxx[xxxx> - @[34;1m 位是 ANSI。

$ansi->getHistory() 一起玩可能也值得。