使用Net :: SCP绕过主机密钥检查

时间:2016-10-18 19:52:44

标签: perl

我正在使用Perl Net::SCP模块将SCP tarball发送到远程服务器。

远程服务器没有静态IP,因此每次IP地址更改时,发送计算机都需要接受主机密钥。

这会破坏我的脚本,因为现在每次IP更改时我都必须手动接受主机密钥。

我可以通过('A', 'B', 'C')绕过主机密钥检查吗?

我看到了Net::SCP::Expect的选项,但我不确定是否需要使用此模块。

1 个答案:

答案 0 :(得分:1)

解决方案

是的,您可以通过以下方式使用模块Net::SCP::Expect(假设为unix系统):

#!/usr/bin/perl
use strict;
use warnings;
use Net::SCP::Expect;

my $scp = Net::SCP::Expect->new(
    host     => 'localhost', # or target IP address
    user     => 'username',
    password => 'mysecretpass',
    auto_yes => 1, # automatically pass a 'yes' string to any yes/no questions
    timeout  => 5,
    option   => 'UserKnownHostsFile=/dev/null StrictHostKeyChecking=no' # the trick
);

# now send the file
$scp->scp('file.tar', 'TargetDirectory/') || die "scp() failed: $!\n";

说明

SCP实际上使用SSH,因此每当远程身份/指纹发生变化时,由于安全原因,不再允许连接。你可以想象,这是为了你自己的安全,因为你也可能成为“中间人攻击”或类似事件的受害者。您的机器很可能在以下文件中保存了所有已知指纹:

~/.ssh/known_hosts

这会给你带来麻烦。在上面的Perl脚本中,您可以看到如何将选项UserKnownHostsFile=/dev/nullStrictHostKeyChecking=no传递给构造函数。这些实际上是SSH选项,可以在命令行或机器的SSH配置文件中指定。由于SCP使用相同的选项,您可以将它们传递给模块,因此完全绕过您的身份检查。

为什么会这样?

通过用known_hosts替换(*)/dev/null文件,基本上给它一个无法修改的空文件。这允许您完全忽略安全检查,您的文件将按预期发送。

(*):当然它不会在文件系统中被替换,但模块只会将它用作临时位置/路径