代码之家  ›  专栏  ›  技术社区  ›  Julien

net::scp/net::scp::expect-如何处理密码与密钥身份验证

  •  3
  • Julien  · 技术社区  · 15 年前

    我有一个在不同客户机上工作的脚本,需要将文件scp到不同的主机。根据客户机和服务器的组合,我可能需要使用密码身份验证或公钥身份验证。我不能提前知道该用哪一个。

    我使用了两个用于scp的cpan库:

    • net::scp:仅适用于公钥身份验证
    • net::scp::expect:仅适用于密码身份验证

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

    2 回复  |  直到 15 年前
        1
  •  5
  •   Greg Bacon    15 年前

    尝试其中一个,然后故障切换到另一个:

    #! /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";
      }
    }
    
        2
  •  0
  •   salva    15 年前

    尝试net::openssh