Net :: SCP / Net :: SCP ::期望 - 如何处理密码与密钥验证

时间:2010-01-08 19:13:39

标签: perl scp

我有一个适用于不同客户端的脚本,需要将SCP文件发送给不同的主机。取决于客户和组合的组合。服务器,我可能需要使用密码验证或公钥验证。我事先并不能确切地知道使用哪一个。

我使用了2个用于SCP的CPAN库:

  • Net :: SCP:仅适用于公钥认证
  • Net :: SCP :: Expect:仅适用于密码验证

问题是两个库都不适用于两种身份验证,而且我不知道提前使用哪一个。您知道如何使用这两种身份验证方案吗?

2 个答案:

答案 0 :(得分:5)

尝试一个并故障转移到另一个:

#! /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";
  }
}

答案 1 :(得分:0)

尝试Net :: OpenSSH