如何处理“Failed getting banner”导致的curl错误2?

如何处理“Failed getting banner”导致的curl错误2?

我有四台 Raspberry Pies,都运行 curl 7.64.0。每台 Pi 每两分钟将一个网络摄像头图像上传到同一台主机。对于四台 Pies,这意味着每小时上传 30 幅图像。这一切都是通过简单的 bash shell 脚本完成的。主机的身份验证是通过公钥完成的。

正常情况下,这可以正常工作,但有时所有或大多数 Pies 都会因 curl 错误 2 而失败,根据日志,其原因是:“无法建立 ssh 会话:-13,无法获取横幅”。

我知道这不是由 curl 中的错误引起的,但我想知道是否有某种方法可以克服 curl 中的错误。

现在我正在使用以下参数:

--connect-timeout 10 --max-time 120 --retry 5 我将 max-time 设置为 120,因为每两分钟上传一次图像。其他两个只是我的猜测,可能有效。

以下是完整的 curl 命令:

    curl -s -v -u me: \
     --connect-timeout 10 \
     --max-time 120 \
     --retry 5 \
     --pubkey ~/.ssh/id_rsa.pub \
     -T $file $host >> $log 2>&1

在哪里:

$file is: the file to be uploaded
$host is: host=sftp://ftp.me.com/~/public_html/
$log  is: the local log file

以下是详细的 curl 输出:

*   Trying nnn.nnn.nnn.nnn...
* TCP_NODELAY set
* Expire in 200 ms for 4 (transfer 0x3698b0)
* Connected to ftp.mgnewman.com (nnn.nnn.nnn.nnn) port 22 (#0)
* Failure establishing ssh session: -13, Failed getting banner
* Closing connection 0

有没有更好的办法?

答案1

这并不能很好地回答这个问题,但它是解决问题的一个方法。我用 do 循环包围了 curl 命令。看来 curl 并不认为“获取横幅失败”错误是连接错误,所以它不会“重试”;它只是超时。这是我使用的:

for i in {1..3}
 do

    curl -s -v -u mgnewman: \
     --connect-timeout 25 \
     --max-time 40 \
     --retry 3 \
     --pubkey ~/.ssh/id_rsa.pub \
     -T $file $host >> $log 2>&1

        err=$?
        echo $'\n'"`date`" Upload Ended "$err" - $(hostname) >> "$log"


        if [ $err -eq 0 ] ; then
                break
        fi
done

虽然很丑,但是四个 Pies 中的任何一个上都不再出现 curl 2 错误。

相关内容