Wie sende ich einen Zeilenumbruch mit Curl?

88

Ich habe Folgendes versucht, um einen Zeilenumbruch mit Curl zu senden, wird jedoch \nnicht von Curl interpretiert.

curl -X PUT -d "my message\n" http://localhost:8000/hello

Wie kann ich einen Zeilenumbruch mit Curl senden?

Deamon
quelle
1
Auf welcher Plattform? Kann relevant sein
Pekka

Antworten:

114

Manchmal möchten Sie die zu sendenden Daten wörtlich angeben.

Die --data-binaryOption macht das.

Szocske
quelle
2
Dies ist der beste Weg, dies zu tun. Die Alternative, -d @message.txtwie in der anderen Antwort vorgeschlagen, kann insbesondere Ihre Zeilenumbrüche ändern. --data-binaryAuf der anderen Seite nicht - was wichtig ist, wenn Sie Ihre CRLF-Zeilenumbrüche für mehrteilige / Formulardaten behalten müssen, siehe: stackoverflow.com/questions/10765243/… )
William Denniss
8
Weil ich eine Sekunde gebraucht habe: Wenn Sie eine Datei hochladen, möchten Sie wahrscheinlich eine Subshell dafür verwendencurl -H "Content-Type:text/plain" --data-binary "$(<myfile)" http://localhost:8888
mikemaccana
Interessant, aber was ist der Vorteil?
Szocske
8
+1, richtige Antwort. curl --data-binary @/path/to/file.txt http://example.com/target
Frank Olschewski
3
Ich konnte --data-binary nicht zum Laufen bringen, konnte aber die Antwort% 0A (siehe @malcolmocean) verwenden. Wenn ich --data-binary "ip = 33.44.55. * \ N5.6.7.8" verwende, wird es nicht als Zeilenumbruch behandelt, sondern --data "" ip = 33.44.55. *% 0A5.6.7.8 "schickt die Newline durch
Paul
49

Ihre Muschel geht vorbei, \gefolgt von neiner neuen Linie, die sich eher kräuselt als "my message\n". Bash unterstützt eine andere Zeichenfolgensyntax, die Escape-Sequenzen wie \nund unterstützt \t. Um es zu verwenden, beginnen Sie die Zeichenfolge mit $'und beenden Sie die Zeichenfolge mit ':

curl -X PUT -d $'my message\n' http://localhost:8000/hello

Siehe ANSI-C-Angebot im Bash-Referenzhandbuch

Benjamin Atkin
quelle
Das hat auch bei mir funktioniert. Ich muss damit herumspielen, weil es mit doppelten Anführungszeichen nicht funktioniert hat, was bedeutet, dass ich keine einfachen Anführungszeichen innerhalb der Zeichenfolge verwenden kann.
Tyler Collier
1
Ich weiß nicht, woher Sie diese Idee haben, dass dies "JavaScript-Shell-Syntax" ist. Die Shell geht my message\nwörtlich vorbei , nicht mit zwei Fluchten, wie Sie sagen.
Chris Down
@ ChrisDown, du hast mich falsch zitiert. Ich sagte "JavaScript-String-Syntax", nicht "JavaScript-Shell-Syntax". Ich verwende die JavaScript-Zeichenfolgensyntax, um klar zu machen, was ich mit meinen Zeichenfolgenbeispielen meine. Ich denke, was Sie als bezeichnen, my message\nist dasselbe wie das, worauf ich mich beziehe "my message\n".
Benjamin Atkin
2
@ BenAtkin Sorry, Freudian Slip. Meine Lesart war jedoch immer noch korrekt. \nhat nichts mit JavaScript zu tun. Tatsächlich hat hier überhaupt nichts mit JavaScript zu tun.
Chris Down
Ich benutze es, um es den Leuten zu erklären. Und es scheint funktioniert zu haben. Die Shell-String-Syntax ist nicht allgemein bekannt. Wenn ja, warum wäre diese Frage gestellt worden? Was hätte ich verwenden sollen, um es zu erklären?
Benjamin Atkin
16

Es gibt einen viel einfacheren Weg!

curl -X PUT -d $'my message\n' http://localhost:8000/hello

Dies verwendet ANSI-C-Anführungszeichen , um das Zeilenumbruchzeichen einzufügen.

Keine Rohrleitungen, keine Datendateien. Siehe auch Senden von Zeilenumbrüchen mit cURL .

Dave Kerr
quelle
Das sollte eine akzeptierte Antwort sein, obwohl Bash-Syntax verwendet wird
odiszapc
Dies ist das einzige, was für mich aus allen Antworten heraus funktioniert hat
Bob Kocisko
15

Die Lösung für jemanden, der keine Dateien verwenden möchte und nicht auf Shell-Fluchtmagie zurückgreifen möchte, lautet:

curl -X POST --data-binary @- http://url.com <<EOF
line one
line two
EOF

Dies sind jedoch wörtliche Zeilenumbrüche in der Postdaten-Nutzlast und nicht in Formularfeldern.

Störsender
quelle
Ich habe Probleme, das zu verstehen. Ich verstehe, dass dies @einen Dateinamen angibt, aber gibt es eine besondere Bedeutung bei der Verwendung @-? Was <<EOFmacht das
Dennis T - Reinstate Monica -
1
@-Weist Curl an, Eingaben von Standard-In zu verbrauchen, und <<EOFist der Indikator für das Ende des Streams für Bash. Wir verwenden dann später das Zauberwort EOFin der Datennutzlast, um bash mitzuteilen, dass wir mit dem Schreiben in den Stream fertig sind.
Jammer
Auch -ist eine Art der Standardmethode in GNU / Linux STDIN angeben , wenn ein Dateiname erwartet wird. Es ist nicht universell, aber es ist ziemlich häufig.
Rich Remer
Wenn wir das Handbuch konsultieren, sehen wir, dass es nur - und nicht @ -
user3504575 sein sollte.
8

Hatte ein ähnliches Problem. Beim Hochladen der CSV-Datei vom Mac in den Cloud-Speicher wurden neue Zeilen entfernt. Nach dem Herunterladen sah die gesamte Datei wie eine einzelne Zeile aus. Ich habe versucht, verschiedene EOL-Zeichen '\ n' '\ r' '\ r \ n' ohne Erfolg hinzuzufügen. Die Verwendung von '--data-binary' anstelle von '-d' löste das Problem. Übrigens trat dieses Problem nur auf dem Mac auf. '-d' funktionierte einwandfrei, als der Anruf vom CentOS-Computer aus getätigt wurde. Dies sieht aufgrund des Newline-Charakters von Mac sehr ähnlich aus. Aber keine Lust mehr zu debuggen.

Vielen dank für Deine Hilfe.

curl -X PUT -d @filename.csv https://cloudstorage -H "content-type: text/csv"

VS

curl -X PUT --data-binary @filename.csv https://cloudstorage -H "content-type: text/csv"
SutuwaShell
quelle
Vielen Dank ! Dies hängt nicht mit Ihrem Mac zusammen: Ich hatte genau das gleiche Problem unter Linux und die Verwendung --data-binary @hat mein Problem behoben (Senden einer mehrzeiligen .ics-Datei an einen CalDAV-Server).
M-Jack
7

(Ich bin hier mit einer etwas anderen Frage gelandet, daher werde ich nur meine Antwort veröffentlichen, da dies zukünftigen Entdeckern helfen könnte.)

Meine Lösung gilt für Personen, die Daten im Formularstil senden, dh Schlüssel / Wert-Paare in einer Abfragezeichenfolge. Verwenden Sie den codierten Zeilenumbruch %0A, genau wie ein codierter Leerzeichen %20. Sie können http://meyerweb.com/eric/tools/dencoder/ verwenden , um andere Symbole zu konvertieren.

Wenn Sie also den Schlüssel messageauf den Wert setzen möchten :

line one
another

du würdest senden

curl --data "message=line%20one%0Aanother" http://localhost:8000/hello
MalcolmOcean
quelle
1
kleiner Kommentar (möglicherweise Tippfehler) für ein Zeilenumbruch- / Carraige-Rückkehrzeichen sollte% 0A statt% A0 sein
Paul
3

Keine Antwort auf Ihre Frage, aber ich würde sie umgehen, indem ich eine temporäre Datei mit der Nachricht und dem Zeilenumbruch erstelle und diese Datei zum Bearbeiten einrolle:

curl -X PUT -d @message.txt http://localhost:8000/hello

Aus dem Handbuch :

Wenn Sie die Daten mit dem Buchstaben @ beginnen, sollte der Rest ein Dateiname sein, aus dem die Daten gelesen werden sollen, oder - wenn Sie möchten, dass Curl die Daten aus stdin liest. Der Inhalt der Datei muss bereits URL-codiert sein. Es können auch mehrere Dateien angegeben werden. Das Posten von Daten aus einer Datei mit dem Namen "foobar" würde daher mit --data @foobar erfolgen.

Pekka
quelle
Die Verwendung temporärer Dateien ist ein praktischer Ansatz. Laut Szocskes Antwort --data-binaryist dies eine getreuere Alternative zu -d, da die Daten wörtlich gesendet werden.
William Denniss
7
-1; Die Verwendung einer temporären Datei mit -d @/path/to/temp/file.txtlöst das Zeilenumbruchproblem NICHT. --data-binarytut, siehe oben.
Frank Olschewski
Wenn Sie dies sehen, weil Sie sich fragen, warum Ihre Curl-Befehle nach dem Upgrade von Curl oder Windows 10 nicht funktionieren, stellen Sie sicher, dass Sie Anführungszeichen um Ihre Dateireferenz setzen. Beispiel: curl -X PUT -d "@ message.txt" localhost: 8000 / hello Meine Elasticsearch-Wiederherstellungsskripte funktionierten nicht mehr.
Joezen777
3

Ein sehr einfacher Weg, einfach Shift-Enter in der Konsole für die Pause. Sehr gut lesbar.

curl -d "line1
line2" http-echo.com

Server gets this: line1\nline2

Gehen Sie folgendermaßen vor, um den Zeilenumbruch zu entfernen:

curl -d "line1 \
line2" http-echo.com

Server gets this: line1 line2
John Williams
quelle
-2

Ich habe Sendgrid mit diesem Code (unten kopiert) verwendet, der ursprünglich hier https://sendgrid.com/docs/API_Reference/Web_API_v3/index.html gefunden wurde

\n\narbeitete in Google Mail, wurde aber \nignoriert. Ich habe versucht, die Flucht und andere Vorschläge zu verdoppeln. Ich habe es auch versucht \r\nund das hat auch in Google Mail nicht funktioniert. Hinweis: Ich habe mich nicht darum gekümmert, andere E-Mail-Clients zu testen. Möglicherweise handelte es sich um ein Google Mail-spezifisches Problem.

    curl --request POST \
  --url https://api.sendgrid.com/v3/mail/send \
  --header 'Authorization: Bearer YOUR_API_KEY' \
  --header 'Content-Type: application/json' \
  --data '{"personalizations": [{"to": [{"email": "[email protected]"}]}],"from": {"email": "[email protected]"},"subject": "Hello, World!","content": [{"type": "text/plain", "value": "Heya!"}]}'

Schließlich gab ich die Suche nach einer Lösung auf und wechselte text/plainzu text/htmlund benutzte nur <br />Tags.

Jemand schlug vor, dass Sendgrid Klartext in HTML konvertiert, wenn Sie ein Tracking-Pixel aktiviert haben, was sinnvoll ist. Möglicherweise wurden die Zeilenumbrüche bei der Konvertierung von Klartext in HTML zerstört. Ich gehe davon aus, dass der Client ein Tracking-Pixel haben möchte, und entschied sich daher, auf HTML umzusteigen.

PJ Brunet
quelle