Perl의 Telnet에서 스크래프 출력을 어떻게 스크린 출력합니까?

StackOverflow https://stackoverflow.com/questions/2236200

  •  19-09-2019
  •  | 
  •  

문제

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");

...하지만 제가 정말로하고 싶은 것은 텔넷 응답 (터미널 제어 문자 포함)을받은 다음 Curses를 사용하여 열 열을 검색하는 것입니다. 누구든지 내가 둘을 함께 연결할 수있는 방법을 아는 사람이 있습니까? 저주는 stdout에서만 작동 할 수있는 것 같습니다.

도움이 되었습니까?

해결책

당신은 찾고 있습니다 용어 :: VT102, VT102 터미널을 에뮬레이션합니다 (터미널 제어 문자를 가상 화면 상태로 다시 변환). 사용 방법을 보여주는 예가 있습니다. NET :: TELNET 안에 vt102/examples/telnet-usage.pl (예제 디렉토리는 어떤 이유로 vt102 디렉토리 안에 있습니다).

이것을 사용한 지 약 7 년이 지났지 만 (웹 기반 인터페이스로 자동화 한 시스템) 작동하는 데 사용되었습니다.

다른 팁

저주는 반대입니다. 프로그램 쓰기에서 터미널로 화면 업데이트를 최적화하기위한 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;
                }
        ]
);

Plain-Text 명령 및 응답과 순전히 상호 작용하는 경우 사용할 수 있습니다. 예상하다 그렇지 않으면 스크립트를 사용할 수 있습니다 용어 :: VT102, 스크랩 스크랩 (화면의 특정 부분 읽기, 텍스트 보내기, 스크롤의 이벤트 처리, 커서 움직임, 화면 콘텐츠 변경 및 기타) 응용 프로그램을 사용하여 스크랩 스크랩 (스크롤의 특정 부분을 읽고 텍스트 보내기, 이벤트 처리) 화면 제어를 위해 VT102 Escape Sequences (예 : Curses 라이브러리를 사용하는 응용 프로그램)를 사용합니다. .

또는 사용할 수 있습니다 스크립트 이것에 대한 명령.

Solaris Man-Page에서 :

설명

그만큼 script 유틸리티는 화면에 인쇄 된 모든 것을 기록합니다. 기록은 다음과 같습니다 파일 이름. 파일 이름이 제공되지 않으면 레코드가 파일에 저장됩니다. TypeScript...

스크립트 명령은 $ 쉘의 값에 따라 포크를 작성하고 하위 쉘을 생성 하고이 세션에서 텍스트를 기록합니다. 스크립트는 포크 쉘이 종료 될 때 또는 Control-D가 입력 될 때 끝납니다.

나는 또한 기대 대답에 대해서도 투표 할 것입니다. 나는 Gui'ish 응용 프로그램에서 비슷한 일을해야했습니다. 제어 캐릭터를 돌아 다니는 트릭 (지루하지만)은 반환 된 문자열에서 모든 기타 캐릭터를 벗기는 것이 었습니다. 그것은 스크랩 스크랩이 얼마나 지저분 해지는 지에 달려 있습니다.

예를 들어 해당 스크립트의 내 기능은 다음과 같습니다.

# 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