2013-08-07 2 views
0

원격 서버와 통신하기위한 스크립트를 작성하고 있습니다. "ls"나 "find/| grep foo"와 같은 기본 쉘 명령을 보내는 방법을 알고 있습니다. 그러나 나는 다른 끝에서 대화 형 응용 프로그램을 실행하고 있습니다.Perl Net :: SSH가 프롬프트를 수신하지 않습니다.

$ ssh-> shell을 호출하면 원격 서버에서 프롬프트가 표시되므로 SSH가이 프롬프트를 수신하고 있음을 알 수 있습니다. 그러나 스크립트가 쉘에서 차단되어 있기 때문에 아무 것도 할 수 없습니다.

두 개의 핸들러가 설치되었습니다. 스크립트를 사용하여 기본 ssh 호스트에 연결하고 쉘 명령을 실행하면 응답이 처리기로 전달되므로 확인됩니다. 그래서 나는 실행중인 애플리케이션의 프롬프트가 이들에게 보내지는 것을 기대했지만 그렇게하지는 않았다.

#!/usr/bin/perl -w 
use strict;  
use Net::SSH::Perl;  

my $host = 'rt.olsendata.com'; 
my $user = 'rtdemo'; 
my $pass = 'rtdemo';  
my %params = ('debug' => 1,'protocol' => 2); 
my $ssh = Net::SSH::Perl->new($host, %params); 

$ssh->register_handler("stderr", sub{ 
      my ($ssh, $packet) = @_; 
      receiveerrors($packet); 
     }); 
$ssh->register_handler("stdout", sub{ 
      my ($ssh, $packet) = @_; 
      receivedata($packet); 
     }); 
my ($output, $errors, $exit) = $ssh->login($user, $pass); 

이 시점에서 나는 "1"을 전송함으로써 프롬프트에 응답해야합니다. 그러나 이것은 원격 호스트에 의해 셸 명령으로 해석되며 프롬프트에 대한 응답이 아닙니다. 오류 "h : 1 : No such file or directory"를 리턴합니다.

시도해 보려면 코드 맨 위의 데모 ssh 계정을 사용하십시오. 공개적으로 사용할 수 있습니다.

편집 : Expect는이 문제를 해결하지만 Expect에서는 register_handler()와 동일한 기능을 찾을 수 없습니다. 내가 이것에 맞습니까?

+1

아마도'Net :: OpenSSH'를 사용해 볼 수 있을까요? 그것은 ssh를 다루는 가장 강력한 Perl 모듈 인 것 같습니다. –

답변

0

나는 ssh/sftp 세션을 자동화 할 것을 기대합니다.


Net::SSH::Perl은 "대화"세션 shell() 방법을 제공합니다. 그렇지 않으면 형제처럼 원격 서버에서 하나의 명령을 실행한다고 가정합니다.

+0

Expect 문서를 살펴 보았습니다. 그것은 대화 형 문제를 해결하지만 스트리밍 데이터에 필요한 register_handler와 동일한 것을 찾을 수 없습니다. – Peter

0

가장 간단한 해결책은 Net :: SSH :: Expect입니다. 아래는 코드입니다. 로그인 즉시 프롬프트 ("1"은 내가 원하는 선택)에 대한 응답으로 "1"을 보내야합니다. 그런 다음 다른 프롬프트가 나타나고 기본값을 원하기 때문에 \ n을 보냅니다. 그런 다음 입력 행을 영원히 한 줄씩 읽고 싶습니다. 그것은 매력처럼 작동합니다.

my $ssh = Net::SSH::Expect->new (
     host => $host, 
     user => $user, 
     password=> $pass, 
     raw_pty => 1 
    ); 
    my $login_output = $ssh->login(); 
    my $prompt = $ssh->exec("1"); 
    my $line; 
    $ssh->send("\n"); 
    while (defined ($line = $ssh->read_line())) { 
     print "$line\n"; 
    } 
관련 문제