1

PerlでSFTP接続を開く必要があり、dsaキーファイルを使用する必要がありますが、セキュリティ上の理由から、実際にはファイルをハードディスクに保存できません。Net::SFTPを使用しようとしています。

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

メモリ内のファイルハンドルとして表される文字列を取得する方法は知っていると思いますが、ssh_argsの1つとして渡すことができるようにそのファイルハンドルのパスを取得する方法がわかりません。誰か提案はありますか?

ありがとう!

4

1 に答える 1

3

SFTPを実行するためのさまざまなオプション(Net :: SFTPは2005年以降更新されていません、Net :: SFTP :: Foreignはより最新です)を調べましたが、それらはすべてファイルを介してキー認証を実行します。

Net :: SFTPは、純粋なPerlSSH実装であるNet:: SSH::Perlによってサポートされています。パッチを適用して、必要な処理を実行できます。私はあなたのためにそれをスケッチするつもりです。

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_identityNet :: 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 に答える