Search code examples
bashsftpscp

Ignore specific error conditions with SFTP/SCP File transfer


I am trying to bash script a daily file transfer between 2 machines. The script runs on the destination machine and pulls a file from the source machine. Occasionally the source machine will not have a file ready, this is acceptable.

I would like the script to exit 0 on successful transfer, and when there is no file available to be transferred. I would like the script to exit non 0 on any other failure condition (connectivity, etc).

I tried the following 2 approaches, I found with SCP the return code is always 1 no matter what the actual error, so its hard for the script to differentiate between my acceptable error condition, and others.

The sftp method seems to always return 0 no matter what takes place during the command. Any suggestions?

scpGet(){
  echo "Attempting File Transfer"
  scp -P $REMOTEPORT $REMOTEHOST:$REMOTEPATH $LOCALPATH
  echo $?
}
sftpGet(){
cd $LOCALPATH
sftp -P $REMOTEPORT $REMOTEHOST << EOF
get $REMOTEPATH
quit
EOF
echo $?
}

Solution

  • I haven't validated this, so please check that it actually does what you want - but you are apparently running scp with no password, so you can probably execute arbitrary code remotely to test for the existence of the file. Just be careful.

    scpGet() {
      echo "Attempting File Transfer"
      if scp -P $REMOTEPORT $REMOTEHOST:$REMOTEPATH $LOCALPATH
      then echo "$( ls -l $LOCALPATH) - successfully retrieved"
      elif ssh -P $REMOTEPORT ls -l $REMOTEHOST:$REMOTEPATH
      then echo "$REMOTEHOST:$REMOTEPATH exists, but I can't retrieve it!" >&2
           exit $oopsieCode 
      elif (( 2 == $rc )) # ls failed to find the file - verify this code
      then echo "File not ready. Ignoring."
      else : handle errors other than "not found"
      fi
    }