¿Cómo SFTP con PHP?

81

Me he encontrado con muchos scripts PHP para clientes FTP web. Necesito implementar un cliente SFTP como aplicación web en PHP. ¿PHP es compatible con SFTP? No pude encontrar ninguna muestra. Puede alguien ayudarme con esto?

indranama
fuente

Respuestas:

71

PHP tiene envoltorios de flujo ssh2 (deshabilitados de forma predeterminada), por lo que puede usar conexiones sftp con cualquier función que admita envoltorios de flujo usando ssh2.sftp://para el protocolo, por ejemplo

file_get_contents('ssh2.sftp://user:[email protected]:22/path/to/filename');

o - cuando también se usa la extensión ssh2

$connection = ssh2_connect('shell.example.com', 22);
ssh2_auth_password($connection, 'username', 'password');
$sftp = ssh2_sftp($connection);
$stream = fopen("ssh2.sftp://$sftp/path/to/file", 'r');

Ver http://php.net/manual/en/wrappers.ssh2.php

En una nota al margen, también hay bastantes preguntas sobre este tema:

Gordon
fuente
file_get_contents y file_put_contents funcionan de maravilla. nunca supe que trabajaban con sftp y es mucho más fácil que usar el material integrado de sftp. ¡Gracias!
jbrahy
3
Incluso cuando usa file_get_contents (), todavía necesita la extensión ssh2 (afaik).
StanE
paquetes debian / ubuntu: apt install libssh2-1-dev php-ssh2
Ajay Singh
39

Las funciones de ssh2 no son muy buenas. Difíciles de usar y aún más difíciles de instalar, usarlos garantizará que su código tenga portabilidad cero. Mi recomendación sería usar phpseclib, una implementación pura de PHP SFTP .

calgaryhit
fuente
solo es compatible con SFTP v3
Blacksonic
3
@indranama, ¿marcarías esto como la respuesta correcta para que los futuros usuarios no tengan que leer comentarios para encontrar cuál funcionó mejor para ti?
Fi Horan
28

Descubrí que "phpseclib" debería ayudarlo con esto (SFTP y muchas más funciones). http://phpseclib.sourceforge.net/

Para poner el archivo en el servidor, simplemente llame (ejemplo de código de http://phpseclib.sourceforge.net/sftp/examples.html#put )

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

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

// puts a three-byte file named filename.remote on the SFTP server
$sftp->put('filename.remote', 'xxx');
// puts an x-byte file named filename.remote on the SFTP server,
// where x is the size of filename.local
$sftp->put('filename.remote', 'filename.local', NET_SFTP_LOCAL_FILE);
Prut Udomwattawee
fuente
2
El repositorio de git está aquí: github.com/phpseclib/phpseclib/tree/master/phpseclib
relipse
1
¿Puede actualizar su respuesta a phpseclib 2.0? Tu ejemplo actual está obsoleto.
Martin Prikryl
2

Instalar Flysystem:

composer require league/flysystem-sftp

Entonces:

use League\Flysystem\Filesystem;
use League\Flysystem\Sftp\SftpAdapter;

$filesystem = new Filesystem(new SftpAdapter([
    'host' => 'example.com',
    'port' => 22,
    'username' => 'username',
    'password' => 'password',
    'privateKey' => 'path/to/or/contents/of/privatekey',
    'root' => '/path/to/root',
    'timeout' => 10,
]));
$filesystem->listFiles($path); // get file lists
$filesystem->read($path_to_file); // grab file
$filesystem->put($path); // upload file
....

Leer:

https://flysystem.thephpleague.com/v1/docs/

Salinas
fuente
-1

Realicé una salida completa y escribí una clase que crea un archivo por lotes y luego llama a sftptravés de una systemllamada. No es la forma más agradable (o más rápida) de hacerlo, pero funciona para lo que necesito y no requirió ninguna instalación de bibliotecas o extensiones adicionales en PHP.

Podría ser el camino a seguir si no desea utilizar las ssh2extensiones

DaveyBoy
fuente
hilo relacionado que me ayudó: groups.google.com/forum/#!topic/comp.security.ssh/_55TdDdUTCw
Quamis