Pregunta
Estoy en el proceso de construcción de una aplicación web que, además de otras cosas, la necesidad de conectarse a un servidor FTP para descargar o cargar archivos. La aplicación está escrita en PHP y está alojado en un servidor Linux.
Lo que me pregunto es si es o no sería posible también proporcionar soporte para SFTP, pero después de algunas búsquedas rápidas en Google parece que esto no es tan simple.
Entonces, la pregunta es: ¿Cuál sería la mejor manera de utilizar SFTP desde dentro de PHP? ¿Hay una clase que también podría proporcionar soporte para FTP, así como SFTP para que mismas funciones podrían ser utilizados para ambos?
Solución
Sí, se puede hacer eso con cURL . Al cambiar de FTP a SFTP todo lo que tiene que hacer es cambiar el protocolo formulario de opción CURLPROTO_FTP
a CURLPROTO_SFTP
.
cURL soporta siguientes protocolos: HTTP, HTTPS, FTP, FTPS, SCP, SFTP, Telnet, LDAP, LDAPS, DICT, FILE, TFTP.
Por cierto. SFTP no se debe confundir con FTPS. SFTP es SSH File Transfer Protocol, mientras que FTPS es FTP sobre SSL.
Otros consejos
Si no tiene instalado el enrollamiento (mi anfitrión no), puede utilizar phpseclib:
http://phpseclib.sourceforge.net/documentation/net.html#net_sftp
En caso de que alguien termina arriba en esta página.
También puede utilizar el href="http://php.net/manual/en/book.ssh2.php" rel="nofollow"> PHP enlaces para libssh2
En Ubuntu 10.04 y Debian Lenny, por supuesto, con todas las dependencias apt-get install libssh2-php
El problema con la recomendación de Igor es que, entre otras cosas, hace que para el código mucho menos portátil (libssh2 no está instalado en muchos anfitriones), tiene una API mucho más intuitivo basado en la programación orientada a objetos y la autenticación RSA realmente tiene sentido (libssh2 requiere almacenar la clave pública y la clave privada por separado en el sistema de archivos; el hecho de que tienen que ser proporcionados por separado es tonta porque la mayoría de los formatos de clave privada son la clave pública dentro de ellos) <. / p>
phpseclib es también más rápido:
http://kevin.vanzonneveld.net/techblog/article/make_ssh_connections_with_php/ # comment_3759
$dataFile = 'PASTE_FILE_NAME_HERE';
$sftpServer = 'PASTE_SFTP_SERVER_NAME_HERE';
$sftpUsername = 'PASTE_USERNAME_HERE';
$sftpPassword = 'PASTE_PASSWORD_HERE';
$sftpPort = 'PASTE_PORT_HERE';
$sftpRemoteDir = '/';
$ch = curl_init('sftp://' . $sftpServer . ':' . $sftpPort . $sftpRemoteDir . '/' . basename($dataFile));
$fh = fopen($dataFile, 'r');
if ($fh) {
curl_setopt($ch, CURLOPT_USERPWD, $sftpUsername . ':' . $sftpPassword);
curl_setopt($ch, CURLOPT_UPLOAD, true);
curl_setopt($ch, CURLOPT_PROTOCOLS, CURLPROTO_SFTP);
curl_setopt($ch, CURLOPT_INFILE, $fh);
curl_setopt($ch, CURLOPT_INFILESIZE, filesize($dataFile));
curl_setopt($ch, CURLOPT_VERBOSE, true);
$verbose = fopen('php://temp', 'w+');
curl_setopt($ch, CURLOPT_STDERR, $verbose);
$response = curl_exec($ch);
$error = curl_error($ch);
curl_close($ch);
if ($response) {
echo "Success";
} else {
echo "Failure";
rewind($verbose);
$verboseLog = stream_get_contents($verbose);
echo "Verbose information:\n" . $verboseLog . "\n";
}
}