1

我需要在 Perl 中打开一个 SFTP 连接,并且需要使用 dsa 密钥文件,但出于安全原因,我实际上不能将文件存储在硬盘上。我正在尝试使用 Net::SFTP。

my $sftp = Net::SFTP->new(  
    $host, user=>"$userid",
    ssh_args => {
        identity_files => [ $pathToInMemoryKeyFile ]
    }
);

我想我知道如何获取表示为内存文件句柄的字符串,但我不知道如何获取该文件句柄的路径,以便可以将其作为 ssh_args 之一传递。有人有什么建议吗?

谢谢!

4

1 回答 1

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->read_private_key 的副本,这将是Net::SSH::Perl::Key->read_private_pem减去打开并从文件中读取密钥的内容。 read_private_pem然后会被淘汰使用read_private_key.

或者,使用 ssh-agent。它将解密的私钥保存在内存中,因此您可以立即将其从磁盘上擦除。

于 2012-10-07T05:18:09.467 回答