这个问题已经很老了,但是由于我正在寻找完全相同的答案,因此这是我设法收集到的。
首先:将密钥格式从 .ppk 更改为 .pem
.pkk 密钥是 PuTTY 格式的私钥。
如果要将其更改为.pem格式,则需要安装具有以下工具的腻子工具:
sudo apt install putty-tools
(在Mac上,使用自制软件安装腻子包。对于Windows,我不知道。
然后,您可以更改密钥的格式:
puttygen privatekey.ppk -O private-openssh -o privatekey.pem
万一你想从该私钥中提取公钥,(你不需要该答案的其余部分,但以防万一),这很容易:
openssl rsa -in privatekey.pem -pubout > publickey.pub
第二:使用 sFTP 登录
现在您已经有了 ,您可以使用 phpseclib 通过 SFTP 进行连接。首先,使用 Composer 安装 phpseclib:privatekey.pem
composer require phpseclib/phpseclib
然后在 PHP 中:
require "vendor/autoload.php";
use phpseclib\Crypt\RSA;
use phpseclib\Net\SFTP;
$sftp = new SFTP('sftp.server.com');
// create new RSA key
$privateKey = new RSA();
// in case that key has a password
$privateKey->setPassword('private key password');
// load the private key
$privateKey->loadKey(file_get_contents('/path/to/privatekey.pem'));
// login via sftp
if (!$sftp->login('username', $privateKey)) {
throw new Exception('sFTP login failed');
}
// now you can list what's in here
$filesAndFolders = $sftp->nlist();
// you can change directory
$sftp->chdir('coolstuffdir');
// get a file
$sftp->get('remoteFile', 'localFile');
// create a remote new file with defined content
$sftp->put('newfile.txt', 'new file content');
// put a local file
$sftp->put('remote.txt', 'local.txt', NET_SFTP_LOCAL_FILE);
如果需要详细信息,请转到 phpseclib sFTP 功能列表。