使用 SFTP 上传文件

2022-08-30 12:10:37

我已经通过ftp成功上传了文件,但我现在需要通过SFTP进行。我可以成功连接到远程服务器,创建文件并写入其中,但无法将现有文件从本地服务器上载到远程服务器。ftp_put不是通过 sftp 连接触发的?

我的代码用于编写文件:

//Send file via sftp to server

$strServer = "*****";
$strServerPort = "****";
$strServerUsername = "*****";
$strServerPassword = "*****";
$csv_filename = "Test_File.csv";

//connect to server
$resConnection = ssh2_connect($strServer, $strServerPort);

if(ssh2_auth_password($resConnection, $strServerUsername, $strServerPassword)){
    //Initialize SFTP subsystem

    echo "connected";
    $resSFTP = ssh2_sftp($resConnection);    

    $resFile = fopen("ssh2.sftp://{$resSFTP}/".$csv_filename, 'w');
    fwrite($resFile, "Testing");
    fclose($resFile);                   

}else{
    echo "Unable to authenticate on server";
}

有没有人在抓取本地文件并通过上述sftp等方法上传方面有任何成功?如能提出一个例子,将不胜感激。

谢谢


答案 1

使用上述方法(涉及 sftp),您可以使用stream_copy_to_stream

$resFile = fopen("ssh2.sftp://{$resSFTP}/".$csv_filename, 'w');
$srcFile = fopen("/home/myusername/".$csv_filename, 'r');
$writtenBytes = stream_copy_to_stream($srcFile, $resFile);
fclose($resFile);
fclose($srcFile);

您也可以尝试使用ssh2_scp_send


答案 2

就个人而言,我更喜欢避免使用PECL SSH2扩展。我更喜欢的方法涉及phpseclib,一个纯粹的PHP SFTP实现。下面是 phpseclib 2.0 的一个示例(需要作曲家):

<?php
require __DIR__ . '/vendor/autoload.php';

use phpseclib\Net\SFTP;

$sftp = new SFTP('www.domain.tld');
if (!$sftp->login('username', 'password')) {
    exit('Login Failed');
}

$sftp->put('remote.ext', 'local.ext', SFTP::SOURCE_LOCAL_FILE);
?>

下面是 phpseclib 1.0 的相同示例:

<?php
include('Net/SFTP.php');

$sftp = new Net_SFTP('www.domain.tld');
if (!$sftp->login('username', 'password')) {
    exit('Login Failed');
}

$sftp->put('remote.ext', 'local.ext', NET_SFTP_LOCAL_FILE);
?>

我喜欢phpseclib而不是PECL扩展的一大优点是它是可移植的。也许PECL扩展适用于一个版本的Linux,但不适用于另一个版本。在共享主机上,它几乎永远不会工作,因为它几乎从未安装过。

令人惊讶的是,phpseclib也更快。如果您需要确认上传的文件,可以使用phpseclib的内置日志记录作为证明。


推荐