3

我一直在尝试使用包 Net::SFTP 和 RSA 密钥进行 sftp。我可以在没有密码的情况下手动 sftp 到我的 sftp 服务器,但是在使用该软件包时它不起作用。我快没主意了。

my $ftp = Net::SFTP->new($HOST, user => $USER, ssh_args => { identity_files => [ "/Users/user/.ssh/id_rsa" ] }, debug => 3 );

它给了我以下错误:

尝试使用密钥文件“/Users/tom/.ssh/id_rsa”进行 pubkey 身份验证

致命:rsa 导入失败:输入数据包无效。在 /Library/Perl/5.18//Crypt/PK/RSA.pm 第 123 行。

任何帮助将不胜感激,谢谢!

4

1 回答 1

2

我自己也遇到了这个。

正如您在评论中指出的那样,问题是我的(和您的)私钥是加密的。加密的私钥需要您输入密码才能使用,而 perl 模块似乎不支持这一点。

您声称使用此密钥时不需要密码,但可能是因为 sftp 正在使用您的 ssh 代理?即您在哪里输入一次密码,然后密钥保留在内存中供所有 ssh 系列工具使用?看起来 perl 模块也不支持代理,但@salva 建议使用Net::SFTP::Foreign应该可以解决这个问题。

值得注意的是,我在运行以前在我的工作站上运行良好的代码时遇到了这个异常,但是在新安装的 perl 上。我认为发生的事情是 Net::SSH::Perl 模块增加了对读取私钥的支持,或者将读取私钥的失败更改为致命错误,而不仅仅是忽略密钥。我的代码无论如何都没有使用密钥,但现在无法使用该加密密钥。这是固定的:

my $sftp= Net::SFTP->new(
   ...
   ssh_args => [ identity_files => [] ]
);

当然,您可以添加您希望它使用的特定(未加密)身份文件的列表,而不是默认用户的 RSA id。

如果代码不容易编辑,您还可以通过将环境变量设置$HOME为其中没有键的内容来避免该问题。

于 2018-08-15T17:11:54.303 回答