원격 서버와 통신하기위한 스크립트를 작성하고 있습니다. "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()와 동일한 기능을 찾을 수 없습니다. 내가 이것에 맞습니까?
아마도'Net :: OpenSSH'를 사용해 볼 수 있을까요? 그것은 ssh를 다루는 가장 강력한 Perl 모듈 인 것 같습니다. –