简单的sftp有时会导致错误

时间:2012-10-01 06:25:31

标签: shell unix sftp

我想就检查shell脚本的错误发表意见。我支持的系统包含一个简单的shell脚本,由另一个应用程序(java)多次运行。 java调用一个执行ftp连接打开的shell脚本,移动本地目录,mget命令,最后是一个bye命令。然后检查$?在再见命令之后。

我知道首先这段代码是可疑的,因为它应该只检查再见命令,但它会间歇性地导致错误。我已经要求UNIX管理员查看系统中是否有日志错误,但是他们说没有。

基本上脚本的一般结构是:

sftp -oPort=<port forwarding port> <ip and user> <<==
lcd <some variable>
mget <some variable>
bye

rtn=$?
if [ ${rtn} != 0 ]
then
        exit 1
fi

exit 0

为什么$?有时会返回非零值?

1 个答案:

答案 0 :(得分:3)

退出代码非零的原因:

  1. lcd命令失败,您处于批处理模式
  2. mget命令失败(glob不起作用),你处于批处理模式
  3. bye命令失败(概率很低)并且您处于批处理模式
  4. 远程端没有sftp服务器(退出代码== 255)
  5. 如果您想故意忽略正在使用的命令中的错误,那么您可以在命令前添加-,例如: mget变为-mget

    尝试调试时要做的一件重要事情是捕获命令的输出并在命令失败时转储它,例如。

    trap 'rm -f /tmp/logfile.$$' EXIT HUP
    sftp -oPort=<port forwarding port> <ip and user> >&/tmp/logfile.$$ <<EOM
    lcd <some variable>
    mget <some variable>
    bye
    EOM
    rtn=$?
    if ((rtn != 0)); then
        cat /tmp/logfile.$$
        exit 1
    fi
    exit 0
    

    当脚本终止时,trap会删除文件。