2015-01-31 4 views
5

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

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

У меня есть файл .PPK от поставщика, который я использовал в CyberDuck. У меня есть имя пользователя. У меня есть имя хоста. Если я открою файл PPK, я вижу некоторые публичные линии, частные линии и Private-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 установлен на моем веб-хосте.

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

+4

Я бы настоятельно рекомендовал использовать [phpseclib] (https://github.com/phpseclib/phpseclib) для достижения того, чего вы хотите достичь. Это лучше, чем сборка php в ssh2-функциях и очень проста в использовании. – baao

+0

Вы, кажется, не знаете, что 'ssh2_auth_pubkey_file' ожидает 4 аргумента, а не 3. http://php.net/manual/en/function.ssh2-auth -pubkey-file.php –

+0

@charlotte, я видел, что именно поэтому я предполагаю, что у меня проблемы. Могу ли я разбить файл PPK на отсутствующие элементы? –

ответ

3

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

Первое: Изменение формата ключа от .pkk к .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

Теперь, когда у вас есть privatekey.pem, вы можете использовать phpseclib для подключения через SFTP. Во-первых, установить phpseclib с Композитор:

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 
$key->setPassword('private key password'); 

// load the private key 
$key->loadKey(file_get_contents('/path/to/privatekey.pem')); 

// login via sftp 
if (!$sftp->login('username', $key)) { 
    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 feature list.