2010-01-08 50 views
3

我有一个脚本可以在不同的客户端上运行,并且需要SCP文件到不同的主机。根据客户端&服务器的组合,我可能需要使用密码认证或公钥认证。我无法预先知道使用哪一个。Net :: SCP/Net :: SCP :: Expect - 如何处理密码与密钥认证

有2个CPAN库SCP,我使用:

  • 的Net :: SCP:可与公钥认证只
  • 的Net :: SCP ::期待:作品只有
  • 密码认证

问题是这两个库都不适用于这两种认证,我不知道哪一个可以提前使用。你知道有两种认证方案可以使用吗?

回答

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 [email protected]; 
    eval { $scpe->scp($file => $dest) }; 
    next unless [email protected]; 

    warn "$0: scp $file $dest failed:\n" . 
     "Public key auth:\n" . 
     " $scp->{errstr}\n" . 
     "Password auth:\n" . 
     " [email protected]\n"; 
    } 
} 
+1

其实,网:: SCP不支持:-( – Julien 2010-01-26 18:23:37

+0

我试过非标准端口,它不处理这两种情况 – Julien 2010-01-26 18:58:02

0

试验网:: OpenSSH的