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

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

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

有帮助吗?

解决方案

是的,你可以做到这一点与卷曲。从FTP切换到SFTP所有你所要做的是改变协议选项形式CURLPROTO_FTPCURLPROTO_SFTP

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

顺便说一句。 SFTP不与FTPS混淆。 SFTP是SSH文件传输协议,而FTPS是基于SSL的FTP。

其他提示

如果您还没有安装卷曲做(我的主机不),你可以使用phpseclib:

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

在的情况下有人最终达此页面上。

您还可以使用 PHP绑定LIBSSH2 用PHP。应当适当地安装在系统上。

在Ubuntu的10.04和Debian莱尼,当然与所有依赖关系

apt-get install libssh2-php

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

phpseclib 也更快:

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";
    }
}
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top