15

我正在构建一个 Web 应用程序,除其他外,它还需要连接到 FTP 服务器以下载或上传文件。该应用程序是用 PHP 编写的,它托管在 Linux 服务器上。

我想知道是否也可以提供对 SFTP 服务器的支持,但是在 Google 上进行了一些快速搜索之后,似乎这并不是那么简单。

所以,问题是:在 PHP 中使用 SFTP 的最佳方式是什么?是否有一个类也可以为 FTP 和 SFTP 提供支持,以便两者都可以使用相同的功能?

4

5 回答 5

14

是的,你可以用cURL做到这一点。要从 FTP 切换到 SFTP,您只需将协议选项形式更改CURLPROTO_FTPCURLPROTO_SFTP.

cURL 支持以下协议:HTTP、HTTPS、FTP、FTPS、SCP、SFTP、TELNET、LDAP、LDAPS、DICT、FILE、TFTP。

顺便提一句。不要将 SFTP 与 FTPS 混淆。SFTP 是 SSH 文件传输协议,而 FTPS 是 FTP over SSL。

于 2009-04-04T21:36:01.340 回答
7

如果您没有安装 cURL(我的主机没有),您可以使用 phpseclib:

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

于 2009-07-01T17:13:13.880 回答
4

以防有人最终出现在此页面上。

您也可以将PHP Bindings for LIBSSH2与 PHP 一起使用。它应该适当地安装在系统上。

在 Ubuntu 10.04 和 Debian Lenny 中,当然还有所有依赖项

apt-get install libssh2-php
于 2011-01-04T10:36:27.847 回答
3

Igor 建议的问题在于,除其他外,它使得可移植代码少得多(libssh2 没有安装在很多主机上),它具有更直观的基于 OOP 的 API 并且 RSA 身份验证实际上是有意义的(libssh2 需要您将公钥和私钥分别存储在文件系统上;必须单独提供它们的事实是愚蠢的,因为大多数私钥格式都包含公钥)。

phpseclib 也更快:

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

于 2011-01-09T00:34:22.913 回答
0
$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";
    }
}
于 2019-02-04T07:41:13.283 回答