2012-03-05 29 views
25

He cargado correctamente archivos a través de ftp, pero ahora tengo que hacerlo a través de SFTP. Puedo conectarme con éxito al servidor remoto, crear un archivo y escribir en él, pero no puedo cargar un archivo existente desde mi servidor local al servidor remoto. ¿No está disparando ftp_put con una conexión sftp?Carga de archivos con SFTP

Mi código utilizado para escribir un archivo:

//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"; 
} 

Alguien ha tenido ningún éxito en agarrar un archivo local y carga a través de un método como el anterior con SFTP? Un ejemplo sería muy apreciado.

Gracias

+0

¿Por qué lo llamaste 'resFile'? ¿Por qué "res"? Porque, ¿qué significa? – Black

+0

resultado supongo .. @Black – denns

Respuesta

35

Con el método anterior (que implica SFTP) se puede utilizar 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); 

También puede intentar usar ssh2_scp_send

+1

Eso funcionó perfectamente, gracias. ¡Marcaré para futuros proyectos! – Marc

+0

Esto es increíble, pero no se olvide de deshabilitar el directorio base abierto para el usuario. –

13

Personalmente, prefiero evitar la extensión PECL SSH2. Mi enfoque preferido es phpseclib, a pure PHP SFTP implementation. p.ej.

<?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 de las grandes cosas que me gusta de phpseclib sobre la extensión PECL es que es portátil. Tal vez la extensión PECL funciona en una versión de Linux pero no en otra. Y en hosts compartidos casi nunca funciona porque casi nunca está instalado.

phpseclib es también, sorprendentemente, faster. Y si necesita confirmación de que el archivo cargado puede usar el registro incorporado de phpseclib como prueba.

+0

Estoy cargando algunos archivos csv usando el script anterior, pero recibo el siguiente error: Se excedió el tiempo máximo de ejecución de 120 segundos en Net \ SSH2.php en la línea 3521, ¿cómo puedo excederlo? –

+0

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

1

Al compartir otras entradas, se encontró que ssh2_scp_send no estaba copiando correctamente (los bytes eran diferentes) cuando se copió el archivo de Linux (64 bit) a Windows (32 bit), allí la rutina sftp funcionó perfectamente. Al usar Windows con stfp, la ruta en el caso de C: \ to \ path debe ponerse como ssh2.sftp: // {$ resSFTP}/cygdrive/c/en/path si se usa Cygwin para SSH en el cuadro de Windows .

4

Para el documento simple de phpseclib, una implementación pura de PHP SFTP.

Consulte siguiente enlace:

Uploading files over SFTP using PHP

Estructura de carpetas:

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

Para mí esto funcionó:

$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"; 
} 

tuve que instalar libssh2-php en primer lugar, sin embargo:

sudo apt-get install libssh2-php 
+0

gracias por 'apt-get install libssh2-php' –

+0

Tengo el paquete libssh2-php no está disponible así que use' sudo apt-get install php-ssh2' en su lugar – omega1