Solución:
Con el método anterior (que involucra sftp) puede usar 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);
También puede intentar usar ssh2_scp_send
Personalmente, prefiero evitar la extensión PECL SSH2. Mi enfoque preferido involucra phpseclib, una implementación PHP SFTP pura. Aquí hay un ejemplo con phpseclib 2.0 (requiere compositor):
<?php
require __DIR__ . '/vendor/autoload.php';
use phpseclibNetSFTP;
$sftp = new SFTP('www.domain.tld');
if (!$sftp->login('username', 'password')) {
exit('Login Failed');
}
$sftp->put('remote.ext', 'local.ext', SFTP::SOURCE_LOCAL_FILE);
?>
Aquí está el mismo ejemplo con 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);
?>
Una de las grandes cosas que me gustan de phpseclib sobre la extensión PECL es que es portátil. Quizás la extensión PECL funcione en una versión de Linux pero no en otra. Y en hosts compartidos casi nunca funciona porque casi nunca se instala.
phpseclib también es, sorprendentemente, más rápido. Y si necesita la confirmación de que el archivo cargado, puede usar el registro integrado de phpseclib como prueba.
Para mí esto funcionó:
$connection = ssh2_connect($server, $serverPort);
if(ssh2_auth_password($connection, $serverUser, $serverPassword)){
echo "connectedn";
ssh2_scp_send($connection, "/path/to/local/".$file, "/path/to/remote/".$file);
echo "donen";
} else {
echo "connection failedn";
}
Sin embargo, primero tuve que instalar libssh2-php:
sudo apt-get install libssh2-php