Fazendo upload de arquivos com SFTP

Eu coloquei arquivos com sucesso sobre o ftp, mas agora preciso fazer via SFTP. Posso me conectar com sucesso ao servidor remoto, criar um arquivo e gravá-lo, mas não consigo enviar um arquivo existente do meu servidor local para o servidor remoto. O ftp_put não está ativo com uma conexão sftp?

Meu código costumava escrever um arquivo:

//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"; } 

Alguém teve algum sucesso em pegar um arquivo local e fazer o upload através de um método como o acima com o sftp? Um exemplo seria muito apreciado.

obrigado

Com o método acima (envolvendo sftp) você pode 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); 

Você também pode tentar usar ssh2_scp_send

Pessoalmente, prefiro evitar a extensão PECL SSH2. Minha abordagem preferida envolve phpseclib, uma implementação pura do PHP SFTP . por exemplo.

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

Uma das grandes coisas que eu gosto sobre o phpseclib sobre a extensão PECL é que é portátil. Talvez a extensão PECL funcione em uma versão do Linux, mas não em outra. E em hosts compartilhados quase nunca funciona porque quase nunca foi instalado.

O phpseclib também é, surpreendentemente, mais rápido . E se você precisar de confirmação de que o arquivo carregado, você pode usar o log incorporado do phpseclib como prova.

Para mim, isso funcionou:

 $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"; } 

Eu tive que instalar o libssh2-php primeiro, no entanto:

 sudo apt-get install libssh2-php 

Para o documento simples do phpseclib, uma implementação pura do PHP SFTP .

Consulte o seguinte link:

Fazendo upload de arquivos em SFTP usando o PHP

Estrutura da pasta:

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

Ao compartilhar outras inputs, o ssh2_scp_send encontrado não foi copiado corretamente (os bytes eram diferentes) quando a cópia do arquivo do Linux (64 bit) para o Windows (32 bits), a rotina sftp funcionava perfeitamente. Ao usar o Windows com stfp, o caminho no caso de C: \ para \ caminho precisa ser colocado como ssh2.sftp: // {$ resSFTP} / cygdrive / c / to / path se Cygwin for usado para SSH na checkbox do Windows .