【问题标题】:best way to programmatically check for a failed scp in a shell script在 shell 脚本中以编程方式检查失败 scp 的最佳方法
【发布时间】:2011-03-11 00:21:35
【问题描述】:

我有一个 shell 脚本,我正在使用这行代码执行循环本地文件 (.gz) 并执行 scp。如果可能,我想测试失败的scp。我正在做一个循环,以便将每个文件名回显到日志中,以便跟踪它。

有人可以告诉我如何检查失败的 scp 吗?或者更好的是,一个很好的代码示例来做到这一点?感谢您的帮助。

for gzfile in $LOCALDMPDIR/*.gz
do
  /usr/bin/scp -P 2222 -i $KEYFILE $gzfile foobar@$1:$TGTDIR
  echo "$gzfile is done. " 2>&1
done

【问题讨论】:

  • 我还建议对 scp 使用 -q 选项,如果密钥被远程服务器拒绝,它会阻止它提示输入密码

标签: bash shell unix


【解决方案1】:

使用 $?访问最后一个命令的返回值。检查 scp 的手册页进行验证,但我认为返回值为零表示成功。非零值意味着某种失败。

【讨论】:

  • 类似$? > 1 then echo "scp failed" ?
  • @jdamae:if (($? > 0)); then echo "scp failed"; fi(或!=)或if [ $? -ne 0 ]
  • 我的scp副本在成功发送文件fwiw后经常返回1,不知道为什么。
【解决方案2】:

使用:

if [ $? -eq 0 ];
then
    echo "OK"</br>
else
    echo "NOK"</br>
fi

在“[”之后和“]”之前有空格。 不要包围$?和 0 带引号

【讨论】:

  • 如果你只是想知道它是否失败,(你不需要“OK”部分),那么你可以使用ne作为你的运算符(不等于),例如if [ $? -ne 0 ];
【解决方案3】:

您可以检查变量$? 以查看scp 的返回码。如果它返回非零,则发生错误。

【讨论】:

    【解决方案4】:

    您也可以尝试将错误捕获到日志中:

    for gzfile in $LOCALDMPDIR/*.gz
    do
      /usr/bin/scp -P 2222 -i $KEYFILE $gzfile foobar@$1:$TGTDIR 2>>/var/log/scperror.log \
      && echo "$gzfile is done." \
      || echo "scp error: $gzfile"
    done
    

    【讨论】:

      【解决方案5】:

      对于像我这样的头脑简单的人,他们花费比平时更长的时间来处理格式错误:

      scp "fromHere" hostname:"toThere"
      if [ "$?" -eq "0" ];
      then
          echo "SUCCESS"
      else
          echo "FAIL"
      fi
      

      【讨论】:

      • [ 和下一个字符之间需要有一个空格。 (单个“[”是调用测试的快捷方式)。上面的例子给了我错误,所以我不得不插入一个空格。
      猜你喜欢
      • 2011-01-22
      • 2013-05-12
      • 2017-12-24
      • 1970-01-01
      • 2011-03-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多