Я успешно загрузил файлы поверх 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? Примером может служить большая оценка.
благодаря
С помощью метода выше (с участием 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
Лично я предпочитаю избегать расширения 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); ?>
в<?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 как доказательство.
Для меня это сработало:
$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
Для простого документа phpseclib – чистой реализации PHP SFTP .
См. Ссылку:
Загрузка файлов через SFTP с помощью PHP
Структура папок:
Main Folder-> my-files(Contain File Which Transfer To Remote Server) phpseclib0.3.0 sftp.php
При совместном использовании дополнительных ресурсов найдено, что ssh2_scp_send не копировался должным образом (байты были разными) при копировании файла из Linux (64-разрядная версия) в Windows (32 бит), там работала sftp. При использовании Windows с stfp путь в случае C: \ to \ path должен быть помещен как ssh2.sftp: // {$ resSFTP} / cygdrive / c / to / path, если Cygwin используется для SSH в окне Windows ,