Подключитесь к SFTP используя PHP и закрытый ключ

Я прочитал статью за статьей и просто не могу найти «решение», которое работает для того, что у меня есть.

Я пытаюсь загрузить файлы через SFTP с использованием сценариев PHP. Я успешно подключился с помощью CyberDuck, но мне нужно сделать это программно.

У меня есть файл .PPK от поставщика, который я использовал в CyberDuck. У меня есть имя пользователя. У меня есть имя хоста. Если я открываю файл PPK, я вижу некоторые общедоступные линии, частные линии и частный MAC.

Могу ли я в любом случае получить доступ к серверу, чтобы сделать то, что мне нужно, используя имеющуюся у меня информацию?

Вот код, с которым я играл:

<?php if (!function_exists("ssh2_connect")) die("function ssh2_connect doesn't exist");
?>
<?php
$conn = ssh2_connect('hostname.com', 22);
echo $conn;
ssh2_auth_pubkey_file($conn,'USERNAME','/var/www/html/FILENAME.PPK');

// send a file
ssh2_scp_send($conn, '/var/www/html/FILETOSEND.TXT', 'FILETOSEND.TXT', 0644);
?>

Я не получаю никаких ошибок, но файл не отображается на сервере.
Я могу подтвердить, что SSH2 установлен на моем веб-хосте.

Спасибо за любую помощь, которую вы можете предоставить.

11

Решение

Вопрос довольно старый, но, поскольку я искал точно такой же ответ, вот что мне удалось собрать.

.Ключи 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

Теперь, когда у вас есть 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'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.

12

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]