我需要在Perl中打开SFTP连接,我需要使用dsa密钥文件,但出于安全原因,我实际上无法将文件存储在硬盘上。我正在尝试使用Net :: SFTP。
my $sftp = Net::SFTP->new(
$host, user=>"$userid",
ssh_args => {
identity_files => [ $pathToInMemoryKeyFile ]
}
);
我想我知道如何获取一个表示为内存文件句柄的字符串,但我不知道如何获取该文件句柄的路径,以便我可以将其作为ssh_args之一传递。有人有什么建议吗?
谢谢!
答案 0 :(得分:3)
我已经查看了做SFTP的各种选项(Net :: SFTP自2005年以来没有更新,Net :: SFTP :: Foreign更新),并且它们都通过文件进行密钥验证。
Net :: SFTP由Net :: SSH :: Perl支持,这是一个纯粹的Perl SSH实现。你可以做一些修补,使它做你想要的。我要为你勾勒出来。
修补或在Net::SSH::Perl::Auth::PublicKey->authenticate周围放置一个包装,以查找新的配置键。我们称之为identity_keys
。
sub authenticate {
my $auth = shift;
my $ssh = $auth->{ssh};
my $sent = 0;
if (my $agent = $auth->mgr->agent) {
do {
$sent = $auth->_auth_agent;
} until $sent || $agent->num_left <= 0;
}
return $sent if $sent;
##### This is the new bit which tries any keys passed in. ######
my $ik = $ssh->config->get('identity_keys') || [];
for my $key (@$ik) {
return 1 if $auth->_auth_key($key);
}
my $if = $ssh->config->get('identity_files') || [];
my $idx = $auth->{_identity_idx} || 0;
for my $f (@$if[$idx..$#$if]) {
$auth->{_identity_idx}++;
return 1 if $auth->_auth_identity($f);
}
}
auth_key
将是_auth_identity
的副本,但调用Net :: SSH :: Perl :: Key-&gt; read_private_key,这将是Net::SSH::Perl::Key->read_private_pem的内容减去打开并阅读来自文件的密钥。然后会将read_private_pem
用于read_private_key
。
或者,使用ssh-agent。它将解密的私钥保存在内存中,因此您可以立即从磁盘上擦除它。