SFTP из PHP - PullRequest
       67

SFTP из PHP

15 голосов
/ 05 апреля 2009

Я нахожусь в процессе создания веб-приложения, которое, помимо прочего, должно будет подключаться к FTP-серверу для загрузки или загрузки файлов. Приложение написано на PHP и размещено на сервере Linux.

Что меня интересует, так это то, можно ли обеспечить поддержку SFTP-серверов, но после некоторых быстрых поисков в Google кажется, что это не так просто.

Итак, вопрос таков: как лучше всего использовать SFTP из PHP? Есть ли класс, который мог бы также обеспечить поддержку FTP и SFTP, чтобы одни и те же функции могли использоваться для обоих?

Ответы [ 5 ]

14 голосов
/ 05 апреля 2009

Да, вы можете сделать это с помощью cURL . Чтобы переключиться с FTP на SFTP, достаточно изменить форму протокола CURLPROTO_FTP на CURLPROTO_SFTP.

.

cURL поддерживает следующие протоколы: HTTP, HTTPS, FTP, FTPS, SCP, SFTP, TELNET, LDAP, LDAPS, DICT, FILE, TFTP.

КСТАТИ. SFTP не следует путать с FTPS. SFTP - это протокол передачи файлов SSH, а FTPS - FTP через SSL.

7 голосов
/ 01 июля 2009

если у вас не установлен cURL (мой хост не установлен), вы можете использовать phpseclib:

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

4 голосов
/ 04 января 2011

В случае, если кто-то попадет на эту страницу.

Вы также можете использовать Привязки PHP для LIBSSH2 с PHP. Он должен быть надлежащим образом установлен в системе.

В Ubuntu 10.04 и Debian Lenny, конечно, со всеми зависимостями

apt-get install libssh2-php
3 голосов
/ 09 января 2011

Проблема с рекомендацией Игоря состоит в том, что он, помимо прочего, делает гораздо менее переносимый код (libssh2 не устанавливается на очень многих хостах), имеет гораздо более интуитивный API на основе ООП, и аутентификация RSA действительно имеет смысл (libssh2 требует, чтобы вы хранили открытый ключ и закрытый ключ отдельно в файловой системе; тот факт, что они должны предоставляться отдельно, глупо, поскольку большинство форматов закрытых ключей включают в себя открытый ключ внутри них).

phpseclib также быстрее:

http://kevin.vanzonneveld.net/techblog/article/make_ssh_connections_with_php/#comment_3759

0 голосов
/ 04 февраля 2019
$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";
    }
}
...