Net :: SCP / Net :: SCP :: Expect - как работать с паролем и аутентификацией ключа - PullRequest
3 голосов
/ 08 января 2010

У меня есть скрипт, который работает на разных клиентах, и мне нужно SCP-файлы для разных хостов. В зависимости от комбинации клиента и сервера, мне может понадобиться использовать аутентификацию по паролю или по открытому ключу. Я не могу заранее знать, какой из них использовать.

Я использую 2 библиотеки CPAN для SCP:

  • Net :: SCP: работает только с аутентификацией с открытым ключом
  • Net :: SCP :: Expect: работает только с аутентификацией по паролю

Проблема в том, что ни одна библиотека не работает для обеих аутентификаций, и я не знаю, какую из них использовать заранее. Вы знаете какой-либо способ работы с обеими схемами аутентификации?

Ответы [ 2 ]

5 голосов
/ 09 января 2010

Попробуйте один и переключитесь на другой:

#! /usr/bin/perl

use warnings;
use strict;

use Net::SCP qw/ scp /;
use Net::SCP::Expect;

my @hosts = qw/ host1 host2 host3 /;
my $user  = "YOUR-USERNAME-HERE";
my $pass  = "PASSWORD-GOES-HERE";
my $file  = "file-to-copy";

foreach my $host (@hosts) {
  my $dest = "$host:$file"; 

  my $scp = Net::SCP->new($host, $user);
  unless ($scp->scp($file => $dest)) {
    my $scpe = Net::SCP::Expect->new;
    $scpe->login($user, $pass);

    local $@;
    eval { $scpe->scp($file => $dest) };
    next unless $@;

    warn "$0: scp $file $dest failed:\n" .
         "Public key auth:\n" .
         "    $scp->{errstr}\n" .
         "Password auth:\n" .
         "    $@\n";
  }
}
0 голосов
/ 13 января 2010

попробуй Net :: OpenSSH

...