Net::SCP / Net::SCP::Expect - 如何处理密码和密钥认证问题

3
我有一个脚本可以在不同的客户端上运行,并需要将文件SCP到不同的主机。根据客户端和服务器的组合,我可能需要使用密码身份验证或公钥身份验证。我事先无法确定要使用哪种方法。
有两个用于SCP的CPAN库:
  • Net::SCP:仅使用公钥身份验证
  • Net::SCP::Expect:仅使用密码身份验证
问题是,这两个库都不能同时使用两种身份验证方式,而我又不知道该提前使用哪个。您是否知道同时处理这两种身份验证方案的方法?
2个回答

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
实际上,Net::SCP不支持非标准端口 :-( - Julien

0

尝试使用Net::OpenSSH


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接