我可以在perl中设置telnet连接,没有问题,并且刚刚发现了诅咒,并且想知道我是否可以一起使用两者来刮擦Telnet会话中的输出。

我可以使用下面的简单脚本在行上查看stdout的内容:

use Curses;
my $win = new Curses;
$win->addstr(10, 10, 'foo');
$win->refresh;
my $thischar=$win->inch(10,10);
print "Char $thischar\n";

并使用以下内容可以打开telnet连接并毫无问题地发送接收命令:

use net::telnet;
my $telnet = new Net::Telnet (Timeout => 9999,);
$telnet->open($ipaddress) or die "telnet open failed\n";
$telnet->login($user,$pass);
my $output = $telnet->cmd("command string");

...但是我真正想做的是获取telnet响应(其中包括终端控制字符),然后使用诅咒在行列基础上进行搜索。有人知道我可以将两者连接在一起的方式吗?在我看来,诅咒只能在Stdout上运作

有帮助吗?

解决方案

您正在寻找 术语:: VT102, ,模拟VT102终端(将终端控制字符转换回虚拟屏幕状态)。有一个示例显示如何使用它 net :: telnetVT102/示例/telnet-usage.pl.pl (出于某种原因,示例目录在VT102目录内部)。

自从我使用它已经过去了7年(我正在自动化的系统切换到基于Web的界面),但是它曾经工作。

其他提示

诅咒相反。它是一个C库,用于优化从程序编写到终端的屏幕更新,最初旨在在慢速串行连接中使用。它没有能力从一系列控制字符中刮擦布局。

一个更好的赌注是一个终端模拟器,其具有具有此类屏幕刮擦的API。在我的头顶上,我不确定是否有任何开源终端仿真器这样做,但是肯定可以使用商业的仿真器。

你可能想要类似的东西 预计

use strict;
use warnings;

use Expect;

my $exp = Expect->spawn("telnet google.com 80");

$exp->expect(15, #timeout
        [
                qr/^Escape character.*$/,
                sub {
                        $exp->send("GET / HTTP/1.0\n\n");
                        exp_continue;
                }
        ]
);

如果您纯粹与普通文本命令和响应进行交互,则可以使用 预计 脚本,否则,您可以使用 术语:: VT102, ,它使您可以使用VT102使用VT102屏幕控制的Escape序列(例如,使用Curses库的应用程序)应用程序进行屏幕刮擦(读取屏幕的特定部分,发送文本,浏览事件,光标运动,更改屏幕内容等)应用程序) 。

或者您可以使用 脚本 为此命令。

来自Solaris Man-Page:

描述

script 实用程序记录了屏幕上打印的所有内容。记录写给 文件名. 。如果没有给出文件名,则记录保存在文件中 打字稿...

脚本命令叉并根据$ shell的值创建子壳,并记录本会话中的文本。当叉子外壳退出或键入Control-D时,脚本结束。

我也会为期望的答案投票。我必须做一些类似的申请。绕过控制角色的技巧(尽管乏味)是从返回的字符串中剥离所有MISC角色。这取决于屏幕刮擦最终的混乱程度。

这是我从该脚本的功能作为示例:

# Trim out the curses crap
sub trim {
    my @out = @_;
    for (@out) {
        s/\x1b7//g;
        s/\x1b8//g;
        s/\x1b//g;   # remove escapes
        s/\W\w\W//g;
        s/\[\d\d\;\d\dH//g;  # 
        s/\[\?25h//g;
        s/\[\?25l//g;
        s/\[\dm//g;
        s/qq//g;
        s/Recall//g;
        s/\357//g;
        s/[^0-9:a-zA-Z-\s,\"]/ /g;
        s/\s+/ /g;    # Extra spaces

    }
    return wantarray ? @out : $out[0];
}
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top