¿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?

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:pass@example.com: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:


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 .


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

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/


-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


Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.