Übergabe von Binärdaten an Curl ohne Verwendung einer @ -Datei

30

Ist es möglich, Curl zu verwenden und Binärdaten zu posten, ohne einen Dateinamen einzugeben? Beispielsweise können Sie ein Formular mit Binärdaten über --data-binary veröffentlichen:

curl -X POST --data-binary @myfile.bin http://foo.com

Dies setzt jedoch voraus, dass eine Datei vorhanden ist. Ich hatte gehofft, in der Lage zu sein, HTTP-Aufrufe (z. B. zum Wiederherstellen von Diensten) als Text des Befehls curl zu protokollieren, um die Anforderung zu reproduzieren. (Dies erleichtert beispielsweise das Debuggen dieser Dienste erheblich.)

Das Protokollieren von Curl-Befehlen, die auf eine Datei verweisen, ist jedoch nicht sinnvoll. Daher hatte ich die Hoffnung, die rohen Binärdaten, die vermutlich base64-codiert sind, tatsächlich protokollieren zu können, und Sie können dennoch den protokollierten Curl-Befehl kopieren, einfügen und ausführen.

Ist es also möglich, Curl und Post-Binärdaten zu verwenden, ohne auf eine Datei zu verweisen? Wenn ja, wie würde das funktionieren? Wie würde ein Beispiel aussehen?

Kirk Woll
quelle
Wenn Sie es nicht in einer Datei protokollieren, wo protokollieren Sie es dann?
slm
@slm, ich denke du verstehst das falsch. Ich protokolliere meine clientseitigen Rest-Aufrufe in einer Protokolldatei im Klartext (als wörtlich gleichwertiger Curl-Befehl). Ich möchte jedoch nicht für jeden von mir protokollierten Binär-Curl-Befehl auf eine zufällige Datei verweisen müssen. Ich möchte, dass der gesamte Text des Befehls curl vollständig in sich geschlossen ist, damit jemand diesen Text in ein Terminal kopieren und ausführen kann, um den Anruf zu reproduzieren.
Kirk Woll

Antworten:

45

Sie können Daten wie folgt über STDIN in curl übergeben:

echo -e '...data...\n' | curl -X POST --data-binary @- http://foo.com

Das @-sagt curl, dass man von STDIN einsteigen soll.

So leiten Sie Binärdaten zum Einrollen weiter (zum Beispiel):

echo -e '\x03\xF1' | curl -X POST --data-binary @- http://foo.com
slm
quelle
Dies erlaubt jedoch immer noch nicht, dass die Binärdaten Teil des Textes des Befehls curl sind. Also ist das nicht möglich?
Kirk Woll
Was Sie verlangen, klingt nicht machbar. Die Daten für den Befehl curl können entweder in curl umgeleitet oder über die Funktion @ <filename> abgerufen werden. Meines Wissens gibt es keine andere Methode.
slm
1
Eigentlich ist Ihre Antwort perfekt - Ihr Beispiel sollte stattdessen nur binär verwenden. :) Dh echo -e '\x03\xF1' | curl -X POST --data-binary @- http://foo.com wo \x03\xF1sind die rohen Binärdaten als Hexadezimal, was ziemlich genau das ist, was ich will.
Kirk Woll
Groß. Ich bin dir nicht ganz gefolgt. Sie wollten also Binärdaten in Curl umleiten. Ich dachte, Sie würden nach etwas anderem fragen. Ich bin froh, dass es für dich funktioniert hat.
slm
2
Ich versuchte dies: cat 1.jpg | curl -X POST --data-binary @- http://foo.com. Lief wie am Schnürchen. Zur Bestätigung habe ich auch versucht: cat 1.jpg | md5sumund md5sum 1.jpg. Sie gaben beide den gleichen Wert zurück.
Dimitarvp
0

Ich weiß nicht warum, aber die genaue Befehlszeile, die slm vorschlug, funktionierte bei mir nicht. Mit einer geringfügigen Änderung funktionierte Folgendes:

echo -e '...data...\n' | curl -s -T - sftp://[email protected]/~/test.txt
Richard Nienaber
quelle
1
Der Grund dafür ist, dass SFTP ein völlig anderes Protokoll als HTTP mit sehr unterschiedlichen Funktionen ist und sowohl in der Manpage als auch in der Hilfemeldung --data-binary nur für HTTP (und HTTPS) gilt.
Dave_thompson_085
Das macht Sinn. Ich habe mehrere Online-Quellen kombiniert, um dies zum Laufen zu bringen, sodass ich den Teil der Frage verpasst habe, der es HTTP-spezifisch machte. Ich werde meine Antwort hier hinterlassen, falls jemand anderes sie benötigt.
Richard Nienaber
0

Zusätzlich zu dieser Antwort, der echoanfügt Befehl eine neue Zeile zu seinem Ausgang standardmäßig. Dies fügt ein \nan das Ende Ihrer Binärdaten an. Daher erhält curl dieses Zeichen auch als Eingabe.

Um dies zu vermeiden, können Sie den printfBefehl oder den -nSchalter folgendermaßen verwenden:

printf '\x03\xF1' | curl -X POST --data-binary @- http://foo.com

oder

echo -en '\x03\xF1' | curl -X POST --data-binary @- http://foo.com

Auf diese Weise wird keine neue Zeile an den Curl-Eingang angehängt, und die dem Curl zugeführten Bytes entsprechen genau denen, die Sie übergeben haben echo.

robg
quelle