我已经查看了执行 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->read_private_key 的副本,这将是Net::SSH::Perl::Key->read_private_pem减去打开并从文件中读取密钥的内容。 read_private_pem
然后会被淘汰使用read_private_key
.
或者,使用 ssh-agent。它将解密的私钥保存在内存中,因此您可以立即将其从磁盘上擦除。