2012-10-05 45 views
1

我需要在Perl中打開一個SFTP連接,我需要使用一個dsa密鑰文件,但出於安全原因,我實際上無法將文件存儲在硬盤上。我正在嘗試使用Net :: SFTP。在SFTP中使用內存文件作爲參數

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

我想我知道如何讓表示爲在內存中的文件句柄一個字符串,但我不知道如何獲取該文件句柄的路,使得我可以將它作爲ssh_args之一。有人有任何建議嗎?

謝謝!

+1

這聽起來像你需要一個內存中的文件系統,然後其餘的很容易。該解決方案將取決於主機操作系統。 –

+0

您可以創建一個命名管道並將名稱傳遞給命名管道。 – ikegami

+0

解決辦法之一是使用ssh-agent進行授權。 – Schwern

回答

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的::密鑰 - > read_private_key這將是Net::SSH::Perl::Key->read_private_pem減去打開和讀取該文件中的關鍵的膽量。然後read_private_pem將被燒燬以使用read_private_key

或者,使用ssh-agent。它將解密的私鑰保存在內存中,因此您可以立即從磁盤擦除它。

+1

我結束了移動到Net :: SFTP :: Foreign並使用密碼,以便密鑰文件可以存儲在磁盤加密。感謝您的詳細解答! –

相關問題