gpt4 book ai didi

perl - 使用 Net::SCP 绕过主机 key 检查

转载 作者:行者123 更新时间:2023-12-04 23:07:14 30 4
gpt4 key购买 nike

我正在使用 Perl Net::SCP模块到 SCP tarballs 到远程服务器。

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

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

有没有办法让 Net::SCP 绕过主机 key 检查?

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

最佳答案

解决方案

是的,您可以通过以下方式使用模块 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 使用相同的选项,您可以将它们传递给模块,因此在您的情况下完全绕过身份检查。

为什么有效?

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

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

关于perl - 使用 Net::SCP 绕过主机 key 检查,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40116906/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com