2011-03-11 173 views
9

我有一个shell脚本,我正在处理这一行代码,它通过本地文件(.gz)执行循环并执行scp。如果可能,我想测试失败的scp。我正在做一个循环,所以我可以将每个文件名回显到日志,以便我可以跟踪它。以编程方式检查shell脚本中失败的scp的最佳方式

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

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

我也建议使用'-q'选项SCP的防止它提示输入密码如果密钥被远程服务器 – Petesh 2013-06-21 21:36:27

回答

15

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

+0

拒绝,就像'$? > 1然后回显“scp failed”? – jdamae 2011-03-11 00:33:19

+0

@jdamae:'if(($?> 0));然后回显“scp失败”; fi'(或'!=')或'if [$? -ne 0]' – 2011-03-11 03:08:52

+0

@丹尼斯 - 感谢这个例子。 – jdamae 2011-03-11 03:14:52

4

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

0

对于愚像我在那里谁比正常搞乱格式错误不再花费:

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

[和下一个字符之间需要有空格。 (单个“[”是调用测试的捷径)。上面的例子给我错误,所以我不得不插入一个空格。 – Daps0l 2013-11-30 17:34:25

5

使用:

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

那里是后“[”空白和之前“ ]”。 不包围$?和0引号

+0

如果你只是想知道它是否失败,(你不需要“OK”部分),那么你可以使用'ne'作为你的操作符(不等于),例如, '如果[$? -ne 0];' – 2016-03-01 13:27:52

1

您也可以尝试捕捉错误日志:

for gzfile in $LOCALDMPDIR/*.gz 
do 
    /usr/bin/scp -P 2222 -i $KEYFILE $gzfile [email protected]$1:$TGTDIR 2>>/var/log/scperror.log \ 
    && echo "$gzfile is done." \ 
    || echo "scp error: $gzfile" 
done 
相关问题