簡體   English   中英

PHP PHPSECLIB SFTP 使用私鑰在 RSA 上給出錯誤無法實例化抽象 class

[英]PHP PHPSECLIB SFTP using private key giving error on RSA Cannot instantiate abstract class

我通過使用composer安裝了phplibsec v3。 我找到了正確的路徑,現在它在遇到 $rsa = new RSA() 之前不會給出任何錯誤。 It then errors and says: PHP Fatal error: Uncaught Error: Cannot instantiate abstract class phpseclib3\C rypt\RSA in C:\Temp\PHPSCRIPTS\mmax_send_gl_file.php:6 Stack trace: #0 {main} thrown in C:\Temp \PHPSCRIPTS\mmax_send_gl_file.php 在第 6 行

這是我的代碼:

require 'c:\temp\php\vendor\autoload.php';
use phpseclib3\Net\SSH2;
use phpseclib3\Crypt\RSA;
use phpseclib3\Net\SFTP;
$rsa = new RSA();
$rsa->loadKey(file_get_contents('C:\temp\phpscripts\mmax.ppk'));
$sftp = new SFTP('sftp.server.com');
echo $sftp->get('test.txt');

如果我取出 $rsa 行,新的 SFTP 不會崩潰,但我需要私鑰。 我嘗試了幾種變體,閱讀了每篇關於此的帖子並為此工作了幾個小時。 我無法讓它工作。 誰能告訴我我做錯了什么?

另外,我可以使用帶有 sftp 的 filezilla 登錄到 ftp 站點,它工作正常。 我只是將主機放入並選擇登錄類型的密鑰文件並將ppk內容加載到其中,沒有問題。

我發現我需要這樣做:

$rsa = PublicKeyLoader::load(file_get_contents('C:\temp\phpscripts\mmax.ppk'));

現在我的代碼是:

require 'c:\temp\php\vendor\autoload.php';
use phpseclib3\Net\SSH2;
use phpseclib3\Crypt\PublicKeyLoader;
use phpseclib3\Net\SFTP;
$rsa = PublicKeyLoader::load(file_get_contents('C:\temp\phpscripts\mmax.ppk'));
$sftp = new SFTP('sftp.server.com');
if (!$sftp->login('username', $rsa)) {
   exit('Login Failed');
}
echo $sftp->get('test.txt');

它沒有登錄,我找不到有關如何使用帶有私鑰的登錄部分的文檔。 另外,我不需要用戶名。

我能夠度過難關。 有關更多背景信息,請參閱 neubert 的鏈接。 如上所述,我使用了 phpseclib v3。 rsa 的東西已經改變,現在使用 PublicKeyLoader::load。

它仍然無法連接,因為沒有為我提供用戶名,並且我不確定如何處理以下內容中的“用戶名”:

if (!$sftp->login('username', $rsa)) {

陳述。 我檢查了 filezilla 日志,它正在將我的 ppk 文件中的內容發送到 comment: 行,盡管用戶名並不明顯。

我將用戶名更改為評論字段中的值並修復了它。 不確定這是否“正常”,但 filezilla 知道如何處理它。

這是沒有實際服務器目標的最終工作腳本:

$arr = getopt("f:");
$file = $arr['f'];
require 'c:\temp\php\vendor\autoload.php';
use phpseclib3\Net\SSH2;
use phpseclib3\Crypt\PublicKeyLoader;
use phpseclib3\Net\SFTP;
$rsa = PublicKeyLoader::load(file_get_contents('C:\temp\keys\mmax.ppk'));
$sftp = new SFTP('sftp.server.com');
if (!$sftp->login('username_from_ppk_comment_line', $rsa)) {
  exit('Login Failed');
}
$sftp->put($file,'c:\\temp\\EXPORT\\'.$file, SFTP::SOURCE_LOCAL_FILE);
echo 'done';

這是在 windows 服務器上從命令提示符運行它。 希望這可以節省其他人一些時間。 花費時間最長的總是那個“一個”的東西。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM