在SFTP中使用内存文件作为参数

时间:2012-10-05 23:30:47

标签: perl sftp in-memory

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

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

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

谢谢!

1 个答案:

答案 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。它将解密的私钥保存在内存中,因此您可以立即从磁盘上擦除它。