
У меня четыре Raspberry Pie, на всех работает curl 7.64.0. Каждый Pi загружает изображение с веб-камеры на один и тот же хост каждые две минуты. Это 30 изображений в час для четырех Pie. Все это делается с помощью простых скриптов оболочки bash. Аутентификация на хосте выполняется с помощью открытого ключа.
Обычно это работает нормально, но время от времени все или большинство Pie выходят из строя с ошибкой 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
Это не совсем ответ на вопрос, но это одно из решений проблемы. Я окружил команду curl циклом do. Похоже, curl не считает ошибку "Failed getting banner" ошибкой соединения, поэтому он не "повторяет попытку", а просто отключается по тайм-ауту. Вот что я использую:
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
Это некрасиво, но больше нет ошибок curl 2 ни на одном из четырех Pie.