使用 PHP 将 SFTP 文件夹中的所有文件下载到本地文件夹

Download all files from SFTP folder to local folder using PHP

我尝试将所有文​​件从 SFTP 文件夹移动到本地文件夹。

我使用以下脚本:

$connection = ssh2_connect('x.x.x.x', 22);

if (!ssh2_auth_password($connection, 'User_login', 'User_Pass')) {
    throw new Exception('Impossible de ce connencter.');
}

if (!$sftp = ssh2_sftp($connection)) {
    throw new Exception('Impossible de ce connencter.');
}

$files = array();
$dirHandle = opendir("ssh2.sftp://$sftp/01_Folder/");

while (false !== ($file = readdir($dirHandle))) {
    if ($file != '.' && $file != '..') {
        $files[] = $file;
    }
}

谢谢大家。

如果您想将所有文件从 SFTP 目录下载到本地目录 - local PHP 脚本(如果这就是您所说的 "FTP server"):

$connection = ssh2_connect('sftp.example.com');

ssh2_auth_password($connection, 'username', 'password');

$sftp = ssh2_sftp($connection);

$dirhandle = opendir("ssh2.sftp://$sftp/remote/folder/");

while (false !== ($file = readdir($dirhandle)))
{
    if (($file != '.') && ($file != '..'))
    {
        $remotehandle = fopen("ssh2.sftp://$sftp/remote/folder/$file", 'r');
        $localhandle = fopen("/local/folder/$file", 'w');
        stream_copy_to_stream($remotehandle, $localhandle);
        fclose($remotehandle);
        fclose($localhandle);
    }
}

添加错误检查!

有兴趣者的解决方案==>

//connecxion
$connection = ssh2_connect('remote.server.com', 22);
// Authentication
if (!ssh2_auth_password($connection, 'Login_user', 'Password')) {
    throw new Exception('Impossible de ce connencter.');
}

// Creation de la source SFTP 
if (!$sftp = ssh2_sftp($connection)) {
    throw new Exception('Impossible de ce connencter.');
}


$files = array();
$dirHandle = opendir("ssh2.sftp://$sftp/Remote_folder/");

while (false !== ($file = readdir($dirHandle))) {
    if ($file != '.' && $file != '..') {
        $files[] = $file;
    }
}


if (count($files)) {
    foreach ($files as $fileName) {
        // Dossier Change
        if (!$remoteStream = @fopen("ssh2.sftp://$sftp/Remote_folder/$fileName", 'r')) {
            throw new Exception("Unable to open remote file: $fileName");
        } 

        // Dossier Local
        if (!$localStream = @fopen("/local_folder/$fileName", 'w')) {
            throw new Exception("Unable to open local file for writing: /var/www/change_files/$fileName");
        }

        // Ecriture du dossier change dans le dossier Local
        $read = 0;
        $fileSize = filesize("ssh2.sftp://$sftp/Remote_folder/$fileName");
        while ($read < $fileSize && ($buffer = fread($remoteStream, $fileSize - $read))) {
            $read += strlen($buffer);

            // Ecriture du dossier
            if (fwrite($localStream, $buffer) === FALSE) {
                throw new Exception("Unable to write to local file: /local_folder/$fileName");
            }
        }

        // Fermeture des Connexions
        fclose($localStream);
        fclose($remoteStream);
    }
}

您可以使用 exec function. It will ask you for user name and password of the remote server. You can bypass that using the SSHPass 命令行工具从 Php 进行 rsync 运行。它允许非交互式登录。以下命令 运行s rsync with sshpass:

rsync --rsh="sshpass -p myPassword ssh -l username" server.example.com:/var/www/html/ /backup/

命令可以是 运行 来自 Php 使用 exec 函数