Brad87
Brad87

Reputation: 23

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 $?
}

Upvotes: 2

Views: 3239

Answers (1)

Paul Hodges
Paul Hodges

Reputation: 15273

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
}

Upvotes: 1

Related Questions