Подтвердить что ты не робот

Загрузка файлов с помощью SFTP

Я успешно загрузил файлы поверх 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? В качестве примера мы будем благодарны.

Спасибо

4b9b3361

Ответ 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. например.

<?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);
?>

Одна из больших вещей, которые мне нравятся в phpclib над расширением PECL, - это то, что оно переносимо. Возможно, расширение PECL работает с одной версией Linux, но не с другим. И на общих хостах он почти никогда не работает, потому что он почти никогда не устанавливался.

phpseclib также, на удивление, быстрее. И если вам нужно подтвердить, что загруженный файл вы можете использовать встроенный протокол phpseclib как доказательство.

Ответ 3

Для меня это сработало:

$connection = ssh2_connect($server, $serverPort);

if(ssh2_auth_password($connection, $serverUser, $serverPassword)){
    echo "connected\n";
    ssh2_scp_send($connection, "/path/to/local/".$file, "/path/to/remote/".$file);
    echo "done\n";
} else {
    echo "connection failed\n";
}

Сначала мне нужно было установить libssh2-php:

sudo apt-get install libssh2-php

Ответ 4

Для простого документа phpseclib, чистой реализации PHP SFTP.

Обратитесь к ссылке:

Загрузка файлов через SFTP с помощью PHP

Структура папки:

Main Folder->
    my-files(Contain File Which Transfer To Remote Server)
    phpseclib0.3.0
    sftp.php

Ответ 5

Разделяя дополнительные входы, найдено, что ssh2_scp_send не копировался должным образом (байты были разными) при копировании файла из Linux (64-разрядная версия) в Windows (32 бит), там работала sftp. При использовании Windows с stfp путь в случае C:\to\path должен быть помещен как ssh2.sftp://{$ resSFTP}/cygdrive/c/to/path, если Cygwin используется для SSH в окне Windows.