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?
81
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:
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 .
fuente
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);
fuente
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/
fuente
Realicé una salida completa y escribí una clase que crea un archivo por lotes y luego llama a
sftp
través de unasystem
llamada. 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
ssh2
extensionesfuente