忽略 SFTP/SCP 文件传输的特定错误条件

Ignore specific error conditions with SFTP/SCP File transfer

我正在尝试 bash 编写 2 台机器之间每日文件传输的脚本。该脚本在目标机器上运行并从源机器上拉取文件。有时源机器没有准备好文件,这是可以接受的。

我希望脚本在成功传输时退出 0,并且没有可传输的文件。我希望脚本在任何其他故障条件(连接等)下退出非 0。

我尝试了以下两种方法,我发现使用 SCP,无论实际错误是什么,return 代码始终为 1,因此脚本很难​​区分我可接受的错误条件和其他错误条件。

sftp 方法似乎总是 return 0,无论在命令期间发生什么。有什么建议么?

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

我还没有对此进行验证,所以请检查它是否确实按照您的要求运行 - 但是你显然是 运行 没有密码的 scp,所以你可以远程执行任意代码来测试文件是否存在。小心点。

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
}