in reply to net-sftp-foreign transfer failed vs file not present.

If the remote file doesn't exist, get fails and the error code becomes SFTP_ERR_REMOTE_STAT_FAILED or SFTP_ERR_REMOTE_OPEN_FAILED (constants are defined in Net::SFTP::Foreign::Constants).

You can also check the last status response from the server ($sftp->status). For conforming serves, that should be SSH2_FX_NO_SUCH_FILE.

In summary:

use Net::SFTP::Foreign::Constants qw(:error :status); ... unless ($sftp->get($remote, $local)) { if (($sftp->error == SFTP_ERR_REMOTE_STAT_FAILED or $sftp->error == SFTP_ERR_REMOTE_OPEN_FAILED) and $sftp->status == SSH2_FX_NO_SUCH_FILE) { say "Remote file does not exist!"; } else { say "Transfer failed"; } die $sftp->error; }

Replies are listed 'Best First'.
Re^2: net-sftp-foreign transfer failed vs file not present.
by mariog (Acolyte) on Aug 07, 2014 at 09:47 UTC

    Hello

    thank you for your input. I modified the script accordingly but still gives me this error: Uncaught exception from user code: Couldn't stat remote file: No such file at ./datalex.pl line 37. here is my script with the code adapted:
    #!/usr/bin/perl -w use strict; use warnings; use Net::SFTP::Foreign; use POSIX qw(strftime); use diagnostics; use Net::SFTP::Foreign::Constants qw(:error :status); my $datestring =strftime "%d-%m-%Y", localtime; my $host="sftp.brusselsairlines.com"; my $username="dlex"; my $local="/mnt/datalex"; my $file="BookingReport_Daily_$datestring.xls"; #nagios integration. my $sftp = Net::SFTP::Foreign->new($host, user=> $username, stderr_dis +card => 1 ); $sftp->die_on_error("unable to establish SFTP Connection"); my $ok = 0; my $failed = 0; if ( -e "$local/$file"){ print "BH-ZONE-BATCHSRV-1\tfoster_report_transfer\t0\tFile \" +$file\" has already been Downloaded to ==> \"$local\"\n"; } else { unless ($sftp->get("$file", "$local/$file")) { if (($sftp->error == SFTP_ERR_REMOTE_STAT_FAILED or $sftp->error == SFTP_ERR_REMOTE_OPEN_FAILED) and $sftp->status == SSH2_FX_NO_SUCH_FILE) { print "Remote file does not exist!"; } else { print "Transfer Failed"; } die $sftp->error; } print "File \"$file\" downloaded to ==> \"$local\"\n"; $sftp->remove($file); $ok++; } #print "$ok files have been downloaded, $failed files failed!\n\n"; $sftp->disconnect();
    perhaps i should use $sftp->ls to get the filename but I do not understand how to get the name of the file in a variable.. i do not understand the hash reference. i try this but it does not work. .
    my $ls = $sftp->ls( '.', wanted => qr/$datestring/) or die "unable to + retrieve directory: ".$sftp->error; my $file = "$_->{filename}\n" for (@$ls); print $file
    thanks

      Hi,

      I've just seen that your problem isn't solved yet, is it?

      You get an exception, but this is what you've coded:

      unless ($sftp->get("$file", "$local/$file")) { if (($sftp->error == SFTP_ERR_REMOTE_STAT_FAILED or $sftp->error == SFTP_ERR_REMOTE_OPEN_FAILED) and $sftp->status == SSH2_FX_NO_SUCH_FILE) { print "Remote file does not exist!"; } else { print "Transfer Failed"; } die $sftp->error; }

      Independent from your if-clause you have a die at the end of your conditional block when get didn't work. More interesting would be to see whether you get the line "Remote file does not exist!".

      Where does the message "Uncaught exception from user code: Couldn't stat remote file: No such file at ./datalex.pl line 37" come from? A wrapper?

      Regards
      McA

        Hello,

        I guess that removing the die outside the if solves the issue. I have other query.. how can I print the output of the sftp. when I execute a transfer in the command live and I get a file from the sftp I get this output on screen...
        sftp> get BookingReport_Daily_07-08-2014.xls Fetching /dlex/BookingReport_Daily_07-08-2014.xls to BookingReport_Dai +ly_07-08-2014.xls
        how can in perl achieve this and redirect that ouptut to a log file per instance.