[英]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.