2012-03-05 11 views
25

Ho caricato correttamente i file tramite ftp, ma ora devo eseguire tramite SFTP. Posso collegarmi con successo al server remoto, creare un file e scrivere su di esso, ma non riesco a caricare un file esistente dal mio server locale al server remoto. Ftp_put non funziona con una connessione sftp?Caricamento di file con SFTP

Il mio codice utilizzato per scrivere un file:

//Send file via sftp to server 

$strServer = "*****"; 
$strServerPort = "****"; 
$strServerUsername = "*****"; 
$strServerPassword = "*****"; 
$csv_filename = "Test_File.csv"; 

//connect to server 
$resConnection = ssh2_connect($strServer, $strServerPort); 

if(ssh2_auth_password($resConnection, $strServerUsername, $strServerPassword)){ 
    //Initialize SFTP subsystem 

    echo "connected"; 
    $resSFTP = ssh2_sftp($resConnection);  

    $resFile = fopen("ssh2.sftp://{$resSFTP}/".$csv_filename, 'w'); 
    fwrite($resFile, "Testing"); 
    fclose($resFile);     

}else{ 
    echo "Unable to authenticate on server"; 
} 

Qualcuno ha avuto successo a catturare un file locale e il caricamento tramite un metodo come sopra con SFTP? Un esempio sarebbe molto apprezzato.

Grazie

+0

Perché l'hai chiamato 'resFile'? Perché "res"? Per cosa rappresenta? – Black

+0

risultato suppongo .. @ Black – denns

risposta

35

Con il metodo di cui sopra (che coinvolgono SFTP) è possibile utilizzare stream_copy_to_stream:

$resFile = fopen("ssh2.sftp://{$resSFTP}/".$csv_filename, 'w'); 
$srcFile = fopen("/home/myusername/".$csv_filename, 'r'); 
$writtenBytes = stream_copy_to_stream($srcFile, $resFile); 
fclose($resFile); 
fclose($srcFile); 

Si può anche provare a utilizzare ssh2_scp_send

+1

Che ha funzionato perfettamente, grazie. Inserirò un segnalibro per i progetti futuri! – Marc

+0

Questo è fantastico, ma non dimenticare di disabilitare la directory di base aperta per l'utente. –

13

Personalmente, preferisco evitare l'estensione PECL SSH2. Il mio approccio preferito riguarda lo phpseclib, a pure PHP SFTP implementation. per esempio.

<?php 
include('Net/SFTP.php'); 

$sftp = new Net_SFTP('www.domain.tld'); 
if (!$sftp->login('username', 'password')) { 
    exit('Login Failed'); 
} 

$sftp->put('remote.ext', 'local.ext', NET_SFTP_LOCAL_FILE); 
?> 

Una delle grandi cose che mi piace di phpseclib sopra l'estensione PECL è che è portatile. Forse l'estensione PECL funziona su una versione di Linux ma non su un'altra. E su host condivisi non funziona quasi mai perché non è quasi mai installato.

phpseclib è anche, sorprendentemente, faster. E se hai bisogno di confermare che il file caricato puoi usare la registrazione incorporata di phpseclib come prova.

+0

Sto caricando alcuni file csv usando lo script sopra, ma sto ricevendo il seguente errore: Tempo di esecuzione massimo di 120 secondi superato in Net \ SSH2.php sulla riga 3521, come posso superarlo. –

+0

Vedere http: // php.net/set-time-limit. – neubert

1

Condivisione di ulteriori input, trovato ssh2_scp_send non stava copiando correttamente (i byte erano diversi) quando copiando il file da Linux (64 bit) a Windows (32 bit), la routine sftp funzionava perfettamente. Quando si utilizza Windows con stfp, il percorso in C: \ to \ path deve essere inserito come ssh2.sftp: // {$ resSFTP}/cygdrive/c/to/path se Cygwin viene utilizzato per SSH nella casella di Windows .

4

Per documento semplice di phpseclib, una pura implementazione SFTP PHP.

Suggerire seguente link:

Uploading files over SFTP using PHP

struttura di cartelle:

Main Folder-> 
    my-files(Contain File Which Transfer To Remote Server) 
    phpseclib0.3.0 
    sftp.php 
9

Per me questo ha funzionato:

$connection = ssh2_connect($server, $serverPort); 

if(ssh2_auth_password($connection, $serverUser, $serverPassword)){ 
    echo "connected\n"; 
    ssh2_scp_send($connection, "/path/to/local/".$file, "/path/to/remote/".$file); 
    echo "done\n"; 
} else { 
    echo "connection failed\n"; 
} 

ho dovuto installare libssh2-php prima, però:

sudo apt-get install libssh2-php 
+0

grazie per 'apt-get install libssh2-php' –

+0

Ho ottenuto il pacchetto libssh2-php non è disponibile quindi utilizzare' sudo apt-get install php-ssh2' – omega1