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

Bash 忽略SFTP/SCP文件传输的特定错误条件,bash,sftp,scp,Bash,Sftp,Scp,我正在尝试bash脚本在两台机器之间进行每日文件传输。脚本在目标计算机上运行,并从源计算机中提取文件。有时,源计算机没有准备好文件,这是可以接受的 我希望脚本在成功传输时以及没有可传输的文件时退出0。我希望脚本在任何其他故障条件(连接等)下退出非0 我尝试了以下两种方法,发现使用SCP时,无论实际错误是什么,返回代码总是1,因此脚本很难区分我的可接受错误条件和其他错误条件 无论命令执行过程中发生什么,sftp方法似乎总是返回0。有什么建议吗 scpGet(){   echo "Attemptin

我正在尝试bash脚本在两台机器之间进行每日文件传输。脚本在目标计算机上运行,并从源计算机中提取文件。有时,源计算机没有准备好文件,这是可以接受的

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

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

无论命令执行过程中发生什么,sftp方法似乎总是返回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 $?
}
scpGet(){
  回显“正在尝试文件传输”
  scp-P$REMOTEPORT$REMOTEHOST:$REMOTEPATH$LOCALPATH
  回声$?
}
sftpGet(){
cd$LOCALPATH

sftp-P$REMOTEPORT$REMOTEHOST

我还没有对此进行验证,所以请检查它是否确实符合您的要求- 但是你显然是在没有密码的情况下运行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
}

非常感谢保罗,你引导我走上了正确的道路,而且现在,我只是检查文件是否在那里,如果没有,我会中止脚本的其余部分。很高兴能帮上忙