http://www.perlmonks.org?node_id=1008498

sdetweil has asked for the wisdom of the Perl Monks concerning the following question:

I have an application that runs on multiple platforms (windows, linux, solaris, aix, hpux). and uses SFTP to send files to our host server.
I needed a 64bit windows version, but the underlying libs for SFTP are not ported to 64bit windows (math::Pari, etc)..
so I rewrote the function to use SFTP:Foreign and use SSH2. all works ok so far.. today I received a trouble report, the ftp send fails, leaving a 0 length file on the server.

I am trying to figure out how to debug this..

use Net::SSH2; use Net::SFTP::Foreign; my $ssh2 = Net::SSH2->new(); $ssh2->debug($debugFlag eq $true ? 1:0); $ssh2->connect($ftpSecureServer) or die "Connect failed!\n"; $ssh2->auth_password($ftpUser, $ftpPW) or die "password auth failed\n"; $ftp = Net::SFTP::Foreign->new(ssh2 => $ssh2, backend => 'Net_SSH2');
from this
$ftp = Net::SFTP::Foreign-> new(host => $ftpSecureServer, backend => 'Net_SSH2', user => $ftpUser, password => $ftpPW);
both use this code to actually send
$ftp->put( $zipFileName, $ftpDir."/" . $newname ); if ( !$@ ) { printl("Transmission complete..\n"); $rc = $true; } else { printl("file $zipFileName upload failed, try later\n"); }
the 32 SFTP version does
$ftp->put( $zipFileName, $newname ); if ( !$error ) { # etc
setting SSH2 debug gets me the gory details, but nothing really useful
libssh2_channel_open_ex(ss->session, pv_channel_type, len_channel_type +, window_s ize, packet_size, ((void *)0) , 0 ) -> 0x47dc418 Net::SSH2::Channel::read(size = 4, ext = 0) - read 4 bytes - read 4 total Net::SSH2::Channel::read(size = 5, ext = 0) - read 5 bytes - read 5 total
anyone have any suggestions?

Replies are listed 'Best First'.
Re: debugging Net::Sftp::Foreign using ssh2
by salva (Canon) on Dec 12, 2012 at 14:56 UTC
    The way to check for errors on Net::SFTP::Foreign is calling the error method:
    $sftp->put(...); if ($sftp->error) { ... };
    Or alternatively, use the autodie feature:
    my $sftp = Net::SFTP::Foreign->new(..., autodie => 1);
    In order to activate debugging set...
    $Net::SFTP::Foreign::debug = -1;

    Also, note that libssh2/Net::SSH2 are somewhat buggy. Ensure that at least you are using the latest versions.

      >In order to activate debugging set... $Net::SFTP::Foreign::debug = -1; where did you find that? there are all kinds of workarounds here, but nothing that straight forward.. thank you.. adding the debug, it does not fail..typical!.. but the debug output is good..

        I can't find where I read it, but I believe $Net::SFTP::Foreign::debug is a bitmask, so -1 (equivalent to all ones in binary*) is saying "show me everything".

        * for 2's compliment based systems