it-swarm.com.de

Warum CURL-Rückgabe und Fehler (23) Schreibvorgang fehlgeschlagen?

Es funktioniert als einzelnes Werkzeug in Ordnung:

curl "someURL"
curl -o - "someURL"

aber es funktioniert nicht in einer Pipeline:

curl "someURL" | tr -d '\n'
curl -o - "someURL" | tr -d '\n'

es gibt zurück:

(23) Failed writing body

Was ist das Problem beim Piping der Curl-Ausgabe? Wie puffere ich die gesamte Curl-Ausgabe und handle sie dann?

85
static

Dies geschieht, wenn ein Pipe-Programm (z. B. grep) die Lesepipe schließt, bevor das vorherige Programm die gesamte Seite geschrieben hat.

In curl "url" | grep -qs foo wird der Lesestream von curl geschlossen, sobald grep das hat, was er möchte. cURL erwartet dies nicht und gibt den Fehler "Fehler beim Schreiben des Textkörpers" aus.

Eine Problemumgehung besteht darin, den Stream durch ein Zwischenprogramm zu leiten, das immer die gesamte Seite liest, bevor sie dem nächsten Programm zugeführt wird.

Z.B.

curl "url" | tac | tac | grep -qs foo

tac ist ein einfaches Unix-Programm, das die gesamte Eingabeseite liest und die Zeilenreihenfolge umkehrt (daher führen wir sie zweimal aus). Da die gesamte Eingabe gelesen werden muss, um die letzte Zeile zu finden, wird bis zum Abschluss von cURL nichts an grep ausgegeben. Grep schließt den Lesestream immer noch, wenn er das Gesuchte hat, aber er wirkt sich nur auf tac aus, was keinen Fehler ausgibt.

80
Kaworu

(Der Vollständigkeit halber und für zukünftige Suchanfragen.) Es ist eine Frage, wie CURL den Puffer verwaltet. Der Puffer deaktiviert den Ausgabestrom mit der Option -N.

ES: curl -s -N "URL" | grep -q Welcome

21
user5968839

Es war also ein Codierungsproblem. Iconv löst das Problem

curl 'http://www.multitran.ru/c/m.exe?CL=1&s=hello&l1=1' | iconv -f windows-1251 | tr -dc '[:print:]' | ...
9
static

Ich hatte den gleichen Fehler, aber aus verschiedenen Gründen. In meinem Fall hatte ich (tmpfs) eine Partition mit nur 1 GB Speicherplatz und ich habe große Dateien heruntergeladen, die schließlich den gesamten Speicher gefüllt auf dieser Partition gefüllt haben und ich habe den gleichen Fehler wie Sie.

6
LLL

Sie können dies anstelle der -o-Option tun:

curl [url] > [file]

6
user339827

Bei Verwendung der Option -o (Ausgabedatei) besteht eine andere Möglichkeit - das Zielverzeichnis ist nicht vorhanden.

z.B. wenn Sie -o /tmp/download/abc.txt haben und/tmp/download nicht existiert.

Stellen Sie daher sicher, dass alle erforderlichen Verzeichnisse zuvor erstellt wurden/sind, und verwenden Sie gegebenenfalls die Option --create-dirs sowie -o

5
MikeW

Beim Versuch, den Lack-Cache auf Ubuntu zu installieren, ist diese Fehlermeldung aufgetreten. Die Google-Suche hat mich hier für den Fehler (23) Failed writing body gelandet und eine Lösung gepostet, die für mich funktioniert hat.

Der Fehler tritt bei der Ausführung des Befehls als root curl -L https://packagecloud.io/varnishcache/varnish5/gpgkey | apt-key add - auf.

die Lösung ist, apt-key add als nicht root auszuführen 

curl -L https://packagecloud.io/varnishcache/varnish5/gpgkey | apt-key add -
1

Wenn Sie etwas Ähnliches wie source <( curl -sS $url ) ausprobieren und den Fehler (23) Failed writing body erhalten, funktioniert die Suche nach einer Prozessersetzung in bash 3.2 (der Standard für macOS) nicht.

Stattdessen können Sie diese Problemumgehung verwenden.

source /dev/stdin <<<"$( curl -sS $url )"
0
wisbucky

In meinem Fall hatte der Server keinen Festplattenspeicher mehr.

Prüfen Sie es mit df -k .

Ich wurde auf den Mangel an Festplattenspeicher aufmerksam gemacht, als ich zweimal durch tac geleitet habe, wie in einer der anderen Antworten beschrieben: https://stackoverflow.com/a/28879552/336694 . Es zeigte mir die Fehlermeldung write error: No space left on device.

0

Für mich war es eine Erlaubnisfrage. Der Docker-Lauf wird mit einem Benutzerprofil aufgerufen, aber root ist der Benutzer im Container. Die Lösung bestand darin, Curl dazu zu bringen, in/tmp zu schreiben, da dies Schreibrechte für alle Benutzer hat, nicht nur für root.

Ich habe die Option -o verwendet.

-o/tmp/file_to_download

0
lallolu