Вопрос:

Загрузка файлов по SFTP

php sftp

70132 просмотра

5 ответа

237 Репутация автора

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

Спасибо

Автор: Marc Источник Размещён: 05.03.2012 07:00

Ответы (5)


45 плюса

27335 Репутация автора

Решение

С помощью метода выше (с использованием 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

Автор: dev-null-dweller Размещён: 05.03.2012 07:35

25 плюса

10096 Репутация автора

Лично я предпочитаю избегать расширения 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 в качестве доказательства.

Автор: neubert Размещён: 06.03.2012 05:29

1 плюс

556 Репутация автора

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

Автор: pradosh nair Размещён: 22.08.2013 06:18

4 плюса

355 Репутация автора

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

См. Следующую ссылку:

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

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

Main Folder->
    my-files(Contain File Which Transfer To Remote Server)
    phpseclib0.3.0
    sftp.php
Автор: Sandesh Размещён: 03.09.2014 06:06

12 плюса

121 Репутация автора

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

$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
Автор: Matthias Размещён: 07.01.2015 01:51
Вопросы из категории :
32x32