2013-04-10 3 views
1

Perl 스크립트에 매우 익숙하며 라우터에 ssh에 perl 코드를 작성한 다음 라우터에서 scp export 명령을 실행합니다 (scp에서 라우터로 원격 대상 서버).

#!/usr/local/bin/perl 

use Net::SSH::Expect; 
use warnings; 

$hostname = "Router"; 

my $ssh = Net::SSH::Expect->new (
      host => $hostname, 
      password=> 'abcd', 
      user => 'admin', 
      raw_pty => 1, 
      timeout => 150, 
     ); 

my $login_output = $ssh->login(); 
     if ($login_output !~ /Router/) { 
     die "Login has failed. Login output was $login_output"; 
     } 

$ssh->send("scp export log traffic start-time equal 2013/04/01\@00:00:00 to user\@192.168.1.1:<path> end-time equal 2013/04/01\@01:00:00",3); 
$ssh->waitfor('[email protected]\'s password:\s*') or die "prompt 'password' not found"; 
$ssh->send("abcd"); 
$ssh->send("\n"); 
sleep 100; 
my $logout = $ssh->close(); 

print "=" x 50; 
print "\n"; 

나는 스크립트를 라우터에 잘 보았습니다 (스크립트를 실행할 때마다 라우터에서 새 사용자를 볼 수 있습니다). 그러나 몇 초 후에 스크립트가 오류로 종료됩니다. SSHProcessError ssh 프로세스가 종료되었습니다. cron1 줄에서 22

22 번째 줄에는 $ ssh-> waitfor ('[email protected] \'s password : \ s * ') 또는 "prompt'password 'not found"가 죽습니다.

+0

Net :: SSH :: 기대는 완전히 신뢰할 수 없습니다. 대신 [Net :: OpenSSH] (https://metacpan.org/module/Net::OpenSSH)를 사용하십시오. 대신 [Expect] (https://metacpan.org/module/Expect)와 함께 사용해보십시오. – salva

+0

감사합니다. salva. Net :: OpenSSH (Net :: SSH :: Expect 외에도)를 사용했지만 오류는 동일하게 유지됩니다. 어떤 아이디어? – user1500970

+0

실제 코드를 보지 않고도 알기 어렵습니다. 'sleep 100'은 원격 측에서 시간 초과를 유발할 수 있습니다. – salva

답변

0

$ hostname이 유효하지 않은 경우 동일한 문제가 발생했습니다.

die "Host $hostname not found" unless gethostbyname($hostname); 

갱신 .. 간단한 호스트 이름 확인이 먼저 나를 위해 그것을 고정 하 : 를 그것은 단지 SSHProcessError 오류가 발생합니다 모든 ssh 연결 오류에 대한 보인다.

0

서버에 로그인하는 데 다른 방법을 사용했습니다. 이 코드 조각에서 기능을 만들었고 매번 저에게 잘 작동합니다. 이것이 당신을 도울 수 있는지보십시오.

sub connect { 

       my $host =shift; 
       my $password=shift; 
       my $user=shift; 
       my $counter=0; 
       my $login_output; 
       $ssh = Net::SSH::Expect->new (
               host => "$host", 
               password=> "$password", 
               user => "$user", 
               raw_pty => 1 
              ); 

      $login_output = $ssh->run_ssh(); 

      LABLE_login: # Lable used for looping 
      $login_output=$ssh->read_all(); 


      if($login_output =~ /yes/){ # To check if you are logging in for the first time 
              $ssh->send("yes\n"); 
              sleep(2); 
              $login_output=$ssh->read_all(); 
              if($login_output =~ /Password/){ 
                        $ssh->send("$password\n"); 
                      } 
             } 

      elsif($login_output =~ /Password/) 
                { 
                  $ssh->send("$password\n"); 

                } 
else 
        { 
         sleep(2); 
         $counter++; 
         if($counter eq 3) 
          { print color('red');print "Cannot connect to host exiting now\n";print color('reset');exit();} 
         goto LABLE_login; 
        } 

      $login_output=$ssh->send("$password\n"); 
      return $ssh; 
      } 
관련 문제