2015-01-31 6 views
5

Ho letto l'articolo dopo l'articolo e non riesco a trovare "la soluzione" che funziona per quello che ho.Connessione a SFTP utilizzando PHP e chiave privata

Sto tentando di caricare file tramite SFTP utilizzando lo scripting php. Mi sono collegato correttamente con CyberDuck, ma ho bisogno di farlo in modo programmatico.

Ho un file .PPK dal fornitore che ho usato in CyberDuck. Ho un nome utente. Ho il nome host. Se apro il file PPK, vedo alcune linee pubbliche, linee private e private-MAC.

Esiste comunque la possibilità di accedere al server per fare ciò che devo fare utilizzando le informazioni che ho?

ecco il codice Stavo giocando con:

<?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); 
?> 

non ricevo gli eventuali errori ma il file non si presenta sul server. Posso confermare che SSH2 è installato sul mio webhost.

Grazie per l'aiuto che puoi fornire.

+4

Si consiglia vivamente di utilizzare [phpseclib] (https://github.com/phpseclib/phpseclib) per ciò che si desidera ottenere. È molto meglio della build di php nelle funzioni ssh2 e molto facile da usare – baao

+0

Sembra che tu non sappia che 'ssh2_auth_pubkey_file' si aspetta 4 argomenti e non 3. http://php.net/manual/en/function.ssh2-auth -pubkey-file.php –

+0

@charlotte, ho visto che è per questo che presumo di avere problemi. Posso dividere il file PPK negli elementi mancanti? –

risposta

3

La domanda è piuttosto vecchia, ma poiché cercavo esattamente la stessa risposta, ecco cosa sono riuscito a raccogliere.

Primo: cambio formato chiave dal .pkk a .pem

chiavi .pkk sono formato Putty chiave privata.

Se si vuole cambiare la situazione a .pem formato, è necessario installare putty-tools con:.

sudo apt install putty-tools 

(Su un Mac, installare il pacchetto stucco con homebrew per Windows, non ho idea.)

Quindi è possibile modificare il formato della chiave:

puttygen privatekey.ppk -O private-openssh -o privatekey.pem 

Solo nel caso in cui si desidera estrarre la chiave pubblica da quella chiave privata, (non avrete bisogno per il resto di questa risposta, ma solo nel caso) è abbastanza facile:

openssl rsa -in privatekey.pem -pubout > publickey.pub 

Secondo: Accesso con sFTP

Ora che avete la privatekey.pem, è possibile utilizzare phpseclib per collegare via SFTP. In primo luogo, installare phpseclib con Composer:

composer require phpseclib/phpseclib 

Poi in 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); 

Se volete maggiori informazioni, visitare il phpseclib sFTP feature list.