Загрузка файлов с помощью SFTP - PullRequest
33 голосов
/ 05 марта 2012

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

Спасибо

Ответы [ 5 ]

43 голосов
/ 05 марта 2012

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

23 голосов
/ 06 марта 2012

Лично я предпочитаю избегать расширения 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);
?>

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

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

11 голосов
/ 07 января 2015

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

$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 голосов
/ 03 сентября 2014

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

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

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

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

Main Folder->
    my-files(Contain File Which Transfer To Remote Server)
    phpseclib0.3.0
    sftp.php
1 голос
/ 22 августа 2013

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

...