我有一个使用Net::SSH2的简单 perl 测试脚本,但我无法让它与公钥身份验证一起工作。
注意:在阅读了几个回复后,我意识到我应该提到我创建了脚本来帮助缩小我在使用 Net::SSH2 的另一个应用程序中遇到的问题。因此,我无法切换到其他软件包,例如Net::OpenSSH或Net::OpenSSH::Compat::SSH2。
注意更新:正如萨尔瓦 指出的那样,无需修补原始应用程序即可使用Net::OpenSSH::Compat::SSH2 。
这是代码:
use strict;
use warnings;
use 5.10.0;
use Net::SSH2;
my $ssh2 = Net::SSH2->new();
my $auth;
if ( $ssh2->connect('hostname') ) {
$auth = $ssh2->auth_publickey(
'username',
'/home/mike/.ssh/id_rsa.pub',
'/home/mike/.ssh/id_rsa',
'password'
);
}
if ($auth && $ssh2->auth_ok) {
say 'Success';
} else {
say join ', ', $ssh2->error;
}
我一直ssh-keygen
在 Ubuntu 上使用生成密钥对:
ssh-keygen -t rsa
ssh-copy-id user@server
ssh user@server
以上工作正常 - 我可以通过 SSH 连接到服务器。
当我运行 Perl 代码时,使用受密码保护的密钥时出现以下错误:
-16, LIBSSH2_ERROR_FILE, Unable to initialize private key from file
如果我尝试使用非密码保护的密钥,它可以正常工作。
我安装了以下库:
Net::SSH2 0.35
libssh2-1 1.2.2-1
libssh2-1-dev 1.2.2-1
ssh 1:5.3p1-3ubuntu6
openssh-server 1:5.3p1-3ubuntu6
openssh-client 1:5.3p1-3ubuntu6
openssl 0.9.8k-7ubuntu8.6
libssl-dev 0.9.8k-7ubuntu8.6
情节变厚了
如果我删除libssh2-1
and libssh2-1-dev
,我会得到一个错误,正如预期的那样:
Can't load '/usr/local/lib/perl/5.10.1/auto/Net/SSH2/SSH2.so'
如果我libssh2
从源代码构建,我无法重新安装Net::SSH2
,因为它找不到开发头文件。但是,如果我重新安装libssh2-1
,libssh2-1-dev
然后libssh2
从源代码构建和安装,它就可以工作。
这是否意味着在 Ubuntu 10.04 上构建 libssh2-1-dev 有问题?如果是这样,我如何libssh2
从源安装并正确安装Net::SSH2
,而不需要libssh2-1-dev
. 我认为从源代码构建正在覆盖或覆盖 Ubuntu 包。
更新
正如Daniel Stenberg 的回复中所指出的,Ubuntu 10.04 软件包现在有点过时(版本 1.2.2,与最新的稳定版本 1.2.8 相比)。从 Ubuntu 软件包的“顶部”源安装 libssh2 解决了这个问题。但是,这对我来说感觉很混乱。如何删除 Ubuntu 软件包,从源代码安装 libssh2,并且仍然构建 Net::SSH2 — 我如何告诉 Net::SSH2 在哪里可以找到 libssh2 开发头文件?
更新 2
salva 再次进行救援,并展示了如何使用和目录配置Net::SSH2安装程序,以便它可以与 libssh2 的源安装一起使用。谢谢萨尔瓦!请注意,可以只覆盖.顶部的和变量而不是修补。直到我查看了萨尔瓦的补丁,我才意识到这一点。lib
include
Makefile.PL
$lib
$inc
Makefile.PL