Ответ 1
Вопрос довольно старый, но, поскольку я искал точно такой же ответ, вот что мне удалось собрать.
Во-первых: измените формат ключа с .ppk на .pem
Ключи .pkk представляют собой закрытый ключ формата PuTTY.
Если вы хотите изменить это на формат .pem, вам нужно установить putty-tools с помощью:
sudo apt install putty-tools
(На Mac установите пакет putty с помощью homebrew. Для Windows я понятия не имею.)
Затем вы можете изменить формат ключа:
puttygen privatekey.ppk -O private-openssh -o privatekey.pem
На всякий случай, если вы хотите извлечь открытый ключ из этого закрытого ключа (остальная часть ответа вам не понадобится, но на всякий случай), это довольно просто:
openssl rsa -in privatekey.pem -pubout > publickey.pub
Второе: войдите с помощью sFTP
Теперь, когда у вас есть privatekey.pem
, вы можете использовать phpseclib для подключения через SFTP. Сначала установите phpseclib с помощью Composer:
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 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.