Pergunta

Eu estou no processo de construção de um aplicativo web que, além de outras coisas, necessidade de se conectar a um servidor FTP para download ou upload de arquivos. O aplicativo é escrito em PHP e está hospedado em um servidor Linux.

O que eu queria saber é se é ou não seria possível também fornecem suporte para servidores SFTP, mas depois de algumas rápidas pesquisas no Google, parece que isso não é tudo tão simples.

Assim, a pergunta é: Qual seria a melhor maneira de usar SFTP de dentro PHP? Existe uma classe que também pode fornecer suporte para FTP, bem como SFTP para que as mesmas funções poderiam ser usados ??para ambos?

Foi útil?

Solução

Sim, você pode fazer isso com cURL . Para mudar de FTP para SFTP tudo que você tem a fazer é a mudança de protocolo formulário opção CURLPROTO_FTP para CURLPROTO_SFTP.

suportes cURL seguindo protocolos: HTTP, HTTPS, FTP, FTPS, SCP, SFTP, Telnet, LDAP, LDAPS, DICT, o FILE, TFTP.

BTW. SFTP não deve ser confundido com FTPS. SFTP é SSH File Transfer Protocol, enquanto FTPS é FTP sobre SSL.

Outras dicas

Se você não tem cURL instalado (meu anfitrião não), você pode usar phpseclib:

http://phpseclib.sourceforge.net/documentation/net.html#net_sftp

No caso de alguém fim-up nesta página.

Você também pode usar o PHP Ligações para libssh2 com PHP. Ele deve ser instalado adequadamente no sistema.

No Ubuntu 10.04 e Debian Lenny, é claro, com todas as dependências

apt-get install libssh2-php

O problema com a recomendação do Igor é que, entre outras coisas, faz com que por muito menos código portátil (libssh2 não está instalado em muitos hosts), tem uma API baseada em OOP muito mais intuitivo e autenticação RSA realmente faz sentido (libssh2 requer que você armazenar a chave pública e chave privada separadamente no sistema de arquivos; o fato de que eles têm de ser fornecidos separadamente é bobagem pois a maioria dos formatos de chave privada incluir a chave pública dentro deles) <. / p>

phpseclib também é mais 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";
    }
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top