我有四台 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 错误。