Come inviare un'interruzione di riga con curl?


90

Ho provato quanto segue per inviare un'interruzione di riga con curl, ma \nnon viene interpretato da curl.

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

Come posso inviare un'interruzione di riga con curl?


1
Su quale piattaforma? Potrebbe essere rilevante
Pekka

Risposte:


114

A volte si desidera fornire i dati da inviare alla lettera.

L' --data-binaryopzione lo fa.


2
Questo è il modo migliore per farlo. L'alternativa di utilizzare -d @message.txtcome suggerito nell'altra risposta in particolare può alterare le interruzioni di riga. --data-binaryd'altra parte non (che è importante se è necessario mantenere i vostri interruzione di linea CRLF per multipart / form-data, vedi: stackoverflow.com/questions/10765243/... )
William Denniss

8
Perché mi ci è voluto un secondo: se stai caricando un file probabilmente vorrai usare una subshell per questocurl -H "Content-Type:text/plain" --data-binary "$(<myfile)" http://localhost:8888
mikemaccana

Interessante, ma qual è il vantaggio?
Szocske

8
+1, risposta corretta. curl --data-binary @/path/to/file.txt http://example.com/target
Frank Olschewski

3
Non sono riuscito a far funzionare --data-binary ma sono stato in grado di utilizzare il carattere% 0A (vedere @malcolmocean). Quando utilizzo --data-binary "ip = 33.44.55. * \ N5.6.7.8" non lo tratta come una nuova riga, ma --data "" ip = 33.44.55. *% 0A5.6.7.8 "invia la nuova riga attraverso
Paul

51

Il tuo guscio sta passando \seguito da npiuttosto che da una nuova riga da arricciare piuttosto che "my message\n". Bash supporta un'altra sintassi delle stringhe che supporta sequenze di escape come \ne \t. Per usarlo, inizia la stringa con $'e termina la stringa con ':

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

Vedere ANSI-C Quoting nel Bash Reference Manual


1
Questo ha funzionato anche per me. Dovrò giocarci un po ', perché non ha funzionato con le virgolette doppie, il che significa che non posso usare le virgolette singole all'interno della stringa.
Tyler Collier

1
Non so da dove hai avuto questa idea che questa sia "sintassi della shell JavaScript". La shell passa my message\nparola per parola, non con due escape come dici tu.
Chris Down

@ChrisDown, mi hai citato male. Ho detto "sintassi della stringa JavaScript", non "sintassi della shell JavaScript". Sto usando la sintassi delle stringhe JavaScript per essere chiaro su cosa intendo con i miei esempi di stringhe. Penso che ciò a cui ti riferisci my message\nsia lo stesso a cui mi riferisco "my message\n".
Benjamin Atkin

2
@ BenAtkin Scusa, lapsus freudiano. Tuttavia, la mia lettura era ancora corretta. \nnon ha nulla a che fare con JavaScript. In effetti niente qui ha niente a che fare con JavaScript.
Chris Down

Lo sto usando per spiegarlo alle persone. E sembra che abbia funzionato. La sintassi delle stringhe di shell non è ampiamente compresa. Se lo fosse, perché sarebbe stata posta questa domanda? Cosa avrei dovuto usare per spiegarlo?
Benjamin Atkin

16

C'è un modo molto più semplice!

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

Ciò utilizzerà ANSI-C virgolette per inserire il carattere di nuova riga.

Nessuna tubazione, nessun file di dati. Vedi anche Invio di newline con cURL .


Quella dovrebbe essere una risposta accettata nonostante l'utilizzo della sintassi di Bash
odiszapc

Questa è l'unica cosa che ha funzionato per me tra tutte le risposte
Bob Kocisko

15

La soluzione per qualcuno che non vuole usare i file e non vuole ricorrere alla magia dell'escape della shell è:

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

Ma si tratta di una nuova riga letterale nel payload post data e non nei campi modulo.


Ho problemi a capirlo. Capisco che @sia per indicare un nome di file, ma c'è un significato speciale quando lo uso @-? Cosa sta <<EOFfacendo?
Dennis T - Reinstate Monica -

1
@-dice a curl di consumare l'input dallo standard in ed <<EOFè l'indicatore di fine stream per bash. Successivamente utilizziamo la parola magica EOFnel payload dei dati per dire a bash che abbiamo finito di scrivere nel flusso.
Jammer

Inoltre, -è una specie di modo standard in GNU / Linux per specificare STDIN quando è previsto un nome di file. Non è universale, ma è piuttosto comune.
Rich Remer

Consultando il manuale vediamo che dovrebbe essere solo - e non @ -
user3504575

8

Ha avuto un problema simile. Durante il caricamento del file csv dal Mac al cloud storage, le nuove righe venivano rimosse. Dopo averlo scaricato, l'intero file sembrava una singola riga. Ho provato ad aggiungere diversi caratteri EOL '\ n' '\ r' '\ r \ n' senza successo. L'uso di "--data-binary" invece di "-d" ha risolto il problema. Btw questo problema si è verificato solo da Mac. '-d' ha funzionato perfettamente durante la chiamata dalla macchina CentOS. Questo sembra molto dovuto al carattere di nuova riga del Mac. Ma non ho più voglia di eseguire il debug.

Grazie mille per il vostro aiuto.

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"

Molte grazie ! Questo non è correlato al tuo Mac: stavo avendo lo stesso identico problema su Linux e l'utilizzo --data-binary @ha risolto il mio problema (inviando un file .ics su più righe a un server CalDAV).
M-Jack

7

(Sono finito qui con una domanda leggermente diversa, quindi pubblicherò la mia risposta perché potrebbe aiutare i futuri esploratori)

La mia soluzione si applica alle persone che inviano dati in stile modulo, ovvero coppie chiave / valore in una stringa di query. Usa l'interruzione di riga codificata, che è %0A, proprio come lo spazio codificato %20. Puoi utilizzare http://meyerweb.com/eric/tools/dencoder/ per convertire altri simboli.

Quindi, se vuoi impostare la chiave messagesul valore:

line one
another

invieresti

curl --data "message=line%20one%0Aanother" http://localhost:8000/hello

1
commento minore (forse errore di battitura) per un carattere di interruzione di riga / ritorno a capo dovrebbe essere% 0A anziché% A0
Paul

3

Non una risposta alla tua domanda, ma ci aggirerei creando un file temporaneo contenente il messaggio e l'interruzione di riga e darei a curl quel file su cui lavorare:

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

Dal manuale :

Se inizi i dati con la lettera @, il resto dovrebbe essere un nome di file da cui leggere i dati, o - se vuoi che curl legga i dati da stdin. Il contenuto del file deve essere già codificato in URL. È inoltre possibile specificare più file. L'invio di dati da un file denominato "foobar" verrebbe quindi eseguito con --data @foobar.


L'utilizzo di file temporanei è un approccio pratico. Secondo la risposta di Szocske, --data-binaryè un'alternativa più fedele a -d, poiché invierà i dati alla lettera.
William Denniss

7
-1; L'utilizzo di un file temporaneo con -d @/path/to/temp/file.txtNON risolve il problema dell'interruzione di riga. --data-binaryfa, vedi sopra.
Frank Olschewski

Se stai vedendo questo perché ti stai chiedendo perché i tuoi comandi curl non funzionano dopo l'aggiornamento di curl o l'aggiornamento a Windows 10, assicurati di aggiungere virgolette attorno al riferimento del file. Ad esempio: curl -X PUT -d "@ message.txt" localhost: 8000 / hello I miei script di ricostruzione elasticsearch avevano smesso di funzionare.
joezen777

3

Un modo molto semplice, basta premere Maiusc-Invio nella console per la pausa. Molto leggibile anche digitandolo.

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

Server gets this: line1\nline2

Fai questo per rimuovere l'interruzione di riga:

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

Server gets this: line1 line2

-2

Stavo usando Sendgrid con questo codice (copiato sotto) originariamente trovato qui https://sendgrid.com/docs/API_Reference/Web_API_v3/index.html

\n\nfunzionava in Gmail, ma è \nstato ignorato. Ho provato a raddoppiare la fuga e altri suggerimenti. Ho anche provato \r\ne anche questo non ha funzionato in Gmail. Nota: non mi sono preoccupato di testare altri client di posta elettronica, forse era un problema specifico di Gmail.

    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": "your.email@example.com"}]}],"from": {"email": "example@example.com"},"subject": "Hello, World!","content": [{"type": "text/plain", "value": "Heya!"}]}'

Alla fine ho rinunciato a cercare una soluzione e ho cambiato i tag text/plaina text/htmle ho usato <br />.

Qualcuno ha suggerito che Sendgrid converta il testo in chiaro in HTML se hai un pixel di tracciamento abilitato, il che ha senso. Forse le nuove righe sono state distrutte nel processo di conversione da testo semplice a HTML. Presumo che il cliente desideri un pixel di tracciamento, quindi ha deciso di passare all'HTML.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.