【问题标题】:Use in-memory file as argument in SFTP在 SFTP 中使用内存文件作为参数
【发布时间】:2012-10-05 23:30:46
【问题描述】:

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

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

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

谢谢!

【问题讨论】:

  • 听起来你需要一个内存文件系统,那么剩下的就很简单了。然后,解决方案将取决于主机操作系统。
  • 您可以创建一个命名管道并将名称传递给命名管道。
  • 一种解决方法是使用 ssh-agent 进行授权。

标签: perl sftp in-memory


【解决方案1】:

我查看了执行 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 代理。它将解密后的私钥保存在内存中,因此您可以立即将其从磁盘中擦除。

【讨论】:

  • 我最终转移到 Net::SFTP::Foreign 并使用密码短语,以便可以将密钥文件存储在加密的磁盘上。谢谢你的详细解答!!
猜你喜欢
  • 2015-07-26
  • 2015-05-21
  • 1970-01-01
  • 2017-10-17
  • 1970-01-01
  • 2023-04-06
  • 2015-06-26
  • 2016-01-14
  • 2015-02-04
相关资源
最近更新 更多