Я прочитал статью за статьей и просто не могу найти «решение», которое работает для того, что у меня есть.
Я пытаюсь загрузить файлы через 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 установлен на моем веб-хосте.
Спасибо за любую помощь, которую вы можете предоставить.
Вопрос довольно старый, но, поскольку я искал точно такой же ответ, вот что мне удалось собрать.
.Ключи 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.
Других решений пока нет …