
Ich habe vier Raspberry Pies, auf denen alle curl 7.64.0 läuft. Jeder Pi lädt alle zwei Minuten ein Webcam-Bild auf denselben Host hoch. Das sind 30 Bilder pro Stunde für vier Pies. Dies alles wird mit einfachen Bash-Shell-Skripten erledigt. Die Authentifizierung beim Host erfolgt über einen öffentlichen Schlüssel.
Normalerweise funktioniert das gut, aber hin und wieder schlagen alle oder die meisten Pies mit Curl-Fehler 2 fehl, der laut Protokoll durch Folgendes verursacht wird: „Fehler beim Herstellen der SSH-Sitzung: -13, Banner konnte nicht abgerufen werden.“
Mir ist klar, dass dies nicht durch einen Fehler in curl verursacht wird, ich frage mich jedoch, ob es eine Möglichkeit gibt, den Fehler mit curl zu beheben.
Im Moment verwende ich die folgenden Parameter:
--connect-timeout 10 --max-time 120 --retry 5 Ich habe max-time auf 120 gesetzt, weil alle zwei Minuten Bilder hochgeladen werden. Die anderen beiden sind nur Vermutungen meinerseits, was funktionieren könnte.
Hier ist der vollständige Curl-Befehl:
curl -s -v -u me: \
--connect-timeout 10 \
--max-time 120 \
--retry 5 \
--pubkey ~/.ssh/id_rsa.pub \
-T $file $host >> $log 2>&1
Wo:
$file is: the file to be uploaded
$host is: host=sftp://ftp.me.com/~/public_html/
$log is: the local log file
Hier ist die ausführliche Curl-Ausgabe:
* 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
Gibt es einen besseren Weg?
Antwort1
Das ist zwar keine große Antwort auf die Frage, aber eine Lösung für das Problem. Ich habe den Curl-Befehl mit einer Do-Schleife umgeben. Es scheint, dass Curl den Fehler „Banner konnte nicht abgerufen werden“ nicht als Verbindungsfehler betrachtet und daher keinen „Wiederholversuch“ ausführt; es läuft einfach ab. Folgendes verwende ich:
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
Es ist hässlich, aber bei keinem der vier Pies treten mehr Curl-2-Fehler auf.